1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

bpf: Improve expanding logic in LowerSELECT_CC

LowerSELECT_CC is not generating optimal Select_Ri pattern at the moment. It
is not guaranteed to place ConstantNode at RHS which would miss matching
Select_Ri.

A new testcase added into the existing select_ri.ll, also there is an
existing case in cmp.ll which would be improved to use Select_Ri after this
patch, it is adjusted accordingly.

Reported-by: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Reviewed-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
llvm-svn: 324560
This commit is contained in:
Yonghong Song 2018-02-08 04:37:49 +00:00
parent 31b9403c70
commit 3a27a2b0ca
3 changed files with 31 additions and 1 deletions

View File

@ -488,6 +488,11 @@ SDValue BPFTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
SDValue TargetCC = DAG.getConstant(CC, DL, MVT::i64);
SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Glue);
// The constant is expected at RHS in Select_Ri pattern.
if (isa<ConstantSDNode>(LHS.getNode()))
std::swap(LHS, RHS);
SDValue Ops[] = {LHS, RHS, TargetCC, TrueV, FalseV};
return DAG.getNode(BPFISD::SELECT_CC, DL, VTs, Ops);

View File

@ -97,7 +97,7 @@ define zeroext i8 @minu(i8 zeroext %a, i8 zeroext %b) #0 {
%a.b = select i1 %1, i8 %a, i8 %b
ret i8 %a.b
; CHECK-LABEL:minu:
; CHECK: if r3 > r1
; CHECK: if r{{[0-9]+}} {{<|>}} 100
}
; Function Attrs: nounwind readnone uwtable

View File

@ -60,3 +60,28 @@ define i32 @foo(i8*) local_unnamed_addr #0 {
; Function Attrs: nounwind readonly
declare i64 @llvm.bpf.load.word(i8*, i64) #1
; Source file:
; int m, n;
; int test2() {
; int a = m;
; if (a < 6)
; a = n;
; return a;
; }
@m = common local_unnamed_addr global i32 0, align 4
@n = common local_unnamed_addr global i32 0, align 4
; Function Attrs: norecurse nounwind readonly
define i32 @test2() local_unnamed_addr #0 {
entry:
%0 = load i32, i32* @m, align 4
%cmp = icmp slt i32 %0, 6
; CHECK: if r{{[0-9]+}} s{{<|>}} 6 goto
%1 = load i32, i32* @n, align 4
%spec.select = select i1 %cmp, i32 %1, i32 %0
ret i32 %spec.select
}
attributes #0 = { norecurse nounwind readonly }