diff options
author | Andreas Jonson <andjo403@hotmail.com> | 2025-08-11 13:00:54 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-11 13:00:54 +0200 |
commit | 330a5894508267b6482417ae7be64d3a7b8aed17 (patch) | |
tree | 899bef3c7f60fda175f291ceac938a59655376ca /llvm/lib/Transforms/Utils/PredicateInfo.cpp | |
parent | d9345545a0f5e07469311ee10f571d57211d9e0d (diff) | |
download | llvm-330a5894508267b6482417ae7be64d3a7b8aed17.zip llvm-330a5894508267b6482417ae7be64d3a7b8aed17.tar.gz llvm-330a5894508267b6482417ae7be64d3a7b8aed17.tar.bz2 |
[PredicateInfo] Handle trunc nuw i1 condition. (#152988)
proof: https://alive2.llvm.org/ce/z/mxtn4L
Diffstat (limited to 'llvm/lib/Transforms/Utils/PredicateInfo.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/PredicateInfo.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/PredicateInfo.cpp b/llvm/lib/Transforms/Utils/PredicateInfo.cpp index 02420fa..38a312a 100644 --- a/llvm/lib/Transforms/Utils/PredicateInfo.cpp +++ b/llvm/lib/Transforms/Utils/PredicateInfo.cpp @@ -370,6 +370,8 @@ void PredicateInfoBuilder::processAssume( Values.push_back(Cond); if (auto *Cmp = dyn_cast<CmpInst>(Cond)) collectCmpOps(Cmp, Values); + else if (match(Cond, m_NUWTrunc(m_Value(Op0)))) + Values.push_back(Op0); for (Value *V : Values) { if (shouldRename(V)) { @@ -416,6 +418,8 @@ void PredicateInfoBuilder::processBranch( Values.push_back(Cond); if (auto *Cmp = dyn_cast<CmpInst>(Cond)) collectCmpOps(Cmp, Values); + else if (match(Cond, m_NUWTrunc(m_Value(Op0)))) + Values.push_back(Op0); for (Value *V : Values) { if (shouldRename(V)) { @@ -709,6 +713,11 @@ std::optional<PredicateConstraint> PredicateBase::getConstraint() const { : ConstantInt::getFalse(Condition->getType())}}; } + if (match(Condition, m_NUWTrunc(m_Specific(RenamedOp)))) { + return {{TrueEdge ? CmpInst::ICMP_NE : CmpInst::ICMP_EQ, + ConstantInt::getNullValue(RenamedOp->getType())}}; + } + CmpInst *Cmp = dyn_cast<CmpInst>(Condition); if (!Cmp) { // TODO: Make this an assertion once RenamedOp is fully accurate. |