[llvm] [InstCombine] Preserve profile data with select instructions and binary operators (PR #158375)
Alan Zhao via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 12 15:36:29 PDT 2025
================
@@ -1381,24 +1384,28 @@ Value *InstCombinerImpl::SimplifySelectsFeedingBinaryOp(BinaryOperator &I,
// We need an 'add' and exactly 1 arm of the select to have been simplified.
if (Opcode != Instruction::Add || (!True && !False) || (True && False))
return nullptr;
-
- Value *N;
+ Value *N, *SI = nullptr;
if (True && match(FVal, m_Neg(m_Value(N)))) {
Value *Sub = Builder.CreateSub(Z, N);
- return Builder.CreateSelect(Cond, True, Sub, I.getName());
+ SI = Builder.CreateSelect(Cond, True, Sub, I.getName());
}
if (False && match(TVal, m_Neg(m_Value(N)))) {
Value *Sub = Builder.CreateSub(Z, N);
- return Builder.CreateSelect(Cond, Sub, False, I.getName());
+ SI = Builder.CreateSelect(Cond, Sub, False, I.getName());
}
- return nullptr;
+ if (!ProfcheckDisableMetadataFixes && SI)
+ cast<SelectInst>(SI)->setMetadata(LLVMContext::MD_prof, ProfileData);
+ return SI;
};
if (LHSIsSelect && RHSIsSelect && A == D) {
// (A ? B : C) op (A ? E : F) -> A ? (B op E) : (C op F)
Cond = A;
True = simplifyBinOp(Opcode, B, E, FMF, Q);
False = simplifyBinOp(Opcode, C, F, FMF, Q);
+ // Profile weights for both LHS and RHS should be the same because they have
----------------
alanzhao1 wrote:
Added an assertion that left and right profiles should be equal.
https://github.com/llvm/llvm-project/pull/158375
More information about the llvm-commits
mailing list