[PATCH] D97479: BPF: Implement TTI.getCmpSelInstrCost() properly
Yonghong Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 25 08:36:58 PST 2021
yonghong-song created this revision.
yonghong-song added a reviewer: ast.
Herald added a subscriber: hiraditya.
yonghong-song requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
The Select insn in BPF is expensive as BPF backend
needs to resolve with conditionals. Similarly to
SystemZ, if this happens, return the cost of 4
instead of default 1.
This change is motivated during bcc code review for
https://github.com/iovisor/bcc/pull/3270
where IndVarSimplifyPass eventually caused generating
the following asm code:
; for (i = 0; (i < VIRTIO_MAX_SGS) && (i < num); i++) {
14: 16 05 40 00 00 00 00 00 if w5 == 0 goto +64 <LBB0_6>
15: bc 51 00 00 00 00 00 00 w1 = w5
16: 04 01 00 00 ff ff ff ff w1 += -1
17: 67 05 00 00 20 00 00 00 r5 <<= 32
18: 77 05 00 00 20 00 00 00 r5 >>= 32
19: a6 01 01 00 05 00 00 00 if w1 < 5 goto +1 <LBB0_4>
20: b7 05 00 00 06 00 00 00 r5 = 6
00000000000000a8 <LBB0_4>:
21: b7 02 00 00 00 00 00 00 r2 = 0
22: b7 01 00 00 00 00 00 00 r1 = 0
; for (i = 0; (i < VIRTIO_MAX_SGS) && (i < num); i++) {
23: 7b 1a e0 ff 00 00 00 00 *(u64 *)(r10 - 32) = r1
24: 7b 5a c0 ff 00 00 00 00 *(u64 *)(r10 - 64) = r5
Note that insn #15 has w1 = w5 and w1 is refined later but r5(w5) is
eventually saved on stack at insn #24 for later use. This cause
later verifier failures.
With this change which introduced proper cost model
for Select instruction, IndVarSimplifyPass won't do
the above transformation any more.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D97479
Files:
llvm/lib/Target/BPF/BPFTargetTransformInfo.h
Index: llvm/lib/Target/BPF/BPFTargetTransformInfo.h
===================================================================
--- llvm/lib/Target/BPF/BPFTargetTransformInfo.h
+++ llvm/lib/Target/BPF/BPFTargetTransformInfo.h
@@ -42,6 +42,17 @@
return TTI::TCC_Basic;
}
+
+ int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
+ CmpInst::Predicate VecPred,
+ TTI::TargetCostKind CostKind,
+ const llvm::Instruction *I = nullptr) {
+ if (Opcode == Instruction::Select)
+ return 4;
+
+ return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind,
+ I);
+ }
};
} // end namespace llvm
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D97479.326407.patch
Type: text/x-patch
Size: 737 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210225/f4dd1213/attachment.bin>
More information about the llvm-commits
mailing list