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
This commit is contained in:
Yonghong Song 2018-03-13 06:47:02 +00:00
parent 89e47ac671
commit 905d13c123
2 changed files with 24 additions and 6 deletions

View 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:

View 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)
@ -40,6 +48,18 @@ entry:
ret i64 %c.d
}
; 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: