Skip to content

Commit 2460947

Browse files
yonghong-songtstellar
authored andcommitted
BPF: Implement TTI.getCmpSelInstrCost() properly
The Select insn in BPF is expensive as BPF backend needs to resolve with conditionals. This patch set the getCmpSelInstrCost() to SCEVCheapExpansionBudget for Select insn to prevent some Select insn related optimizations. This change is motivated during bcc code review for iovisor/bcc#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, IndVarSimplifyPass won't do the above transformation any more. Differential Revision: https://reviews.llvm.org/D97479 (cherry picked from commit 1959ead)
1 parent f9efff3 commit 2460947

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

llvm/lib/Target/BPF/BPFTargetTransformInfo.h

+12
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "BPFTargetMachine.h"
1919
#include "llvm/Analysis/TargetTransformInfo.h"
2020
#include "llvm/CodeGen/BasicTTIImpl.h"
21+
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
2122

2223
namespace llvm {
2324
class BPFTTIImpl : public BasicTTIImplBase<BPFTTIImpl> {
@@ -42,6 +43,17 @@ class BPFTTIImpl : public BasicTTIImplBase<BPFTTIImpl> {
4243

4344
return TTI::TCC_Basic;
4445
}
46+
47+
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
48+
CmpInst::Predicate VecPred,
49+
TTI::TargetCostKind CostKind,
50+
const llvm::Instruction *I = nullptr) {
51+
if (Opcode == Instruction::Select)
52+
return SCEVCheapExpansionBudget;
53+
54+
return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind,
55+
I);
56+
}
4557
};
4658

4759
} // end namespace llvm

0 commit comments

Comments
 (0)