[llvm] [InstCombine] Fix miscompile when folding a select into a masked load (PR #216730)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 01:53:37 PDT 2026
================
@@ -5379,11 +5379,21 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
if (match(TrueVal, m_OneUse(m_MaskedLoad(m_Value(MaskedLoadPtr),
m_Specific(CondVal), m_Value())))) {
auto *LoadInst = cast<IntrinsicInst>(TrueVal);
- Instruction *In = Builder.CreateMaskedLoad(
- TrueVal->getType(), MaskedLoadPtr,
- LoadInst->getParamAlign(0).valueOrOne(), CondVal, FalseVal);
- In->setAAMetadata(LoadInst->getAAMetadata());
- return replaceInstUsesWith(SI, In);
+ // Keep the load at its original position to avoid crossing writes. The new
+ // passthrough must therefore be available there.
+ // TODO: Sink the load when the passthrough is unavailable but no
+ // intervening instruction can modify memory.
+ if (DT.dominates(FalseVal, LoadInst)) {
+ Builder.SetInsertPoint(LoadInst);
+ // SetInsertPoint() took the debug location from the old load, but the new
+ // load replaces the select, so restore the select's location.
+ Builder.SetCurrentDebugLocation(SI.getDebugLoc());
----------------
Chennesxu wrote:
Thanks for the review. I removed the explicit debug-location override.
https://github.com/llvm/llvm-project/pull/216730
More information about the llvm-commits
mailing list