llvm/test/CodeGen/X86/constant-hoisting-cmp.ll
Craig Topper a1d9ba7078 [X86] Prevent constant hoisting for a couple compare immediates that the selection DAG knows how to optimize into a shift.
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
2015-12-20 18:41:54 +00:00

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
}