bpf: J*_RR should check both operands
authorYonghong Song <yhs@fb.com>
Tue, 13 Mar 2018 06:47:02 +0000 (06:47 +0000)
committerYonghong Song <yhs@fb.com>
Tue, 13 Mar 2018 06:47:02 +0000 (06:47 +0000)
There is a mistake in current code that we "break" out the optimization
when the first operand of J*_RR doesn't qualify the elimination. This
caused some elimination opportunities missed, for example the one in the
testcase.

The code should just fall through to handle the second operand.

Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
Signed-off-by: Yonghong Song <yhs@fb.com>
llvm-svn: 327366

llvm/lib/Target/BPF/BPFMIPeephole.cpp
llvm/test/CodeGen/BPF/32-bit-subreg-peephole.ll

index 3df14b4..7d84b28 100644 (file)
@@ -156,12 +156,10 @@ bool BPFMIPeephole::eliminateCmpPromotionSeq(void) {
       case BPF::JNE_rr:
         Reg = MI.getOperand(1).getReg();
         Mov = getInsnDefZExtSubReg(Reg);
-        if (!Mov)
-          break;
-
-       updateInsnSeq(MBB, MI, Reg);
-       Eliminated = true;
-
+        if (Mov) {
+          updateInsnSeq(MBB, MI, Reg);
+          Eliminated = true;
+        }
         // Fallthrough
       case BPF::JUGT_ri:
       case BPF::JUGE_ri:
index 6b3edaf..78c344b 100644 (file)
@@ -8,6 +8,14 @@
 ;     return d;
 ; }
 ;
+; long long select_u_2(unsigned a, unsigned long long b, long long c, long long d)
+; {
+;   if (a > b)
+;     return c;
+;   else
+;     return d;
+; }
+;
 ; long long select_s(signed a, signed b, long long c, long long d)
 ; {
 ;   if (a > b)
@@ -41,6 +49,18 @@ entry:
 }
 
 ; Function Attrs: norecurse nounwind readnone
+define dso_local i64 @select_u_2(i32 %a, i64 %b, i64 %c, i64 %d) local_unnamed_addr #0 {
+; CHECK-LABEL: select_u_2:
+entry:
+  %conv = zext i32 %a to i64
+; CHECK-NOT: r{{[0-9]+}} <<= 32
+; CHECK-NOT: r{{[0-9]+}} >>= 32
+  %cmp = icmp ugt i64 %conv, %b
+  %c.d = select i1 %cmp, i64 %c, i64 %d
+  ret i64 %c.d
+}
+
+; Function Attrs: norecurse nounwind readnone
 define dso_local i64 @select_s(i32 %a, i32 %b, i64 %c, i64 %d) local_unnamed_addr #0 {
 ; CHECK-LABEL: select_s:
 entry: