[PATCH] D112026: Treat branch on poison as immediate UB (under an off by default flag)
Philip Reames via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 24 14:42:41 PDT 2021
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGa461fa64bb37: Treat branch on poison as immediate UB (under an off by default flag) (authored by reames).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112026/new/
https://reviews.llvm.org/D112026
Files:
llvm/lib/Analysis/ValueTracking.cpp
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -84,6 +84,17 @@
static cl::opt<unsigned> DomConditionsMaxUses("dom-conditions-max-uses",
cl::Hidden, cl::init(20));
+// According to the LangRef, branching on a poison condition is absolutely
+// immediate full UB. However, historically we haven't implemented that
+// consistently as we have an important transformation (non-trivial unswitch)
+// which introduces instances of branch on poison/undef to otherwise well
+// defined programs. This flag exists to let us test optimization benefit
+// of exploiting the specified behavior (in combination with enabling the
+// unswitch fix.)
+static cl::opt<bool> BranchOnPoisonAsUB("branch-on-poison-as-ub",
+ cl::Hidden, cl::init(false));
+
+
/// Returns the bitwidth of the given scalar or pointer type. For vector types,
/// returns the element type's bitwidth.
static unsigned getBitWidth(Type *Ty, const DataLayout &DL) {
@@ -5468,7 +5479,16 @@
case Instruction::SRem:
Operands.insert(I->getOperand(1));
break;
-
+ case Instruction::Switch:
+ if (BranchOnPoisonAsUB)
+ Operands.insert(cast<SwitchInst>(I)->getCondition());
+ break;
+ case Instruction::Br: {
+ auto *BR = cast<BranchInst>(I);
+ if (BranchOnPoisonAsUB && BR->isConditional())
+ Operands.insert(BR->getCondition());
+ break;
+ }
default:
break;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112026.381804.patch
Type: text/x-patch
Size: 1603 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211024/24e25070/attachment.bin>
More information about the llvm-commits
mailing list