mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 23:17:16 +00:00
X86: optimization for max-like struct
This patch will optimize the following cases on X86 (a > b) ? (a-b) : 0 (a >= b) ? (a-b) : 0 (b < a) ? (a-b) : 0 (b <= a) ? (a-b) : 0 FROM movl %edi, %ecx subl %esi, %ecx cmpl %edi, %esi movl $0, %eax cmovll %ecx, %eax TO xorl %eax, %eax subl %esi, %edi cmovll %eax, %edi movl %edi, %eax rdar: 10734411 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155919 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -32,3 +32,45 @@ entry:
|
||||
%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
|
||||
%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
|
||||
%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
|
||||
%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
|
||||
%cmp = icmp ult i32 %b, %a
|
||||
%sub = sub i32 %a, %b
|
||||
%cond = select i1 %cmp, i32 %sub, i32 0
|
||||
ret i32 %cond
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user