[llvm] [InstCombine] Improve coverage of `foldSelectValueEquivalence` (PR #88298)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 5 20:01:14 PDT 2024
================
@@ -1308,11 +1310,52 @@ Instruction *InstCombinerImpl::foldSelectValueEquivalence(SelectInst &Sel,
if (match(V, m_ImmConstant()))
return replaceOperand(Sel, Swapped ? 2 : 1, V);
- // If NewOp is a constant and OldOp is not replace iff NewOp doesn't
- // contain and undef/poison elements.
- if (match(NewOp, m_ImmConstant()) &&
- isGuaranteedNotToBeUndefOrPoison(NewOp, SQ.AC, &Sel, &DT))
+ // We can't do any further replacement if NewOp may be undef/poison.
+ if (!isGuaranteedNotToBeUndefOrPoison(NewOp, SQ.AC, &Sel, &DT))
+ return nullptr;
+
+ // If NewOp is a constant, replace.
+ if (match(NewOp, m_ImmConstant()))
+ return replaceOperand(Sel, Swapped ? 2 : 1, V);
+
+ // If we simplified the TrueArm -> NewOp then replace.
+ // This handles things like `select`/`min`/`max`/`or`/`and`/etc...
+ if (NewOp == V)
----------------
dtcxzyw wrote:
I am wondering whether we will enter an infinite loop here.
https://github.com/llvm/llvm-project/pull/88298
More information about the llvm-commits
mailing list