[PATCH] D88360: [ValueTracking] Fix analyses to update CxtI to be phi's incoming edges' terminators
Juneyoung Lee via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 28 07:26:50 PDT 2020
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
aqjune marked an inline comment as done.
Closed by commit rGba8911d560ef: [ValueTracking] Fix analyses to update CxtI to be phi's incoming edges'… (authored by aqjune).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D88360/new/
https://reviews.llvm.org/D88360
Files:
llvm/lib/Analysis/ValueTracking.cpp
llvm/unittests/Analysis/ValueTrackingTest.cpp
Index: llvm/unittests/Analysis/ValueTrackingTest.cpp
===================================================================
--- llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -768,6 +768,30 @@
}
}
+TEST_F(ValueTrackingTest, isGuaranteedNotToBePoison_phi) {
+ parseAssembly("declare i32 @any_i32(i32)"
+ "define void @test() {\n"
+ "ENTRY:\n"
+ " br label %LOOP\n"
+ "LOOP:\n"
+ " %A = phi i32 [0, %ENTRY], [%A.next, %NEXT]\n"
+ " %A.next = call i32 @any_i32(i32 %A)\n"
+ " %cond = icmp eq i32 %A.next, 0\n"
+ " br i1 %cond, label %NEXT, label %EXIT\n"
+ "NEXT:\n"
+ " br label %LOOP\n"
+ "EXIT:\n"
+ " ret void\n"
+ "}\n");
+ DominatorTree DT(*F);
+ for (auto &BB : *F) {
+ if (BB.getName() == "LOOP") {
+ EXPECT_EQ(isGuaranteedNotToBePoison(A, A, &DT), true)
+ << "isGuaranteedNotToBePoison does not hold";
+ }
+ }
+}
+
TEST_F(ValueTrackingTest, isGuaranteedNotToBeUndefOrPoison) {
parseAssembly("declare void @f(i32 noundef)"
"define void @test(i32 %x) {\n"
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -2967,11 +2967,13 @@
// Take the minimum of all incoming values. This can't infinitely loop
// because of our depth threshold.
- Tmp = ComputeNumSignBits(PN->getIncomingValue(0), Depth + 1, Q);
- for (unsigned i = 1, e = NumIncomingValues; i != e; ++i) {
+ Query RecQ = Q;
+ Tmp = TyBits;
+ for (unsigned i = 0, e = NumIncomingValues; i != e; ++i) {
if (Tmp == 1) return Tmp;
+ RecQ.CxtI = PN->getIncomingBlock(i)->getTerminator();
Tmp = std::min(
- Tmp, ComputeNumSignBits(PN->getIncomingValue(i), Depth + 1, Q));
+ Tmp, ComputeNumSignBits(PN->getIncomingValue(i), Depth + 1, RecQ));
}
return Tmp;
}
@@ -4939,7 +4941,20 @@
return true;
}
- if (!canCreateUndefOrPoison(Opr) && all_of(Opr->operands(), OpCheck))
+ if (const auto *PN = dyn_cast<PHINode>(V)) {
+ unsigned Num = PN->getNumIncomingValues();
+ bool IsWellDefined = true;
+ for (unsigned i = 0; i < Num; ++i) {
+ auto *TI = PN->getIncomingBlock(i)->getTerminator();
+ if (!isGuaranteedNotToBeUndefOrPoison(PN->getIncomingValue(i), TI, DT,
+ Depth + 1, PoisonOnly)) {
+ IsWellDefined = false;
+ break;
+ }
+ }
+ if (IsWellDefined)
+ return true;
+ } else if (!canCreateUndefOrPoison(Opr) && all_of(Opr->operands(), OpCheck))
return true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88360.294692.patch
Type: text/x-patch
Size: 2916 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200928/ee6b9601/attachment.bin>
More information about the llvm-commits
mailing list