OSDN Git Service

bpf: Improve expanding logic in LowerSELECT_CC
authorYonghong Song <yhs@fb.com>
Thu, 8 Feb 2018 04:37:49 +0000 (04:37 +0000)
committerYonghong Song <yhs@fb.com>
Thu, 8 Feb 2018 04:37:49 +0000 (04:37 +0000)
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>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@324560 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/BPF/BPFISelLowering.cpp
test/CodeGen/BPF/cmp.ll
test/CodeGen/BPF/select_ri.ll

index 3ea96e3..2966cf7 100644 (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);
index 66345ab..e12f4a9 100644 (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
index 7b1f852..dbd2111 100644 (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 }