1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mattr=+sse2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; PR2656 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workertarget 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" 5*9880d681SAndroid Build Coastguard Workertarget triple = "i686-apple-darwin9.4.0" 6*9880d681SAndroid Build Coastguard Worker %struct.anon = type <{ float, float }> 7*9880d681SAndroid Build Coastguard Worker@.str = internal constant [17 x i8] c"pt: %.0f, %.0f\0A\00\00" ; <[17 x i8]*> [#uses=1] 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; We can not fold either stack load into an 'xor' instruction because that 10*9880d681SAndroid Build Coastguard Worker; would change what should be a 4-byte load into a 16-byte load. 11*9880d681SAndroid Build Coastguard Worker; We can fold the 16-byte constant load into either 'xor' instruction, 12*9880d681SAndroid Build Coastguard Worker; but we do not. It has more than one use, so it gets loaded into a register. 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine void @foo(%struct.anon* byval %p) nounwind { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo: 16*9880d681SAndroid Build Coastguard Worker; CHECK: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorps %xmm2, %xmm0 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtss2sd %xmm0, %xmm0 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorps %xmm2, %xmm1 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr %struct.anon, %struct.anon* %p, i32 0, i32 0 ; <float*> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker %tmp1 = load float, float* %tmp ; <float> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker %tmp2 = getelementptr %struct.anon, %struct.anon* %p, i32 0, i32 1 ; <float*> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %tmp3 = load float, float* %tmp2 ; <float> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %neg = fsub float -0.000000e+00, %tmp1 ; <float> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker %conv = fpext float %neg to double ; <double> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %neg4 = fsub float -0.000000e+00, %tmp3 ; <float> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker %conv5 = fpext float %neg4 to double ; <double> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker %call = call i32 (...) @printf( i8* getelementptr ([17 x i8], [17 x i8]* @.str, i32 0, i32 0), double %conv, double %conv5 ) ; <i32> [#uses=0] 32*9880d681SAndroid Build Coastguard Worker ret void 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdeclare i32 @printf(...) 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; We can not fold the load from the stack into the 'and' instruction because 38*9880d681SAndroid Build Coastguard Worker; that changes an 8-byte load into a 16-byte load (illegal memory access). 39*9880d681SAndroid Build Coastguard Worker; We can fold the load of the constant because it is a 16-byte vector constant. 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine double @PR22371(double %x) { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: PR22371: 43*9880d681SAndroid Build Coastguard Worker; CHECK: movsd 16(%esp), %xmm0 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd LCPI1_0, %xmm0 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movlpd %xmm0, (%esp) 46*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %x) #0 47*9880d681SAndroid Build Coastguard Worker ret double %call 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdeclare double @fabs(double) #0 51*9880d681SAndroid Build Coastguard Workerattributes #0 = { readnone } 52*9880d681SAndroid Build Coastguard Worker 53