mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
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:
parent
bd70b9a0d8
commit
58611b2ea4
@ -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:
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user