Skip to content

Commit 7699762

Browse files
authored
[slp][profcheck] Mark selects as having unknown profile (llvm#162960)
There are 2 cases: - either the `select`​ condition is a vector of bools, case in which we don't currently have a way to represent the per-element branch probabilities anyway; - or the select condition is a scalar, for example from a `llvm.vector.reduce`​. We could potentially try and do more here - if the reduced vector contained conditions from other selects, for instance In either case, IIUC, chances are the `select`​ doesn't get lowered to a branch, at least I'm not seeing any evidence of that in an internal complex application (CSFDO + ThinLTO). Seems sufficient to mark the selects are unknown (for profiled functions); since that metadata carries with it the pass name (`DEBUG_TYPE`​) that marked it as such, we can revisit this if we detect later lowerings of these selects that would have required an actual profile. Issue llvm#147390
1 parent ec2d6ad commit 7699762

File tree

4 files changed

+27
-82
lines changed

4 files changed

+27
-82
lines changed

llvm/include/llvm/IR/IRBuilder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2548,6 +2548,11 @@ class IRBuilderBase {
25482548
std::optional<RoundingMode> Rounding = std::nullopt,
25492549
std::optional<fp::ExceptionBehavior> Except = std::nullopt);
25502550

2551+
LLVM_ABI Value *CreateSelectWithUnknownProfile(Value *C, Value *True,
2552+
Value *False,
2553+
StringRef PassName,
2554+
const Twine &Name = "");
2555+
25512556
LLVM_ABI Value *CreateSelect(Value *C, Value *True, Value *False,
25522557
const Twine &Name = "",
25532558
Instruction *MDFrom = nullptr);

llvm/lib/IR/IRBuilder.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "llvm/IR/Module.h"
2626
#include "llvm/IR/NoFolder.h"
2727
#include "llvm/IR/Operator.h"
28+
#include "llvm/IR/ProfDataUtils.h"
2829
#include "llvm/IR/Statepoint.h"
2930
#include "llvm/IR/Type.h"
3031
#include "llvm/IR/Value.h"
@@ -1002,6 +1003,18 @@ CallInst *IRBuilderBase::CreateConstrainedFPCall(
10021003
return C;
10031004
}
10041005

1006+
Value *IRBuilderBase::CreateSelectWithUnknownProfile(Value *C, Value *True,
1007+
Value *False,
1008+
StringRef PassName,
1009+
const Twine &Name) {
1010+
Value *Ret = CreateSelectFMF(C, True, False, {}, Name);
1011+
if (auto *SI = dyn_cast<SelectInst>(Ret)) {
1012+
setExplicitlyUnknownBranchWeightsIfProfiled(
1013+
*SI, *SI->getParent()->getParent(), PassName);
1014+
}
1015+
return Ret;
1016+
}
1017+
10051018
Value *IRBuilderBase::CreateSelect(Value *C, Value *True, Value *False,
10061019
const Twine &Name, Instruction *MDFrom) {
10071020
return CreateSelectFMF(C, True, False, {}, Name, MDFrom);

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19460,7 +19460,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
1946019460
}
1946119461
assert(getNumElements(Cond->getType()) == TrueNumElements &&
1946219462
"Cannot vectorize Instruction::Select");
19463-
Value *V = Builder.CreateSelect(Cond, True, False);
19463+
Value *V =
19464+
Builder.CreateSelectWithUnknownProfile(Cond, True, False, DEBUG_TYPE);
1946419465
V = FinalShuffle(V, E);
1946519466

1946619467
E->VectorizedValue = V;
@@ -23580,18 +23581,19 @@ class HorizontalReduction {
2358023581
switch (Kind) {
2358123582
case RecurKind::Or: {
2358223583
if (UseSelect && OpTy == CmpInst::makeCmpResultType(OpTy))
23583-
return Builder.CreateSelect(
23584+
return Builder.CreateSelectWithUnknownProfile(
2358423585
LHS, ConstantInt::getAllOnesValue(CmpInst::makeCmpResultType(OpTy)),
23585-
RHS, Name);
23586+
RHS, DEBUG_TYPE, Name);
2358623587
unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
2358723588
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
2358823589
Name);
2358923590
}
2359023591
case RecurKind::And: {
2359123592
if (UseSelect && OpTy == CmpInst::makeCmpResultType(OpTy))
23592-
return Builder.CreateSelect(
23593+
return Builder.CreateSelectWithUnknownProfile(
2359323594
LHS, RHS,
23594-
ConstantInt::getNullValue(CmpInst::makeCmpResultType(OpTy)), Name);
23595+
ConstantInt::getNullValue(CmpInst::makeCmpResultType(OpTy)),
23596+
DEBUG_TYPE, Name);
2359523597
unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
2359623598
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
2359723599
Name);
@@ -23612,7 +23614,8 @@ class HorizontalReduction {
2361223614
if (UseSelect) {
2361323615
CmpInst::Predicate Pred = llvm::getMinMaxReductionPredicate(Kind);
2361423616
Value *Cmp = Builder.CreateICmp(Pred, LHS, RHS, Name);
23615-
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
23617+
return Builder.CreateSelectWithUnknownProfile(Cmp, LHS, RHS, DEBUG_TYPE,
23618+
Name);
2361623619
}
2361723620
[[fallthrough]];
2361823621
case RecurKind::FMax:

llvm/utils/profcheck-xfail.txt

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,82 +1312,6 @@ Transforms/SimpleLoopUnswitch/pr60736.ll
13121312
Transforms/SimpleLoopUnswitch/trivial-unswitch-freeze-individual-conditions.ll
13131313
Transforms/SimpleLoopUnswitch/trivial-unswitch.ll
13141314
Transforms/SimpleLoopUnswitch/trivial-unswitch-logical-and-or.ll
1315-
Transforms/SLPVectorizer/AArch64/gather-root.ll
1316-
Transforms/SLPVectorizer/AArch64/horizontal.ll
1317-
Transforms/SLPVectorizer/AArch64/loadi8.ll
1318-
Transforms/SLPVectorizer/AArch64/phi-node-bitwidt-op-not.ll
1319-
Transforms/SLPVectorizer/AArch64/uselistorder.ll
1320-
Transforms/SLPVectorizer/AArch64/vec3-reorder-reshuffle.ll
1321-
Transforms/SLPVectorizer/AArch64/vectorizable-selects-min-max.ll
1322-
Transforms/SLPVectorizer/AArch64/vectorizable-selects-uniform-cmps.ll
1323-
Transforms/SLPVectorizer/AMDGPU/horizontal-store.ll
1324-
Transforms/SLPVectorizer/bool-logical-op-reduction-with-poison.ll
1325-
Transforms/SLPVectorizer/call-arg-reduced-by-minbitwidth.ll
1326-
Transforms/SLPVectorizer/const-bool-logical-or-reduction.ll
1327-
Transforms/SLPVectorizer/extracts-with-undefs.ll
1328-
Transforms/SLPVectorizer/freeze-signedness-missed.ll
1329-
Transforms/SLPVectorizer/gathered-consecutive-loads-different-types.ll
1330-
Transforms/SLPVectorizer/gather_extract_from_vectorbuild.ll
1331-
Transforms/SLPVectorizer/insert-element-build-vector-const.ll
1332-
Transforms/SLPVectorizer/insert-element-build-vector-inseltpoison.ll
1333-
Transforms/SLPVectorizer/insert-element-build-vector.ll
1334-
Transforms/SLPVectorizer/logical-ops-poisonous-repeated.ll
1335-
Transforms/SLPVectorizer/minbitwidth-node-with-multi-users.ll
1336-
Transforms/SLPVectorizer/minbitwidth-user-not-min.ll
1337-
Transforms/SLPVectorizer/partial-register-extract.ll
1338-
Transforms/SLPVectorizer/reduction-gather-non-scheduled-extracts.ll
1339-
Transforms/SLPVectorizer/reorder-node.ll
1340-
Transforms/SLPVectorizer/reused-buildvector-matching-vectorized-node.ll
1341-
Transforms/SLPVectorizer/revec.ll
1342-
Transforms/SLPVectorizer/RISCV/remarks_cmp_sel_min_max.ll
1343-
Transforms/SLPVectorizer/RISCV/remarks-insert-into-small-vector.ll
1344-
Transforms/SLPVectorizer/RISCV/reordered-interleaved-loads.ll
1345-
Transforms/SLPVectorizer/RISCV/revec.ll
1346-
Transforms/SLPVectorizer/RISCV/select-profitability.ll
1347-
Transforms/SLPVectorizer/RISCV/shuffled-gather-casted.ll
1348-
Transforms/SLPVectorizer/RISCV/unsigned-node-trunc-with-signed-users.ll
1349-
Transforms/SLPVectorizer/slp-deleted-inst.ll
1350-
Transforms/SLPVectorizer/SystemZ/cmp-ptr-minmax.ll
1351-
Transforms/SLPVectorizer/SystemZ/ext-not-resized-op-resized.ll
1352-
Transforms/SLPVectorizer/SystemZ/minbitwidth-trunc.ll
1353-
Transforms/SLPVectorizer/X86/bool-mask.ll
1354-
Transforms/SLPVectorizer/X86/bv-root-part-of-graph.ll
1355-
Transforms/SLPVectorizer/X86/cmp-after-intrinsic-call-minbitwidth.ll
1356-
Transforms/SLPVectorizer/X86/cmp-as-alternate-ops.ll
1357-
Transforms/SLPVectorizer/X86/cmp_sel.ll
1358-
Transforms/SLPVectorizer/X86/crash_7zip.ll
1359-
Transforms/SLPVectorizer/X86/crash_clear_undefs.ll
1360-
Transforms/SLPVectorizer/X86/crash_cmpop.ll
1361-
Transforms/SLPVectorizer/X86/debug-counter.ll
1362-
Transforms/SLPVectorizer/X86/debug-info-salvage.ll
1363-
Transforms/SLPVectorizer/X86/extractelement-single-use-many-nodes.ll
1364-
Transforms/SLPVectorizer/X86/extracts-non-extendable.ll
1365-
Transforms/SLPVectorizer/X86/ext-used-scalar-different-bitwidth.ll
1366-
Transforms/SLPVectorizer/X86/gather-node-same-as-vect-but-order.ll
1367-
Transforms/SLPVectorizer/X86/horizontal-minmax.ll
1368-
Transforms/SLPVectorizer/X86/insert-after-bundle.ll
1369-
Transforms/SLPVectorizer/X86/jumbled-load-multiuse.ll
1370-
Transforms/SLPVectorizer/X86/minbitwidth-icmp-to-trunc.ll
1371-
Transforms/SLPVectorizer/X86/minbw-user-non-sizable.ll
1372-
Transforms/SLPVectorizer/X86/non-load-reduced-as-part-of-bv.ll
1373-
Transforms/SLPVectorizer/X86/ordering-bug.ll
1374-
Transforms/SLPVectorizer/X86/phi-node-bitwidt-op-not.ll
1375-
Transforms/SLPVectorizer/X86/phi-node-reshuffled-part.ll
1376-
Transforms/SLPVectorizer/X86/pr46983.ll
1377-
Transforms/SLPVectorizer/X86/pr49933.ll
1378-
Transforms/SLPVectorizer/X86/propagate_ir_flags.ll
1379-
Transforms/SLPVectorizer/X86/reduction-bool-logic-op-inside.ll
1380-
Transforms/SLPVectorizer/X86/reduction-logical.ll
1381-
Transforms/SLPVectorizer/X86/resized-bv-values-non-power-of2-node.ll
1382-
Transforms/SLPVectorizer/X86/reused-reductions-with-minbitwidth.ll
1383-
Transforms/SLPVectorizer/X86/select-reduction-op.ll
1384-
Transforms/SLPVectorizer/X86/shrink_after_reorder.ll
1385-
Transforms/SLPVectorizer/X86/subvector-minbitwidth-unsigned-value.ll
1386-
Transforms/SLPVectorizer/X86/undef_vect.ll
1387-
Transforms/SLPVectorizer/X86/used-reduced-op.ll
1388-
Transforms/SLPVectorizer/X86/vec3-reorder-reshuffle.ll
1389-
Transforms/SLPVectorizer/X86/vectorize-widest-phis.ll
1390-
Transforms/SLPVectorizer/X86/whole-registers-compare.ll
13911315
Transforms/SROA/addrspacecast.ll
13921316
Transforms/SROA/phi-and-select.ll
13931317
Transforms/SROA/phi-gep.ll

0 commit comments

Comments
 (0)