1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-apple-ios5.0.0 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; rdar://10464621 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; DAG combine increases loads from packed types. ARM load / store optimizer then 5*9880d681SAndroid Build Coastguard Worker; combined them into a ldm which causes runtime exception. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker%struct.InformationBlock = type <{ i32, %struct.FlagBits, %struct.FlagBits }> 8*9880d681SAndroid Build Coastguard Worker%struct.FlagBits = type <{ [4 x i32] }> 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@infoBlock = external global %struct.InformationBlock 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine hidden void @foo() { 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo: 14*9880d681SAndroid Build Coastguard Worker; CHECK: ldr.w 15*9880d681SAndroid Build Coastguard Worker; CHECK: ldr.w 16*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldm 17*9880d681SAndroid Build Coastguard Workerentry: 18*9880d681SAndroid Build Coastguard Worker %tmp13 = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 1, i32 0, i32 0), align 1 19*9880d681SAndroid Build Coastguard Worker %tmp15 = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 1, i32 0, i32 1), align 1 20*9880d681SAndroid Build Coastguard Worker %tmp17 = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 1, i32 0, i32 2), align 1 21*9880d681SAndroid Build Coastguard Worker %tmp19 = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 1, i32 0, i32 3), align 1 22*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 2, i32 0, i32 0), align 1 23*9880d681SAndroid Build Coastguard Worker %tmp3 = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 2, i32 0, i32 1), align 1 24*9880d681SAndroid Build Coastguard Worker %tmp4 = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 2, i32 0, i32 2), align 1 25*9880d681SAndroid Build Coastguard Worker %tmp5 = load i32, i32* getelementptr inbounds (%struct.InformationBlock, %struct.InformationBlock* @infoBlock, i32 0, i32 2, i32 0, i32 3), align 1 26*9880d681SAndroid Build Coastguard Worker %insert21 = insertvalue [4 x i32] undef, i32 %tmp13, 0 27*9880d681SAndroid Build Coastguard Worker %insert23 = insertvalue [4 x i32] %insert21, i32 %tmp15, 1 28*9880d681SAndroid Build Coastguard Worker %insert25 = insertvalue [4 x i32] %insert23, i32 %tmp17, 2 29*9880d681SAndroid Build Coastguard Worker %insert27 = insertvalue [4 x i32] %insert25, i32 %tmp19, 3 30*9880d681SAndroid Build Coastguard Worker %insert = insertvalue [4 x i32] undef, i32 %tmp, 0 31*9880d681SAndroid Build Coastguard Worker %insert7 = insertvalue [4 x i32] %insert, i32 %tmp3, 1 32*9880d681SAndroid Build Coastguard Worker %insert9 = insertvalue [4 x i32] %insert7, i32 %tmp4, 2 33*9880d681SAndroid Build Coastguard Worker %insert11 = insertvalue [4 x i32] %insert9, i32 %tmp5, 3 34*9880d681SAndroid Build Coastguard Worker tail call void @bar([4 x i32] %insert27, [4 x i32] %insert11) 35*9880d681SAndroid Build Coastguard Worker ret void 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdeclare void @bar([4 x i32], [4 x i32]) 39