1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-pc-win64 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK: merge_stores_can 4*9880d681SAndroid Build Coastguard Worker; CHECK: callq foo 5*9880d681SAndroid Build Coastguard Worker; CHECK: xorps %xmm0, %xmm0 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl 36(%rsp), %ebp 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movups %xmm0 8*9880d681SAndroid Build Coastguard Worker; CHECK: callq foo 9*9880d681SAndroid Build Coastguard Worker; CHECK: ret 10*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo([10 x i32]* ) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i32 @merge_stores_can() nounwind ssp { 13*9880d681SAndroid Build Coastguard Worker %object1 = alloca [10 x i32] 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker %ret0 = call i32 @foo([10 x i32]* %object1) nounwind 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker %O1_1 = getelementptr [10 x i32], [10 x i32]* %object1, i64 0, i32 1 18*9880d681SAndroid Build Coastguard Worker %O1_2 = getelementptr [10 x i32], [10 x i32]* %object1, i64 0, i32 2 19*9880d681SAndroid Build Coastguard Worker %O1_3 = getelementptr [10 x i32], [10 x i32]* %object1, i64 0, i32 3 20*9880d681SAndroid Build Coastguard Worker %O1_4 = getelementptr [10 x i32], [10 x i32]* %object1, i64 0, i32 4 21*9880d681SAndroid Build Coastguard Worker %ld_ptr = getelementptr [10 x i32], [10 x i32]* %object1, i64 0, i32 9 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_1 24*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_2 25*9880d681SAndroid Build Coastguard Worker %ret = load i32, i32* %ld_ptr ; <--- does not alias. 26*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_3 27*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_4 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker %ret1 = call i32 @foo([10 x i32]* %object1) nounwind 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker ret i32 %ret 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; CHECK: merge_stores_cant 35*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xorps %xmm0, %xmm0 36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movups %xmm0 37*9880d681SAndroid Build Coastguard Worker; CHECK: ret 38*9880d681SAndroid Build Coastguard Workerdefine i32 @merge_stores_cant([10 x i32]* %in0, [10 x i32]* %in1) nounwind ssp { 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker %O1_1 = getelementptr [10 x i32], [10 x i32]* %in1, i64 0, i32 1 41*9880d681SAndroid Build Coastguard Worker %O1_2 = getelementptr [10 x i32], [10 x i32]* %in1, i64 0, i32 2 42*9880d681SAndroid Build Coastguard Worker %O1_3 = getelementptr [10 x i32], [10 x i32]* %in1, i64 0, i32 3 43*9880d681SAndroid Build Coastguard Worker %O1_4 = getelementptr [10 x i32], [10 x i32]* %in1, i64 0, i32 4 44*9880d681SAndroid Build Coastguard Worker %ld_ptr = getelementptr [10 x i32], [10 x i32]* %in0, i64 0, i32 2 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_1 47*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_2 48*9880d681SAndroid Build Coastguard Worker %ret = load i32, i32* %ld_ptr ; <--- may alias 49*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_3 50*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %O1_4 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker ret i32 %ret 53*9880d681SAndroid Build Coastguard Worker} 54