From: Eli Friedman Date: Thu, 9 Jun 2011 23:02:19 +0000 (+0000) Subject: Chris fixed this README a while back by changing how clang generates code for structs... X-Git-Tag: android-x86-6.0-r1~964^2~192 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=6ad046814918e502cf804253af41250d35bea666;p=android-x86%2Fexternal-llvm.git Chris fixed this README a while back by changing how clang generates code for structs like the given struct. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132815 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/README-X86-64.txt b/lib/Target/X86/README-X86-64.txt index e7429a30810..bcfdf0bc56b 100644 --- a/lib/Target/X86/README-X86-64.txt +++ b/lib/Target/X86/README-X86-64.txt @@ -124,51 +124,6 @@ if we have whole-function selectiondags. //===---------------------------------------------------------------------===// -Take the following C code -(from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43640): - -struct u1 -{ - float x; - float y; -}; - -float foo(struct u1 u) -{ - return u.x + u.y; -} - -Optimizes to the following IR: -define float @foo(double %u.0) nounwind readnone { -entry: - %tmp8 = bitcast double %u.0 to i64 ; [#uses=2] - %tmp6 = trunc i64 %tmp8 to i32 ; [#uses=1] - %tmp7 = bitcast i32 %tmp6 to float ; [#uses=1] - %tmp2 = lshr i64 %tmp8, 32 ; [#uses=1] - %tmp3 = trunc i64 %tmp2 to i32 ; [#uses=1] - %tmp4 = bitcast i32 %tmp3 to float ; [#uses=1] - %0 = fadd float %tmp7, %tmp4 ; [#uses=1] - ret float %0 -} - -And current llvm-gcc/clang output: - movd %xmm0, %rax - movd %eax, %xmm1 - shrq $32, %rax - movd %eax, %xmm0 - addss %xmm1, %xmm0 - ret - -We really shouldn't move the floats to RAX, only to immediately move them -straight back to the XMM registers. - -There really isn't any good way to handle this purely in IR optimizers; it -could possibly be handled by changing the output of the fronted, though. It -would also be feasible to add a x86-specific DAGCombine to optimize the -bitcast+trunc+(lshr+)bitcast combination. - -//===---------------------------------------------------------------------===// - Take the following code (from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34653): extern unsigned long table[];