Skip to content

Commit b523352

Browse files
committed
for the case of overflow.no, multiply the low parts of LHS and RHS
Change-Id: Ib0619bde982a8d2a5eba889e12c9412705afebee
1 parent e96ab26 commit b523352

File tree

4 files changed

+20
-38
lines changed

4 files changed

+20
-38
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6473,7 +6473,9 @@ bool CodeGenPrepare::optimizeUMulWithOverflow(Instruction *I) {
64736473
//------------------------------------------------------------------------------
64746474
// BB overflow.no:
64756475
Builder.SetInsertPoint(NoOverflowBB);
6476-
auto *Mul = Builder.CreateMul(LHS, RHS, "mul.no.overflow");
6476+
auto *ExtLoLHS = Builder.CreateZExt(LoLHS, Ty, "lo.lhs.ext");
6477+
auto *ExtLoRHS = Builder.CreateZExt(LoRHS, Ty, "lo.rhs.ext");
6478+
auto *Mul = Builder.CreateMul(ExtLoLHS, ExtLoRHS, "mul.no.overflow");
64776479
StructType *STy = StructType::get(I->getContext(),
64786480
{Ty, IntegerType::getInt1Ty(I->getContext())});
64796481
Value *StructValNoOverflow = PoisonValue::get(STy);
@@ -6571,7 +6573,9 @@ bool CodeGenPrepare::optimizeSMulWithOverflow(Instruction *I) {
65716573
//------------------------------------------------------------------------------
65726574
// BB overflow.no:
65736575
Builder.SetInsertPoint(NoOverflowBB);
6574-
auto *Mul = Builder.CreateMul(LHS, RHS, "mul.no.overflow");
6576+
auto *ExtLoLHS = Builder.CreateSExt(LoLHS, Ty, "lo.lhs.ext");
6577+
auto *ExtLoRHS = Builder.CreateSExt(LoRHS, Ty, "lo.rhs.ext");
6578+
auto *Mul = Builder.CreateMul(ExtLoLHS, ExtLoRHS, "mul.no.overflow");
65756579
StructType * STy = StructType::get(I->getContext(),
65766580
{Ty, IntegerType::getInt1Ty(I->getContext())});
65776581
Value *StructValNoOverflow = PoisonValue::get(STy);

llvm/test/CodeGen/AArch64/i128-math.ll

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,8 @@ define { i128, i8 } @u128_checked_mul(i128 %x, i128 %y) {
280280
; CHECK-NEXT: csinc w8, w8, wzr, lo
281281
; CHECK-NEXT: b .LBB17_3
282282
; CHECK-NEXT: .LBB17_2: // %overflow.no
283-
; CHECK-NEXT: umulh x8, x0, x2
284-
; CHECK-NEXT: madd x8, x0, x3, x8
283+
; CHECK-NEXT: umulh x1, x0, x2
285284
; CHECK-NEXT: mul x0, x0, x2
286-
; CHECK-NEXT: madd x1, x1, x2, x8
287-
; CHECK-NEXT: mov w8, wzr
288285
; CHECK-NEXT: .LBB17_3: // %overflow.res
289286
; CHECK-NEXT: mov w9, #1 // =0x1
290287
; CHECK-NEXT: bic w2, w9, w8
@@ -321,11 +318,9 @@ define { i128, i8 } @u128_overflowing_mul(i128 %x, i128 %y) {
321318
; CHECK-NEXT: and w2, w8, #0x1
322319
; CHECK-NEXT: ret
323320
; CHECK-NEXT: .LBB18_2: // %overflow.no
324-
; CHECK-NEXT: umulh x8, x0, x2
325-
; CHECK-NEXT: madd x8, x0, x3, x8
321+
; CHECK-NEXT: umulh x1, x0, x2
326322
; CHECK-NEXT: mul x0, x0, x2
327-
; CHECK-NEXT: madd x1, x1, x2, x8
328-
; CHECK-NEXT: and w2, wzr, #0x1
323+
; CHECK-NEXT: and w2, w8, #0x1
329324
; CHECK-NEXT: ret
330325
%1 = tail call { i128, i1 } @llvm.umul.with.overflow.i128(i128 %x, i128 %y)
331326
%2 = extractvalue { i128, i1 } %1, 0
@@ -357,10 +352,8 @@ define i128 @u128_saturating_mul(i128 %x, i128 %y) {
357352
; CHECK-NEXT: csinc w10, w10, wzr, lo
358353
; CHECK-NEXT: b .LBB19_3
359354
; CHECK-NEXT: .LBB19_2: // %overflow.no
360-
; CHECK-NEXT: umulh x8, x0, x2
355+
; CHECK-NEXT: umulh x9, x0, x2
361356
; CHECK-NEXT: mov w10, wzr
362-
; CHECK-NEXT: madd x8, x0, x3, x8
363-
; CHECK-NEXT: madd x9, x1, x2, x8
364357
; CHECK-NEXT: mul x8, x0, x2
365358
; CHECK-NEXT: .LBB19_3: // %overflow.res
366359
; CHECK-NEXT: tst w10, #0x1
@@ -396,11 +389,9 @@ define { i128, i8 } @i128_checked_mul(i128 %x, i128 %y) {
396389
; CHECK-NEXT: cmp x3, x8
397390
; CHECK-NEXT: b.ne .LBB21_3
398391
; CHECK-NEXT: // %bb.2: // %overflow.no
399-
; CHECK-NEXT: umulh x8, x0, x2
400-
; CHECK-NEXT: madd x8, x0, x3, x8
401-
; CHECK-NEXT: mul x0, x0, x2
402-
; CHECK-NEXT: madd x1, x1, x2, x8
392+
; CHECK-NEXT: smulh x1, x0, x2
403393
; CHECK-NEXT: mov w8, wzr
394+
; CHECK-NEXT: mul x0, x0, x2
404395
; CHECK-NEXT: b .LBB21_4
405396
; CHECK-NEXT: .LBB21_3: // %overflow
406397
; CHECK-NEXT: asr x9, x1, #63
@@ -454,10 +445,8 @@ define { i128, i8 } @i128_overflowing_mul(i128 %x, i128 %y) {
454445
; CHECK-NEXT: cmp x3, x8
455446
; CHECK-NEXT: b.ne .LBB22_3
456447
; CHECK-NEXT: // %bb.2: // %overflow.no
457-
; CHECK-NEXT: umulh x8, x0, x2
458-
; CHECK-NEXT: madd x8, x0, x3, x8
448+
; CHECK-NEXT: smulh x1, x0, x2
459449
; CHECK-NEXT: mul x0, x0, x2
460-
; CHECK-NEXT: madd x1, x1, x2, x8
461450
; CHECK-NEXT: and w2, wzr, #0x1
462451
; CHECK-NEXT: ret
463452
; CHECK-NEXT: .LBB22_3: // %overflow
@@ -509,11 +498,9 @@ define i128 @i128_saturating_mul(i128 %x, i128 %y) {
509498
; CHECK-NEXT: cmp x3, x8
510499
; CHECK-NEXT: b.ne .LBB23_3
511500
; CHECK-NEXT: // %bb.2: // %overflow.no
512-
; CHECK-NEXT: umulh x8, x0, x2
501+
; CHECK-NEXT: smulh x8, x0, x2
513502
; CHECK-NEXT: mov w10, wzr
514503
; CHECK-NEXT: mul x9, x0, x2
515-
; CHECK-NEXT: madd x8, x0, x3, x8
516-
; CHECK-NEXT: madd x8, x1, x2, x8
517504
; CHECK-NEXT: b .LBB23_4
518505
; CHECK-NEXT: .LBB23_3: // %overflow
519506
; CHECK-NEXT: asr x9, x1, #63

llvm/test/CodeGen/AArch64/i128_with_overflow.ll

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -243,11 +243,8 @@ define i128 @test_umul_i128(i128 noundef %x, i128 noundef %y) {
243243
; CHECK-NEXT: tbnz w8, #0, .LBB4_3
244244
; CHECK-NEXT: b .LBB4_4
245245
; CHECK-NEXT: .LBB4_2: // %overflow.no
246-
; CHECK-NEXT: umulh x8, x0, x2
247-
; CHECK-NEXT: madd x8, x0, x3, x8
246+
; CHECK-NEXT: umulh x1, x0, x2
248247
; CHECK-NEXT: mul x0, x0, x2
249-
; CHECK-NEXT: madd x1, x1, x2, x8
250-
; CHECK-NEXT: mov w8, wzr
251248
; CHECK-NEXT: tbz w8, #0, .LBB4_4
252249
; CHECK-NEXT: .LBB4_3: // %if.then
253250
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
@@ -289,11 +286,9 @@ define i128 @test_smul_i128(i128 noundef %x, i128 noundef %y) {
289286
; CHECK-NEXT: cmp x3, x8
290287
; CHECK-NEXT: b.ne .LBB5_3
291288
; CHECK-NEXT: // %bb.2: // %overflow.no
292-
; CHECK-NEXT: umulh x8, x0, x2
293-
; CHECK-NEXT: madd x8, x0, x3, x8
294-
; CHECK-NEXT: mul x0, x0, x2
295-
; CHECK-NEXT: madd x1, x1, x2, x8
289+
; CHECK-NEXT: smulh x1, x0, x2
296290
; CHECK-NEXT: mov w8, wzr
291+
; CHECK-NEXT: mul x0, x0, x2
297292
; CHECK-NEXT: tbnz w8, #0, .LBB5_4
298293
; CHECK-NEXT: b .LBB5_5
299294
; CHECK-NEXT: .LBB5_3: // %overflow

llvm/test/CodeGen/AArch64/umulo-128-legalisation-lowering.ll

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@ define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
2323
; AARCH-NEXT: and w2, w8, #0x1
2424
; AARCH-NEXT: ret
2525
; AARCH-NEXT: .LBB0_2: // %overflow.no
26-
; AARCH-NEXT: umulh x8, x0, x2
27-
; AARCH-NEXT: madd x8, x0, x3, x8
26+
; AARCH-NEXT: umulh x1, x0, x2
2827
; AARCH-NEXT: mul x0, x0, x2
29-
; AARCH-NEXT: madd x1, x1, x2, x8
30-
; AARCH-NEXT: and w2, wzr, #0x1
28+
; AARCH-NEXT: and w2, w8, #0x1
3129
; AARCH-NEXT: ret
3230
start:
3331
%0 = tail call { i128, i1 } @llvm.umul.with.overflow.i128(i128 %l, i128 %r) #2
@@ -54,11 +52,9 @@ define i128 @__muloti4(i128 %0, i128 %1, ptr nocapture nonnull writeonly align 4
5452
; AARCH-NEXT: cmp x3, x8
5553
; AARCH-NEXT: b.ne .LBB1_3
5654
; AARCH-NEXT: // %bb.2: // %overflow.no
57-
; AARCH-NEXT: umulh x8, x0, x2
55+
; AARCH-NEXT: smulh x8, x0, x2
5856
; AARCH-NEXT: mov w9, wzr
59-
; AARCH-NEXT: madd x8, x0, x3, x8
6057
; AARCH-NEXT: mul x0, x0, x2
61-
; AARCH-NEXT: madd x8, x1, x2, x8
6258
; AARCH-NEXT: tbnz x1, #63, .LBB1_4
6359
; AARCH-NEXT: b .LBB1_5
6460
; AARCH-NEXT: .LBB1_3: // %overflow

0 commit comments

Comments
 (0)