mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-22 13:29:44 +00:00
This patch will optimize the following: sub r1, r3 cmp r3, r1 or cmp r1, r3 bge L1 TO sub r1, r3 bge L1 or ble L1 If the branch instruction can use flag from "sub", then we can eliminate the "cmp" instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157831 91177308-0d34-0410-b5e6-96231b3b80d8
116 lines
2.3 KiB
LLVM
116 lines
2.3 KiB
LLVM
; RUN: llc < %s -march=x86 -mcpu=pentiumpro | FileCheck %s
|
|
|
|
define i32 @f(i32 %X) {
|
|
entry:
|
|
; CHECK: f:
|
|
; CHECK: jns
|
|
%tmp1 = add i32 %X, 1 ; <i32> [#uses=1]
|
|
%tmp = icmp slt i32 %tmp1, 0 ; <i1> [#uses=1]
|
|
br i1 %tmp, label %cond_true, label %cond_next
|
|
|
|
cond_true: ; preds = %entry
|
|
%tmp2 = tail call i32 (...)* @bar( ) ; <i32> [#uses=0]
|
|
br label %cond_next
|
|
|
|
cond_next: ; preds = %cond_true, %entry
|
|
%tmp3 = tail call i32 (...)* @baz( ) ; <i32> [#uses=0]
|
|
ret i32 undef
|
|
}
|
|
|
|
declare i32 @bar(...)
|
|
|
|
declare i32 @baz(...)
|
|
|
|
; rdar://10633221
|
|
; rdar://11355268
|
|
define i32 @g(i32 %a, i32 %b) nounwind {
|
|
entry:
|
|
; CHECK: g:
|
|
; CHECK-NOT: test
|
|
; CHECK: cmovs
|
|
%sub = sub nsw i32 %a, %b
|
|
%cmp = icmp sgt i32 %sub, 0
|
|
%cond = select i1 %cmp, i32 %sub, i32 0
|
|
ret i32 %cond
|
|
}
|
|
|
|
; rdar://10734411
|
|
define i32 @h(i32 %a, i32 %b) nounwind {
|
|
entry:
|
|
; CHECK: h:
|
|
; CHECK-NOT: cmp
|
|
; CHECK: cmov
|
|
; CHECK-NOT: movl
|
|
; CHECK: ret
|
|
%cmp = icmp slt i32 %b, %a
|
|
%sub = sub nsw i32 %a, %b
|
|
%cond = select i1 %cmp, i32 %sub, i32 0
|
|
ret i32 %cond
|
|
}
|
|
define i32 @i(i32 %a, i32 %b) nounwind {
|
|
entry:
|
|
; CHECK: i:
|
|
; CHECK-NOT: cmp
|
|
; CHECK: cmov
|
|
; CHECK-NOT: movl
|
|
; CHECK: ret
|
|
%cmp = icmp sgt i32 %a, %b
|
|
%sub = sub nsw i32 %a, %b
|
|
%cond = select i1 %cmp, i32 %sub, i32 0
|
|
ret i32 %cond
|
|
}
|
|
define i32 @j(i32 %a, i32 %b) nounwind {
|
|
entry:
|
|
; CHECK: j:
|
|
; CHECK-NOT: cmp
|
|
; CHECK: cmov
|
|
; CHECK-NOT: movl
|
|
; CHECK: ret
|
|
%cmp = icmp ugt i32 %a, %b
|
|
%sub = sub i32 %a, %b
|
|
%cond = select i1 %cmp, i32 %sub, i32 0
|
|
ret i32 %cond
|
|
}
|
|
define i32 @k(i32 %a, i32 %b) nounwind {
|
|
entry:
|
|
; CHECK: k:
|
|
; CHECK-NOT: cmp
|
|
; CHECK: cmov
|
|
; CHECK-NOT: movl
|
|
; CHECK: ret
|
|
%cmp = icmp ult i32 %b, %a
|
|
%sub = sub i32 %a, %b
|
|
%cond = select i1 %cmp, i32 %sub, i32 0
|
|
ret i32 %cond
|
|
}
|
|
; redundant cmp instruction
|
|
define i32 @l(i32 %a, i32 %b) nounwind {
|
|
entry:
|
|
; CHECK: l:
|
|
; CHECK-NOT: cmp
|
|
%cmp = icmp slt i32 %b, %a
|
|
%sub = sub nsw i32 %a, %b
|
|
%cond = select i1 %cmp, i32 %sub, i32 %a
|
|
ret i32 %cond
|
|
}
|
|
define i32 @m(i32 %a, i32 %b) nounwind {
|
|
entry:
|
|
; CHECK: m:
|
|
; CHECK-NOT: cmp
|
|
%cmp = icmp sgt i32 %a, %b
|
|
%sub = sub nsw i32 %a, %b
|
|
%cond = select i1 %cmp, i32 %b, i32 %sub
|
|
ret i32 %cond
|
|
}
|
|
; rdar://11540023
|
|
define i64 @n(i64 %x, i64 %y) nounwind {
|
|
entry:
|
|
; CHECK: n:
|
|
; CHECK-NOT: sub
|
|
; CHECK: cmp
|
|
%sub = sub nsw i64 %x, %y
|
|
%cmp = icmp slt i64 %sub, 0
|
|
%y.x = select i1 %cmp, i64 %y, i64 %x
|
|
ret i64 %y.x
|
|
}
|