[PATCH] D85971: [IndVarSimplify] Fix Modified status for removal of overflow intrinsics

David Stenberg via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 14 06:25:30 PDT 2020


dstenb created this revision.
dstenb added reviewers: reames, sanjoy.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
dstenb requested review of this revision.

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 <https://reviews.llvm.org/D80916>.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85971

Files:
  llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
  llvm/test/Transforms/IndVarSimplify/eliminate-overflow-modified.ll


Index: llvm/test/Transforms/IndVarSimplify/eliminate-overflow-modified.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/IndVarSimplify/eliminate-overflow-modified.ll
@@ -0,0 +1,45 @@
+; RUN: opt < %s -indvars -S -o - | FileCheck %s
+
+; When eliminating the overflow intrinsic the indvars pass would incorrectly
+; return a false Modified status.
+
+; 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"}
Index: llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
+++ llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
@@ -477,6 +477,7 @@
   if (WO->use_empty())
     WO->eraseFromParent();
 
+  Changed = true;
   return true;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D85971.285640.patch
Type: text/x-patch
Size: 2055 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200814/2c8714f3/attachment.bin>


More information about the llvm-commits mailing list