[PATCH] D87392: [JumpThreading] Fix an incorrect Modified status
David Stenberg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 10 00:27:10 PDT 2020
dstenb updated this revision to Diff 290894.
dstenb edited the summary of this revision.
dstenb added a comment.
Continue using a bool return instead of a tri-state.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D87392/new/
https://reviews.llvm.org/D87392
Files:
llvm/lib/Transforms/Scalar/JumpThreading.cpp
llvm/test/Transforms/JumpThreading/constant-fold-status.ll
Index: llvm/test/Transforms/JumpThreading/constant-fold-status.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/JumpThreading/constant-fold-status.ll
@@ -0,0 +1,28 @@
+; RUN: opt -jump-threading < %s -S -o - | FileCheck %s
+
+; Reproducer for PR47297.
+
+; The pass did previously not report a correct Modified status in the case
+; where a terminator's condition was successfully constant folded, but there
+; were no other transformations done. This was caught by the pass return
+; status check that is hidden under EXPENSIVE_CHECKS.
+
+; CHECK-LABEL: entry:
+; CHECK-NEXT: br i1 icmp eq (i32 ptrtoint (i16* @a to i32), i32 0), label %overflow, label %cont
+
+ at a = internal global i16 0
+
+define void @foo(i16 %d) {
+entry:
+ %.not = icmp eq i16 zext (i1 icmp ne (i32 ptrtoint (i16* @a to i32), i32 0) to i16), 0
+ br i1 %.not, label %overflow, label %cont
+
+overflow: ; preds = %entry
+ call void @bar()
+ br label %cont
+
+cont: ; preds = %overflow, %entry
+ ret void
+}
+
+declare void @bar()
Index: llvm/lib/Transforms/Scalar/JumpThreading.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -1040,6 +1040,9 @@
return false; // Must be an invoke or callbr.
}
+ // Keep track if we constant folded the condition in this invocation.
+ bool ConstantFolded = false;
+
// Run constant folding to see if we can reduce the condition to a simple
// constant.
if (Instruction *I = dyn_cast<Instruction>(Condition)) {
@@ -1050,6 +1053,7 @@
if (isInstructionTriviallyDead(I, TLI))
I->eraseFromParent();
Condition = SimpleVal;
+ ConstantFolded = true;
}
}
@@ -1100,7 +1104,7 @@
// FIXME: Unify this with code below.
if (ProcessThreadableEdges(Condition, BB, Preference, Terminator))
return true;
- return false;
+ return ConstantFolded;
}
if (CmpInst *CondCmp = dyn_cast<CmpInst>(CondInst)) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D87392.290894.patch
Type: text/x-patch
Size: 2151 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200910/b4831f02/attachment.bin>
More information about the llvm-commits
mailing list