Skip to content

Commit e6f332e

Browse files
committed
[IndVarSimplify] Fix Modified status for removal of overflow intrinsics
When removing an overflow intrinsic the Changed status in SimplifyIndvar was not set, leading to the IndVarSimplify pass returning an incorrect status. This was caught using the check introduced by D80916. As pointed out in the code review, a similar bug may exist for eliminateTrunc(). Reviewed By: reames Differential Revision: https://reviews.llvm.org/D85971
1 parent 4aa6abe commit e6f332e

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

llvm/lib/Transforms/Utils/SimplifyIndVar.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ bool SimplifyIndvar::eliminateOverflowIntrinsic(WithOverflowInst *WO) {
477477
if (WO->use_empty())
478478
WO->eraseFromParent();
479479

480+
Changed = true;
480481
return true;
481482
}
482483

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
; RUN: opt < %s -indvars -S -o - | FileCheck %s
2+
3+
; When eliminating the overflow intrinsic the indvars pass would incorrectly
4+
; return a false Modified status. This was caught by the pass return
5+
; status check that is hidden under EXPENSIVE_CHECKS.
6+
7+
; CHECK-LABEL: for.body:
8+
; CHECK-NEXT: %0 = phi i16 [ %1, %for.body ], [ undef, %for.body.preheader ]
9+
; CHECK-NEXT: %1 = add nsw i16 %0, -1
10+
; CHECK-NEXT: %cmp = icmp sgt i16 %1, 0
11+
; CHECK-NEXT: call void @llvm.assume(i1 %cmp)
12+
13+
; Function Attrs: nounwind
14+
define void @foo() #0 {
15+
entry:
16+
%cmp1 = icmp sgt i16 undef, 0
17+
br i1 %cmp1, label %for.body.preheader, label %for.end
18+
19+
for.body.preheader: ; preds = %entry
20+
br label %for.body
21+
22+
for.body: ; preds = %for.body.preheader, %for.body
23+
%0 = phi i16 [ %2, %for.body ], [ undef, %for.body.preheader ]
24+
%1 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %0, i16 -1)
25+
%2 = extractvalue { i16, i1 } %1, 0
26+
%cmp = icmp sgt i16 %2, 0
27+
call void @llvm.assume(i1 %cmp)
28+
br label %for.body
29+
30+
for.end: ; preds = %entry
31+
ret void
32+
}
33+
34+
; Function Attrs: nounwind readnone speculatable willreturn
35+
declare { i16, i1 } @llvm.sadd.with.overflow.i16(i16, i16) #1
36+
37+
; Function Attrs: nounwind willreturn
38+
declare void @llvm.assume(i1) #2
39+
40+
attributes #0 = { nounwind }
41+
attributes #1 = { nounwind readnone speculatable willreturn }
42+
attributes #2 = { nounwind willreturn }
43+
44+
!llvm.ident = !{!0}
45+
46+
!0 = !{!"clang version 12.0.0"}

0 commit comments

Comments
 (0)