mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 14:47:00 +00:00
a1d9ba7078
This allows "icmp ugt %a, 4294967295" and "icmp uge %a, 4294967296" to be optimized into right shifts by 32 which can fold the immediate into the shift instruction. These patterns show up with some regularity in real code. Unfortunately, since getImmCost can't see the icmp predicate we can't be tell if we're only catching these specific cases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256126 91177308-0d34-0410-b5e6-96231b3b80d8
26 lines
653 B
LLVM
26 lines
653 B
LLVM
; RUN: llc < %s -O3 -march=x86-64 |FileCheck %s
|
|
define i64 @foo(i64 %data1, i64 %data2, i64 %data3)
|
|
{
|
|
; If constant 4294967295 is hoisted to a variable, then we won't be able to
|
|
; use a shift right by 32 to optimize the compare.
|
|
entry:
|
|
%val1 = add i64 %data3, 1
|
|
%x = icmp ugt i64 %data1, 4294967295
|
|
br i1 %x, label %End, label %L_val2
|
|
|
|
; CHECK: shrq $32, {{.*}}
|
|
; CHECK: shrq $32, {{.*}}
|
|
L_val2:
|
|
%val2 = add i64 %data3, 2
|
|
%y = icmp ugt i64 %data2, 4294967295
|
|
br i1 %y, label %End, label %L_val3
|
|
|
|
L_val3:
|
|
%val3 = add i64 %data3, 3
|
|
br label %End
|
|
|
|
End:
|
|
%p1 = phi i64 [%val1,%entry], [%val2,%L_val2], [%val3,%L_val3]
|
|
ret i64 %p1
|
|
}
|