Skip to content

Commit 9788b82

Browse files
committed
Add nuw flag when possible
1 parent c817b4f commit 9788b82

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,15 @@ static bool processEqualityICmp(ICmpInst *Cmp, LazyValueInfo *LVI) {
310310
if ((*RHSC)[0] == ShouldBeOdd) {
311311
IRBuilder<> B{Cmp};
312312
Value *Trunc = B.CreateTrunc(Op0, Cmp->getType());
313+
if (auto *I = dyn_cast<TruncInst>(Trunc)) {
314+
// if Range == [0, 1], i.e. the value is already valid boolean
315+
if (Range.getLower() == 0)
316+
I->setHasNoUnsignedWrap(true);
317+
// if Range == [-1, 0]
318+
if (Range.getUpper() == 1)
319+
I->setHasNoSignedWrap(true);
320+
}
321+
313322
Cmp->replaceAllUsesWith(Trunc);
314323
Cmp->eraseFromParent();
315324
return true;

llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ define void @test_cmp_phi(i8 %a) {
614614
; CHECK-NEXT: br i1 [[C0]], label [[LOOP:%.*]], label [[EXIT:%.*]]
615615
; CHECK: loop:
616616
; CHECK-NEXT: [[P:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B:%.*]], [[LOOP]] ]
617-
; CHECK-NEXT: [[TMP0:%.*]] = trunc i8 [[P]] to i1
617+
; CHECK-NEXT: [[TMP0:%.*]] = trunc nuw i8 [[P]] to i1
618618
; CHECK-NEXT: [[C4:%.*]] = call i1 @get_bool()
619619
; CHECK-NEXT: [[B]] = zext i1 [[C4]] to i8
620620
; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP]], label [[EXIT]]
@@ -1484,7 +1484,7 @@ define i1 @test_icmp_eq_on_valid_bool_range(i8 %x) {
14841484
; CHECK-NEXT: [[TMP2:%.*]] = tail call i1 @get_bool()
14851485
; CHECK-NEXT: br label [[BB3:%.*]]
14861486
; CHECK: bb1:
1487-
; CHECK-NEXT: [[TMP3:%.*]] = trunc i8 [[X]] to i1
1487+
; CHECK-NEXT: [[TMP3:%.*]] = trunc nuw i8 [[X]] to i1
14881488
; CHECK-NEXT: br label [[BB3]]
14891489
; CHECK: bb3:
14901490
; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ [[TMP3]], [[BB1]] ], [ [[TMP2]], [[BB2]] ]
@@ -1514,7 +1514,7 @@ define i1 @test_icmp_ne_on_valid_bool_range(i8 %x) {
15141514
; CHECK-NEXT: [[TMP2:%.*]] = tail call i1 @get_bool()
15151515
; CHECK-NEXT: br label [[BB3:%.*]]
15161516
; CHECK: bb1:
1517-
; CHECK-NEXT: [[TMP3:%.*]] = trunc i8 [[X]] to i1
1517+
; CHECK-NEXT: [[TMP3:%.*]] = trunc nuw i8 [[X]] to i1
15181518
; CHECK-NEXT: br label [[BB3]]
15191519
; CHECK: bb3:
15201520
; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ [[TMP3]], [[BB1]] ], [ [[TMP2]], [[BB2]] ]
@@ -1580,7 +1580,7 @@ define i1 @test_icmp_ne_on_nsw(i8 %x) {
15801580
; CHECK-NEXT: [[TMP4:%.*]] = tail call i1 @get_bool()
15811581
; CHECK-NEXT: br label [[BB3:%.*]]
15821582
; CHECK: bb1:
1583-
; CHECK-NEXT: [[TMP5:%.*]] = trunc i8 [[X]] to i1
1583+
; CHECK-NEXT: [[TMP5:%.*]] = trunc nsw i8 [[X]] to i1
15841584
; CHECK-NEXT: br label [[BB3]]
15851585
; CHECK: bb3:
15861586
; CHECK-NEXT: [[TMP6:%.*]] = phi i1 [ [[TMP5]], [[BB1]] ], [ [[TMP4]], [[BB2]] ]

llvm/test/Transforms/JumpThreading/pr33917.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ define void @patatino() personality ptr @rust_eh_personality {
2323
; CHECK: good:
2424
; CHECK-NEXT: [[T11:%.*]] = icmp ne ptr [[T9]], null
2525
; CHECK-NEXT: [[T12:%.*]] = zext i1 [[T11]] to i64
26-
; CHECK-NEXT: [[TMP0:%.*]] = trunc i64 [[T12]] to i1
26+
; CHECK-NEXT: [[TMP0:%.*]] = trunc nuw i64 [[T12]] to i1
2727
; CHECK-NEXT: br i1 [[TMP0]], label [[IF_TRUE:%.*]], label [[DONE:%.*]]
2828
; CHECK: if_true:
2929
; CHECK-NEXT: call void @llvm.assume(i1 [[T11]])

0 commit comments

Comments
 (0)