[llvm] e6f332e - [IndVarSimplify] Fix Modified status for removal of overflow intrinsics
David Stenberg via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 29 04:21:50 PDT 2020
Author: David Stenberg
Date: 2020-09-29T13:20:59+02:00
New Revision: e6f332ef1e414ec41a188217d7547a371ed975de
URL: https://github.com/llvm/llvm-project/commit/e6f332ef1e414ec41a188217d7547a371ed975de
DIFF: https://github.com/llvm/llvm-project/commit/e6f332ef1e414ec41a188217d7547a371ed975de.diff
LOG: [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
Added:
llvm/test/Transforms/IndVarSimplify/eliminate-overflow-modified.ll
Modified:
llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
index d3d0c3341908..2d71b0fff889 100644
--- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
@@ -477,6 +477,7 @@ bool SimplifyIndvar::eliminateOverflowIntrinsic(WithOverflowInst *WO) {
if (WO->use_empty())
WO->eraseFromParent();
+ Changed = true;
return true;
}
diff --git a/llvm/test/Transforms/IndVarSimplify/eliminate-overflow-modified.ll b/llvm/test/Transforms/IndVarSimplify/eliminate-overflow-modified.ll
new file mode 100644
index 000000000000..c3aea2621eb9
--- /dev/null
+++ b/llvm/test/Transforms/IndVarSimplify/eliminate-overflow-modified.ll
@@ -0,0 +1,46 @@
+; RUN: opt < %s -indvars -S -o - | FileCheck %s
+
+; When eliminating the overflow intrinsic the indvars pass would incorrectly
+; return a false Modified status. This was caught by the pass return
+; status check that is hidden under EXPENSIVE_CHECKS.
+
+; CHECK-LABEL: for.body:
+; CHECK-NEXT: %0 = phi i16 [ %1, %for.body ], [ undef, %for.body.preheader ]
+; CHECK-NEXT: %1 = add nsw i16 %0, -1
+; CHECK-NEXT: %cmp = icmp sgt i16 %1, 0
+; CHECK-NEXT: call void @llvm.assume(i1 %cmp)
+
+; Function Attrs: nounwind
+define void @foo() #0 {
+entry:
+ %cmp1 = icmp sgt i16 undef, 0
+ br i1 %cmp1, label %for.body.preheader, label %for.end
+
+for.body.preheader: ; preds = %entry
+ br label %for.body
+
+for.body: ; preds = %for.body.preheader, %for.body
+ %0 = phi i16 [ %2, %for.body ], [ undef, %for.body.preheader ]
+ %1 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %0, i16 -1)
+ %2 = extractvalue { i16, i1 } %1, 0
+ %cmp = icmp sgt i16 %2, 0
+ call void @llvm.assume(i1 %cmp)
+ br label %for.body
+
+for.end: ; preds = %entry
+ ret void
+}
+
+; Function Attrs: nounwind readnone speculatable willreturn
+declare { i16, i1 } @llvm.sadd.with.overflow.i16(i16, i16) #1
+
+; Function Attrs: nounwind willreturn
+declare void @llvm.assume(i1) #2
+
+attributes #0 = { nounwind }
+attributes #1 = { nounwind readnone speculatable willreturn }
+attributes #2 = { nounwind willreturn }
+
+!llvm.ident = !{!0}
+
+!0 = !{!"clang version 12.0.0"}
More information about the llvm-commits
mailing list