Skip to content

Commit 6d5b492

Browse files
committed
Fix legalization of G_UMULO, G_SMULO still doesn't work.
1 parent b165d7b commit 6d5b492

File tree

5 files changed

+74
-15
lines changed

5 files changed

+74
-15
lines changed

llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,11 @@ MachineInstrBuilder CSEMIRBuilder::buildInstr(unsigned Opc,
185185
case TargetOpcode::G_UDIV:
186186
case TargetOpcode::G_SDIV:
187187
case TargetOpcode::G_UREM:
188-
case TargetOpcode::G_SREM: {
188+
case TargetOpcode::G_SREM:
189+
case TargetOpcode::G_SMIN:
190+
case TargetOpcode::G_SMAX:
191+
case TargetOpcode::G_UMIN:
192+
case TargetOpcode::G_UMAX: {
189193
// Try to constant fold these.
190194
assert(SrcOps.size() == 2 && "Invalid sources");
191195
assert(DstOps.size() == 1 && "Invalid dsts");

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3444,7 +3444,6 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT LowerHintTy) {
34443444
Observer.changedInstr(MI);
34453445

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

34493448
// Move insert point forward so we can use the Res register if needed.
34503449
MIRBuilder.setInsertPt(MIRBuilder.getMBB(), ++MIRBuilder.getInsertPt());
@@ -3456,6 +3455,7 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT LowerHintTy) {
34563455
auto Shifted = MIRBuilder.buildAShr(Ty, Res, ShiftAmt);
34573456
MIRBuilder.buildICmp(CmpInst::ICMP_NE, Overflow, HiPart, Shifted);
34583457
} else {
3458+
auto Zero = MIRBuilder.buildConstant(Ty, 0);
34593459
MIRBuilder.buildICmp(CmpInst::ICMP_NE, Overflow, HiPart, Zero);
34603460
}
34613461
return Legalized;

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -526,21 +526,29 @@ Optional<APInt> llvm::ConstantFoldBinOp(unsigned Opcode, const Register Op1,
526526
case TargetOpcode::G_XOR:
527527
return C1 ^ C2;
528528
case TargetOpcode::G_UDIV:
529-
if (!C2.getBoolValue())
529+
if (C2.isZero())
530530
break;
531531
return C1.udiv(C2);
532532
case TargetOpcode::G_SDIV:
533-
if (!C2.getBoolValue())
533+
if (C2.isZero())
534534
break;
535535
return C1.sdiv(C2);
536536
case TargetOpcode::G_UREM:
537-
if (!C2.getBoolValue())
537+
if (C2.isZero())
538538
break;
539539
return C1.urem(C2);
540540
case TargetOpcode::G_SREM:
541-
if (!C2.getBoolValue())
541+
if (C2.isZero())
542542
break;
543543
return C1.srem(C2);
544+
case TargetOpcode::G_SMIN:
545+
return APIntOps::smin(C1, C2);
546+
case TargetOpcode::G_SMAX:
547+
return APIntOps::smax(C1, C2);
548+
case TargetOpcode::G_UMIN:
549+
return APIntOps::umin(C1, C2);
550+
case TargetOpcode::G_UMAX:
551+
return APIntOps::umax(C1, C2);
544552
}
545553

546554
return None;

llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.cpp

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
135135
.clampScalar(1, s8, s8)
136136
.clampScalar(0, s8, s64);
137137

138-
getActionDefinitionsBuilder({G_FSHL, G_FSHR, G_MEMCPY, G_MEMMOVE, G_MEMSET})
138+
getActionDefinitionsBuilder(
139+
{G_FSHL, G_FSHR, G_UMULO, G_MEMCPY, G_MEMMOVE, G_MEMSET})
139140
.custom();
140141

141142
getActionDefinitionsBuilder({G_INTRINSIC_TRUNC,
@@ -179,8 +180,6 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
179180
getActionDefinitionsBuilder(G_INTRINSIC_LRINT)
180181
.libcallFor({{s32, s32}, {s32, s64}});
181182

182-
getActionDefinitionsBuilder(G_FPOWI).lower();
183-
184183
getActionDefinitionsBuilder(G_FCOPYSIGN)
185184
.libcallFor({{s32, s32}, {s64, s64}});
186185

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

228-
getActionDefinitionsBuilder({G_ABS, G_DYN_STACKALLOC, G_SEXT_INREG,
229-
G_CTLZ_ZERO_UNDEF, G_CTTZ_ZERO_UNDEF,
230-
G_CTLZ, G_CTTZ, G_BSWAP,
231-
G_SMULO, G_UMULO, G_SMULH, G_UMULH,
232-
G_SMIN, G_SMAX, G_UMIN, G_UMAX,
233-
G_UADDSAT, G_SADDSAT, G_USUBSAT, G_SSUBSAT})
227+
getActionDefinitionsBuilder({G_ABS,
228+
G_DYN_STACKALLOC,
229+
G_SEXT_INREG,
230+
G_CTLZ_ZERO_UNDEF,
231+
G_CTTZ_ZERO_UNDEF,
232+
G_CTLZ,
233+
G_CTTZ,
234+
G_BSWAP,
235+
G_SMULO,
236+
G_SMULH,
237+
G_UMULH,
238+
G_SMIN,
239+
G_SMAX,
240+
G_UMIN,
241+
G_UMAX,
242+
G_UADDSAT,
243+
G_SADDSAT,
244+
G_USUBSAT,
245+
G_SSUBSAT,
246+
G_FPOWI})
234247
.lower();
235248

236249
getActionDefinitionsBuilder(G_CTPOP)
@@ -276,6 +289,8 @@ LegalizerHelper::LegalizeResult Z80LegalizerInfo::legalizeCustomMaybeLegal(
276289
case G_ICMP:
277290
case G_FCMP:
278291
return legalizeCompare(Helper, MI);
292+
case G_UMULO:
293+
return legalizeMultiplyWithOverflow(Helper, MI);
279294
case G_MEMCPY:
280295
case G_MEMMOVE:
281296
case G_MEMSET:
@@ -554,6 +569,36 @@ Z80LegalizerInfo::legalizeCompare(LegalizerHelper &Helper,
554569
return LegalizerHelper::Legalized;
555570
}
556571

572+
LegalizerHelper::LegalizeResult
573+
Z80LegalizerInfo::legalizeMultiplyWithOverflow(LegalizerHelper &Helper,
574+
MachineInstr &MI) const {
575+
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
576+
MIRBuilder.setInstrAndDebugLoc(MI);
577+
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
578+
579+
assert(MI.getOpcode() == G_UMULO && "Unexpected opcode");
580+
581+
Register MulReg = MI.getOperand(0).getReg();
582+
Register OverflowReg = MI.getOperand(1).getReg();
583+
LLT Ty = MRI.getType(MulReg);
584+
585+
Register LHSReg = MI.getOperand(2).getReg();
586+
Register RHSReg = MI.getOperand(3).getReg();
587+
588+
MIRBuilder.buildMul(MulReg, LHSReg, RHSReg);
589+
590+
auto One = MIRBuilder.buildConstant(Ty, 1);
591+
auto Max =
592+
MIRBuilder.buildConstant(Ty, APInt::getMaxValue(Ty.getSizeInBits()));
593+
MIRBuilder.buildICmp(
594+
CmpInst::ICMP_UGT, OverflowReg, LHSReg,
595+
MIRBuilder.buildInstr(G_UDIV, {Ty},
596+
{Max, MIRBuilder.buildUMax(Ty, RHSReg, One)}));
597+
598+
MI.eraseFromParent();
599+
return LegalizerHelper::Legalized;
600+
}
601+
557602
LegalizerHelper::LegalizeResult Z80LegalizerInfo::legalizeMemIntrinsic(
558603
LegalizerHelper &Helper, MachineInstr &MI,
559604
LostDebugLocObserver &LocObserver) const {

llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class Z80LegalizerInfo : public LegalizerInfo {
5959
LegalizerHelper::LegalizeResult legalizeCompare(LegalizerHelper &Helper,
6060
MachineInstr &MI) const;
6161
LegalizerHelper::LegalizeResult
62+
legalizeMultiplyWithOverflow(LegalizerHelper &Helper, MachineInstr &MI) const;
63+
LegalizerHelper::LegalizeResult
6264
legalizeMemIntrinsic(LegalizerHelper &Helper, MachineInstr &MI,
6365
LostDebugLocObserver &LocObserver) const;
6466
};

0 commit comments

Comments
 (0)