[PATCH] D87392: [JumpThreading] Fix an incorrect Modified status
David Stenberg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 14 01:37:33 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rGbfcb824ba528: [JumpThreading] Fix an incorrect Modified status (authored by dstenb).
Repository:
rG LLVM Github Monorepo
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
@@ -1047,6 +1047,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)) {
@@ -1057,6 +1060,7 @@
if (isInstructionTriviallyDead(I, TLI))
I->eraseFromParent();
Condition = SimpleVal;
+ ConstantFolded = true;
}
}
@@ -1107,7 +1111,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.291512.patch
Type: text/x-patch
Size: 2151 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200914/9db56012/attachment.bin>
More information about the llvm-commits
mailing list