In SDISel, for targets that support FORMAL_ARGUMENTS nodes, lower this
node as soon as we create it in SDISel. Previously we would lower it in
legalize. The problem with this is that it only exposes the argument
loads implied by FORMAL_ARGUMENTs after legalize, so that only dag combine 2
can hack on them. This causes us to miss some optimizations because
datatype expansion also happens here.
Exposing the loads early allows us to do optimizations on them. For example
we now compile arg-cast.ll to:
_foo:
movl $2147483647, %eax
andl 8(%esp), %eax
ret
where we previously produced:
_foo:
subl $12, %esp
movsd 16(%esp), %xmm0
movsd %xmm0, (%esp)
movl $2147483647, %eax
andl 4(%esp), %eax
addl $12, %esp
ret
It might also make sense to do this for ISD::CALL nodes, which have implicit
stores on many targets.
llvm-svn: 47054
2008-02-13 08:39:09 +01:00
|
|
|
; This should compile to movl $2147483647, %eax + andl only.
|
|
|
|
; RUN: llvm-as < %s | llc | grep andl
|
|
|
|
; RUN: llvm-as < %s | llc | not grep movsd
|
2008-02-14 02:32:53 +01:00
|
|
|
; RUN: llvm-as < %s | llc | grep esp | not grep add
|
In SDISel, for targets that support FORMAL_ARGUMENTS nodes, lower this
node as soon as we create it in SDISel. Previously we would lower it in
legalize. The problem with this is that it only exposes the argument
loads implied by FORMAL_ARGUMENTs after legalize, so that only dag combine 2
can hack on them. This causes us to miss some optimizations because
datatype expansion also happens here.
Exposing the loads early allows us to do optimizations on them. For example
we now compile arg-cast.ll to:
_foo:
movl $2147483647, %eax
andl 8(%esp), %eax
ret
where we previously produced:
_foo:
subl $12, %esp
movsd 16(%esp), %xmm0
movsd %xmm0, (%esp)
movl $2147483647, %eax
andl 4(%esp), %eax
addl $12, %esp
ret
It might also make sense to do this for ISD::CALL nodes, which have implicit
stores on many targets.
llvm-svn: 47054
2008-02-13 08:39:09 +01:00
|
|
|
; rdar://5736574
|
|
|
|
|
|
|
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
|
|
|
target triple = "i686-apple-darwin8"
|
|
|
|
|
|
|
|
define i32 @foo(double %x) nounwind {
|
|
|
|
entry:
|
|
|
|
%x15 = bitcast double %x to i64 ; <i64> [#uses=1]
|
|
|
|
%tmp713 = lshr i64 %x15, 32 ; <i64> [#uses=1]
|
|
|
|
%tmp714 = trunc i64 %tmp713 to i32 ; <i32> [#uses=1]
|
|
|
|
%tmp8 = and i32 %tmp714, 2147483647 ; <i32> [#uses=1]
|
|
|
|
ret i32 %tmp8
|
|
|
|
}
|
|
|
|
|