Skip to content

Commit

Permalink
Fix legalization of G_UMULO, G_SMULO still doesn't work.
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobly0 committed Mar 13, 2022
1 parent b165d7b commit 6d5b492
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 15 deletions.
6 changes: 5 additions & 1 deletion llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,11 @@ MachineInstrBuilder CSEMIRBuilder::buildInstr(unsigned Opc,
case TargetOpcode::G_UDIV:
case TargetOpcode::G_SDIV:
case TargetOpcode::G_UREM:
case TargetOpcode::G_SREM: {
case TargetOpcode::G_SREM:
case TargetOpcode::G_SMIN:
case TargetOpcode::G_SMAX:
case TargetOpcode::G_UMIN:
case TargetOpcode::G_UMAX: {
// Try to constant fold these.
assert(SrcOps.size() == 2 && "Invalid sources");
assert(DstOps.size() == 1 && "Invalid dsts");
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3444,7 +3444,6 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT LowerHintTy) {
Observer.changedInstr(MI);

auto HiPart = MIRBuilder.buildInstr(Opcode, {Ty}, {LHS, RHS});
auto Zero = MIRBuilder.buildConstant(Ty, 0);

// Move insert point forward so we can use the Res register if needed.
MIRBuilder.setInsertPt(MIRBuilder.getMBB(), ++MIRBuilder.getInsertPt());
Expand All @@ -3456,6 +3455,7 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT LowerHintTy) {
auto Shifted = MIRBuilder.buildAShr(Ty, Res, ShiftAmt);
MIRBuilder.buildICmp(CmpInst::ICMP_NE, Overflow, HiPart, Shifted);
} else {
auto Zero = MIRBuilder.buildConstant(Ty, 0);
MIRBuilder.buildICmp(CmpInst::ICMP_NE, Overflow, HiPart, Zero);
}
return Legalized;
Expand Down
16 changes: 12 additions & 4 deletions llvm/lib/CodeGen/GlobalISel/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -526,21 +526,29 @@ Optional<APInt> llvm::ConstantFoldBinOp(unsigned Opcode, const Register Op1,
case TargetOpcode::G_XOR:
return C1 ^ C2;
case TargetOpcode::G_UDIV:
if (!C2.getBoolValue())
if (C2.isZero())
break;
return C1.udiv(C2);
case TargetOpcode::G_SDIV:
if (!C2.getBoolValue())
if (C2.isZero())
break;
return C1.sdiv(C2);
case TargetOpcode::G_UREM:
if (!C2.getBoolValue())
if (C2.isZero())
break;
return C1.urem(C2);
case TargetOpcode::G_SREM:
if (!C2.getBoolValue())
if (C2.isZero())
break;
return C1.srem(C2);
case TargetOpcode::G_SMIN:
return APIntOps::smin(C1, C2);
case TargetOpcode::G_SMAX:
return APIntOps::smax(C1, C2);
case TargetOpcode::G_UMIN:
return APIntOps::umin(C1, C2);
case TargetOpcode::G_UMAX:
return APIntOps::umax(C1, C2);
}

return None;
Expand Down
63 changes: 54 additions & 9 deletions llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
.clampScalar(1, s8, s8)
.clampScalar(0, s8, s64);

getActionDefinitionsBuilder({G_FSHL, G_FSHR, G_MEMCPY, G_MEMMOVE, G_MEMSET})
getActionDefinitionsBuilder(
{G_FSHL, G_FSHR, G_UMULO, G_MEMCPY, G_MEMMOVE, G_MEMSET})
.custom();

getActionDefinitionsBuilder({G_INTRINSIC_TRUNC,
Expand Down Expand Up @@ -179,8 +180,6 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
getActionDefinitionsBuilder(G_INTRINSIC_LRINT)
.libcallFor({{s32, s32}, {s32, s64}});

getActionDefinitionsBuilder(G_FPOWI).lower();

getActionDefinitionsBuilder(G_FCOPYSIGN)
.libcallFor({{s32, s32}, {s64, s64}});

Expand Down Expand Up @@ -225,12 +224,26 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
.legalForCartesianProduct(LegalTypes, {s1})
.clampScalar(0, s8, sMax);

getActionDefinitionsBuilder({G_ABS, G_DYN_STACKALLOC, G_SEXT_INREG,
G_CTLZ_ZERO_UNDEF, G_CTTZ_ZERO_UNDEF,
G_CTLZ, G_CTTZ, G_BSWAP,
G_SMULO, G_UMULO, G_SMULH, G_UMULH,
G_SMIN, G_SMAX, G_UMIN, G_UMAX,
G_UADDSAT, G_SADDSAT, G_USUBSAT, G_SSUBSAT})
getActionDefinitionsBuilder({G_ABS,
G_DYN_STACKALLOC,
G_SEXT_INREG,
G_CTLZ_ZERO_UNDEF,
G_CTTZ_ZERO_UNDEF,
G_CTLZ,
G_CTTZ,
G_BSWAP,
G_SMULO,
G_SMULH,
G_UMULH,
G_SMIN,
G_SMAX,
G_UMIN,
G_UMAX,
G_UADDSAT,
G_SADDSAT,
G_USUBSAT,
G_SSUBSAT,
G_FPOWI})
.lower();

getActionDefinitionsBuilder(G_CTPOP)
Expand Down Expand Up @@ -276,6 +289,8 @@ LegalizerHelper::LegalizeResult Z80LegalizerInfo::legalizeCustomMaybeLegal(
case G_ICMP:
case G_FCMP:
return legalizeCompare(Helper, MI);
case G_UMULO:
return legalizeMultiplyWithOverflow(Helper, MI);
case G_MEMCPY:
case G_MEMMOVE:
case G_MEMSET:
Expand Down Expand Up @@ -554,6 +569,36 @@ Z80LegalizerInfo::legalizeCompare(LegalizerHelper &Helper,
return LegalizerHelper::Legalized;
}

LegalizerHelper::LegalizeResult
Z80LegalizerInfo::legalizeMultiplyWithOverflow(LegalizerHelper &Helper,
MachineInstr &MI) const {
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
MIRBuilder.setInstrAndDebugLoc(MI);
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();

assert(MI.getOpcode() == G_UMULO && "Unexpected opcode");

Register MulReg = MI.getOperand(0).getReg();
Register OverflowReg = MI.getOperand(1).getReg();
LLT Ty = MRI.getType(MulReg);

Register LHSReg = MI.getOperand(2).getReg();
Register RHSReg = MI.getOperand(3).getReg();

MIRBuilder.buildMul(MulReg, LHSReg, RHSReg);

auto One = MIRBuilder.buildConstant(Ty, 1);
auto Max =
MIRBuilder.buildConstant(Ty, APInt::getMaxValue(Ty.getSizeInBits()));
MIRBuilder.buildICmp(
CmpInst::ICMP_UGT, OverflowReg, LHSReg,
MIRBuilder.buildInstr(G_UDIV, {Ty},
{Max, MIRBuilder.buildUMax(Ty, RHSReg, One)}));

MI.eraseFromParent();
return LegalizerHelper::Legalized;
}

LegalizerHelper::LegalizeResult Z80LegalizerInfo::legalizeMemIntrinsic(
LegalizerHelper &Helper, MachineInstr &MI,
LostDebugLocObserver &LocObserver) const {
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ class Z80LegalizerInfo : public LegalizerInfo {
LegalizerHelper::LegalizeResult legalizeCompare(LegalizerHelper &Helper,
MachineInstr &MI) const;
LegalizerHelper::LegalizeResult
legalizeMultiplyWithOverflow(LegalizerHelper &Helper, MachineInstr &MI) const;
LegalizerHelper::LegalizeResult
legalizeMemIntrinsic(LegalizerHelper &Helper, MachineInstr &MI,
LostDebugLocObserver &LocObserver) const;
};
Expand Down

0 comments on commit 6d5b492

Please sign in to comment.