[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