diff options
author | Yonghong Song <yhs@fb.com> | 2018-03-13 06:47:02 +0000 |
---|---|---|
committer | Yonghong Song <yhs@fb.com> | 2018-03-13 06:47:02 +0000 |
commit | 905d13c1230685eb11b2a00b26773f5f052e80db (patch) | |
tree | a129820224a17d002c54bd5515eadeb7d7b1b517 | |
parent | 89e47ac67150ec2287db0d4541196d0a4d3f96cc (diff) | |
download | bcm5719-llvm-905d13c1230685eb11b2a00b26773f5f052e80db.tar.gz bcm5719-llvm-905d13c1230685eb11b2a00b26773f5f052e80db.zip |
bpf: J*_RR should check both operands
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
-rw-r--r-- | llvm/lib/Target/BPF/BPFMIPeephole.cpp | 10 | ||||
-rw-r--r-- | llvm/test/CodeGen/BPF/32-bit-subreg-peephole.ll | 20 |
2 files changed, 24 insertions, 6 deletions
diff --git a/llvm/lib/Target/BPF/BPFMIPeephole.cpp b/llvm/lib/Target/BPF/BPFMIPeephole.cpp index 3df14b4ad5b..7d84b2834f8 100644 --- a/llvm/lib/Target/BPF/BPFMIPeephole.cpp +++ b/llvm/lib/Target/BPF/BPFMIPeephole.cpp @@ -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: diff --git a/llvm/test/CodeGen/BPF/32-bit-subreg-peephole.ll b/llvm/test/CodeGen/BPF/32-bit-subreg-peephole.ll index 6b3edaf9cf9..78c344b1577 100644 --- a/llvm/test/CodeGen/BPF/32-bit-subreg-peephole.ll +++ b/llvm/test/CodeGen/BPF/32-bit-subreg-peephole.ll @@ -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: |