Skip to content

Commit a78f5c0

Browse files
authored
[IndVars] Use IRBuilder in eliminateTrunc [nfc-ish] (#70836)
Mostly a cleanup so that we don't need to manually emit instructions, and can eagerly constant fold where relevant.
1 parent 5bfd89b commit a78f5c0

File tree

3 files changed

+11
-15
lines changed

3 files changed

+11
-15
lines changed

llvm/lib/Transforms/Utils/SimplifyIndVar.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,8 @@ bool SimplifyIndvar::eliminateTrunc(TruncInst *TI) {
539539
for (auto *ICI : ICmpUsers) {
540540
bool IsSwapped = L->isLoopInvariant(ICI->getOperand(0));
541541
auto *Op1 = IsSwapped ? ICI->getOperand(0) : ICI->getOperand(1);
542-
Instruction *Ext = nullptr;
542+
IRBuilder<> Builder(ICI);
543+
Value *Ext = nullptr;
543544
// For signed/unsigned predicate, replace the old comparison with comparison
544545
// of immediate IV against sext/zext of the invariant argument. If we can
545546
// use either sext or zext (i.e. we are dealing with equality predicate),
@@ -550,18 +551,18 @@ bool SimplifyIndvar::eliminateTrunc(TruncInst *TI) {
550551
if (IsSwapped) Pred = ICmpInst::getSwappedPredicate(Pred);
551552
if (CanUseZExt(ICI)) {
552553
assert(DoesZExtCollapse && "Unprofitable zext?");
553-
Ext = new ZExtInst(Op1, IVTy, "zext", ICI);
554+
Ext = Builder.CreateZExt(Op1, IVTy, "zext");
554555
Pred = ICmpInst::getUnsignedPredicate(Pred);
555556
} else {
556557
assert(DoesSExtCollapse && "Unprofitable sext?");
557-
Ext = new SExtInst(Op1, IVTy, "sext", ICI);
558+
Ext = Builder.CreateSExt(Op1, IVTy, "sext");
558559
assert(Pred == ICmpInst::getSignedPredicate(Pred) && "Must be signed!");
559560
}
560561
bool Changed;
561562
L->makeLoopInvariant(Ext, Changed);
562563
(void)Changed;
563-
ICmpInst *NewICI = new ICmpInst(ICI, Pred, IV, Ext);
564-
ICI->replaceAllUsesWith(NewICI);
564+
auto *NewCmp = Builder.CreateICmp(Pred, IV, Ext);
565+
ICI->replaceAllUsesWith(NewCmp);
565566
DeadInsts.emplace_back(ICI);
566567
}
567568

llvm/test/Transforms/IndVarSimplify/X86/eliminate-trunc.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -572,12 +572,11 @@ define void @test_13a(i32 %n) {
572572
;
573573
; CHECK-LABEL: @test_13a(
574574
; CHECK-NEXT: entry:
575-
; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 1024 to i64
576575
; CHECK-NEXT: br label [[LOOP:%.*]]
577576
; CHECK: loop:
578577
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
579578
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 2
580-
; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i64 [[IV]], [[ZEXT]]
579+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i64 [[IV]], 1024
581580
; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT:%.*]]
582581
; CHECK: exit:
583582
; CHECK-NEXT: ret void
@@ -598,12 +597,11 @@ define void @test_13b(i32 %n) {
598597
;
599598
; CHECK-LABEL: @test_13b(
600599
; CHECK-NEXT: entry:
601-
; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 1024 to i64
602600
; CHECK-NEXT: br label [[LOOP:%.*]]
603601
; CHECK: loop:
604602
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
605603
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 2
606-
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i64 [[IV]], [[ZEXT]]
604+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i64 [[IV]], 1024
607605
; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT:%.*]]
608606
; CHECK: exit:
609607
; CHECK-NEXT: ret void
@@ -624,12 +622,11 @@ define void @test_13c(i32 %n) {
624622
;
625623
; CHECK-LABEL: @test_13c(
626624
; CHECK-NEXT: entry:
627-
; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 1024 to i64
628625
; CHECK-NEXT: br label [[LOOP:%.*]]
629626
; CHECK: loop:
630627
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
631628
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 2
632-
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i64 [[IV]], [[ZEXT]]
629+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i64 [[IV]], 1024
633630
; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT:%.*]]
634631
; CHECK: exit:
635632
; CHECK-NEXT: ret void
@@ -650,12 +647,11 @@ define void @test_13d(i32 %n) {
650647
;
651648
; CHECK-LABEL: @test_13d(
652649
; CHECK-NEXT: entry:
653-
; CHECK-NEXT: [[SEXT:%.*]] = sext i32 1024 to i64
654650
; CHECK-NEXT: br label [[LOOP:%.*]]
655651
; CHECK: loop:
656652
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ -20, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
657653
; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 2
658-
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i64 [[IV]], [[SEXT]]
654+
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i64 [[IV]], 1024
659655
; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT:%.*]]
660656
; CHECK: exit:
661657
; CHECK-NEXT: ret void

llvm/test/Transforms/IndVarSimplify/ada-loops.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@ define void @kinds__sbytezero(ptr nocapture %a) nounwind {
2222
; CHECK-NEXT: bb.thread:
2323
; CHECK-NEXT: [[TMP46:%.*]] = getelementptr [256 x i32], ptr [[A]], i32 0, i32 0
2424
; CHECK-NEXT: store i32 0, ptr [[TMP46]], align 4
25-
; CHECK-NEXT: [[SEXT:%.*]] = sext i8 127 to i32
2625
; CHECK-NEXT: br label [[BB:%.*]]
2726
; CHECK: bb:
2827
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i32 [ [[INDVARS_IV_NEXT:%.*]], [[BB]] ], [ -128, [[BB_THREAD:%.*]] ]
2928
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i32 [[INDVARS_IV]], 1
3029
; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[INDVARS_IV_NEXT]], 128
3130
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr [256 x i32], ptr [[A]], i32 0, i32 [[TMP3]]
3231
; CHECK-NEXT: store i32 0, ptr [[TMP4]], align 4
33-
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDVARS_IV_NEXT]], [[SEXT]]
32+
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDVARS_IV_NEXT]], 127
3433
; CHECK-NEXT: br i1 [[TMP0]], label [[RETURN:%.*]], label [[BB]]
3534
; CHECK: return:
3635
; CHECK-NEXT: ret void

0 commit comments

Comments
 (0)