;RUN: llc < %s -mtriple=armv7-none-linux-gnueabi -mattr=+neon -verify-machineinstrs -filetype=obj | llvm-objdump --triple=armv7-none-linux-gnueabi -d - | FileCheck %s --check-prefix=ARM ;RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabi -mattr=+neon -verify-machineinstrs -filetype=obj | llvm-objdump --triple=thumbv7-none-linux-gnueabi -d - | FileCheck %s --check-prefix=THUMB2 ;RUN: llc < %s -mtriple=armv7-none-linux-gnueabi -mattr=-neon -verify-machineinstrs -filetype=obj | llvm-objdump --triple=armv7-none-linux-gnueabi -d - | FileCheck %s --check-prefix=NO_NEON ;We want to have both positive and negative checks for thumb1. These checks ;are not easy to do in a single pass so we generate the output once to a ;temp file and run filecheck twice with different prefixes. ;RUN: llc < %s -mtriple=thumbv5-none-linux-gnueabi -verify-machineinstrs -filetype=obj | llvm-objdump --triple=thumbv5-none-linux-gnueabi -d - > %t ;RUN: cat %t | FileCheck %s --check-prefix=THUMB1 ;RUN: cat %t | FileCheck %s --check-prefix=T1POST ;RUN: llc < %s -mtriple=thumbv8m.base-arm-none-eabi -verify-machineinstrs -filetype=obj | llvm-objdump --triple=thumbv8m.base-arm-none-eabi -d - > %t ;RUN: cat %t | FileCheck %s --check-prefix=THUMB1 ;RUN: cat %t | FileCheck %s --check-prefix=T1POST ;RUN: cat %t | FileCheck %s --check-prefix=V8MBASE ;This file contains auto generated tests for the lowering of passing structs ;byval in the arm backend. We have tests for both packed and unpacked ;structs at varying alignments. Each test is run for arm, thumb2 and thumb1. ;We check for the strings in the generated object code using llvm-objdump ;because it provides better assurance that we are generating instructions ;for the correct architecture. Otherwise we could accidentally generate an ;ARM instruction for THUMB1 and wouldn't detect it because the assembly ;code representation is the same, but the object code would be generated ;incorrectly. For each test we check for the label, a load instruction of the ;correct form, a branch if it will be generated with a loop, and the leftover ;cleanup if the number of bytes does not divide evenly by the store size %struct.A = type <{ [ 10 x i32 ] }> ; 40 bytes declare void @use_A(%struct.A* byval(%struct.A)) %struct.B = type <{ [ 10 x i32 ], i8 }> ; 41 bytes declare void @use_B(%struct.B* byval(%struct.B)) %struct.C = type <{ [ 10 x i32 ], [ 3 x i8 ] }> ; 43 bytes declare void @use_C(%struct.C* byval(%struct.C)) %struct.D = type <{ [ 100 x i32 ] }> ; 400 bytes declare void @use_D(%struct.D* byval(%struct.D)) %struct.E = type <{ [ 100 x i32 ], i8 }> ; 401 bytes declare void @use_E(%struct.E* byval(%struct.E)) %struct.F = type <{ [ 100 x i32 ], [ 3 x i8 ] }> ; 403 bytes declare void @use_F(%struct.F* byval(%struct.F)) %struct.G = type { [ 10 x i32 ] } ; 40 bytes declare void @use_G(%struct.G* byval(%struct.G)) %struct.H = type { [ 10 x i32 ], i8 } ; 41 bytes declare void @use_H(%struct.H* byval(%struct.H)) %struct.I = type { [ 10 x i32 ], [ 3 x i8 ] } ; 43 bytes declare void @use_I(%struct.I* byval(%struct.I)) %struct.J = type { [ 100 x i32 ] } ; 400 bytes declare void @use_J(%struct.J* byval(%struct.J)) %struct.K = type { [ 100 x i32 ], i8 } ; 401 bytes declare void @use_K(%struct.K* byval(%struct.K)) %struct.L = type { [ 100 x i32 ], [ 3 x i8 ] } ; 403 bytes declare void @use_L(%struct.L* byval(%struct.L)) %struct.M = type { [ 64 x i8 ] } ; 64 bytes declare void @use_M(%struct.M* byval(%struct.M)) %struct.N = type { [ 128 x i8 ] } ; 128 bytes declare void @use_N(%struct.N* byval(%struct.N)) ;ARM-LABEL: <test_A_1>: ;THUMB2-LABEL: <test_A_1>: ;NO_NEON-LABEL:<test_A_1>: ;THUMB1-LABEL: <test_A_1>: ;T1POST-LABEL: <test_A_1>: define void @test_A_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.A, align 1 call void @use_A(%struct.A* byval(%struct.A) align 1 %a) ret void } ;ARM-LABEL: <test_A_2>: ;THUMB2-LABEL: <test_A_2>: ;NO_NEON-LABEL:<test_A_2>: ;THUMB1-LABEL: <test_A_2>: ;T1POST-LABEL: <test_A_2>: define void @test_A_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.A, align 2 call void @use_A(%struct.A* byval(%struct.A) align 2 %a) ret void } ;ARM-LABEL: <test_A_4>: ;THUMB2-LABEL: <test_A_4>: ;NO_NEON-LABEL:<test_A_4>: ;THUMB1-LABEL: <test_A_4>: ;T1POST-LABEL: <test_A_4>: define void @test_A_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.A, align 4 call void @use_A(%struct.A* byval(%struct.A) align 4 %a) ret void } ;ARM-LABEL: <test_A_8>: ;THUMB2-LABEL: <test_A_8>: ;NO_NEON-LABEL:<test_A_8>: ;THUMB1-LABEL: <test_A_8>: ;T1POST-LABEL: <test_A_8>: define void @test_A_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.A, align 8 call void @use_A(%struct.A* byval(%struct.A) align 8 %a) ret void } ;ARM-LABEL: <test_A_16>: ;THUMB2-LABEL: <test_A_16>: ;NO_NEON-LABEL:<test_A_16>: ;THUMB1-LABEL: <test_A_16>: ;T1POST-LABEL: <test_A_16>: define void @test_A_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.A, align 16 call void @use_A(%struct.A* byval(%struct.A) align 16 %a) ret void } ;ARM-LABEL: <test_B_1>: ;THUMB2-LABEL: <test_B_1>: ;NO_NEON-LABEL:<test_B_1>: ;THUMB1-LABEL: <test_B_1>: ;T1POST-LABEL: <test_B_1>: define void @test_B_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.B, align 1 call void @use_B(%struct.B* byval(%struct.B) align 1 %a) ret void } ;ARM-LABEL: <test_B_2>: ;THUMB2-LABEL: <test_B_2>: ;NO_NEON-LABEL:<test_B_2>: ;THUMB1-LABEL: <test_B_2>: ;T1POST-LABEL: <test_B_2>: define void @test_B_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.B, align 2 call void @use_B(%struct.B* byval(%struct.B) align 2 %a) ret void } ;ARM-LABEL: <test_B_4>: ;THUMB2-LABEL: <test_B_4>: ;NO_NEON-LABEL:<test_B_4>: ;THUMB1-LABEL: <test_B_4>: ;T1POST-LABEL: <test_B_4>: define void @test_B_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.B, align 4 call void @use_B(%struct.B* byval(%struct.B) align 4 %a) ret void } ;ARM-LABEL: <test_B_8>: ;THUMB2-LABEL: <test_B_8>: ;NO_NEON-LABEL:<test_B_8>: ;THUMB1-LABEL: <test_B_8>: ;T1POST-LABEL: <test_B_8>: define void @test_B_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.B, align 8 call void @use_B(%struct.B* byval(%struct.B) align 8 %a) ret void } ;ARM-LABEL: <test_B_16>: ;THUMB2-LABEL: <test_B_16>: ;NO_NEON-LABEL:<test_B_16>: ;THUMB1-LABEL: <test_B_16>: ;T1POST-LABEL: <test_B_16>: define void @test_B_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.B, align 16 call void @use_B(%struct.B* byval(%struct.B) align 16 %a) ret void } ;ARM-LABEL: <test_C_1>: ;THUMB2-LABEL: <test_C_1>: ;NO_NEON-LABEL:<test_C_1>: ;THUMB1-LABEL: <test_C_1>: ;T1POST-LABEL: <test_C_1>: define void @test_C_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.C, align 1 call void @use_C(%struct.C* byval(%struct.C) align 1 %a) ret void } ;ARM-LABEL: <test_C_2>: ;THUMB2-LABEL: <test_C_2>: ;NO_NEON-LABEL:<test_C_2>: ;THUMB1-LABEL: <test_C_2>: ;T1POST-LABEL: <test_C_2>: define void @test_C_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.C, align 2 call void @use_C(%struct.C* byval(%struct.C) align 2 %a) ret void } ;ARM-LABEL: <test_C_4>: ;THUMB2-LABEL: <test_C_4>: ;NO_NEON-LABEL:<test_C_4>: ;THUMB1-LABEL: <test_C_4>: ;T1POST-LABEL: <test_C_4>: define void @test_C_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.C, align 4 call void @use_C(%struct.C* byval(%struct.C) align 4 %a) ret void } ;ARM-LABEL: <test_C_8>: ;THUMB2-LABEL: <test_C_8>: ;NO_NEON-LABEL:<test_C_8>: ;THUMB1-LABEL: <test_C_8>: ;T1POST-LABEL: <test_C_8>: define void @test_C_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.C, align 8 call void @use_C(%struct.C* byval(%struct.C) align 8 %a) ret void } ;ARM-LABEL: <test_C_16>: ;THUMB2-LABEL: <test_C_16>: ;NO_NEON-LABEL:<test_C_16>: ;THUMB1-LABEL: <test_C_16>: ;T1POST-LABEL: <test_C_16>: define void @test_C_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.C, align 16 call void @use_C(%struct.C* byval(%struct.C) align 16 %a) ret void } ;ARM-LABEL: <test_D_1>: ;THUMB2-LABEL: <test_D_1>: ;NO_NEON-LABEL:<test_D_1>: ;THUMB1-LABEL: <test_D_1>: ;T1POST-LABEL: <test_D_1>: define void @test_D_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;ARM: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;THUMB1: bne ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.D, align 1 call void @use_D(%struct.D* byval(%struct.D) align 1 %a) ret void } ;ARM-LABEL: <test_D_2>: ;THUMB2-LABEL: <test_D_2>: ;NO_NEON-LABEL:<test_D_2>: ;THUMB1-LABEL: <test_D_2>: ;T1POST-LABEL: <test_D_2>: define void @test_D_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: bne ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: bne ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: bne ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: bne ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.D, align 2 call void @use_D(%struct.D* byval(%struct.D) align 2 %a) ret void } ;ARM-LABEL: <test_D_4>: ;THUMB2-LABEL: <test_D_4>: ;NO_NEON-LABEL:<test_D_4>: ;THUMB1-LABEL: <test_D_4>: ;T1POST-LABEL: <test_D_4>: define void @test_D_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: bne ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.D, align 4 call void @use_D(%struct.D* byval(%struct.D) align 4 %a) ret void } ;ARM-LABEL: <test_D_8>: ;THUMB2-LABEL: <test_D_8>: ;NO_NEON-LABEL:<test_D_8>: ;THUMB1-LABEL: <test_D_8>: ;T1POST-LABEL: <test_D_8>: define void @test_D_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.D, align 8 call void @use_D(%struct.D* byval(%struct.D) align 8 %a) ret void } ;ARM-LABEL: <test_D_16>: ;THUMB2-LABEL: <test_D_16>: ;NO_NEON-LABEL:<test_D_16>: ;THUMB1-LABEL: <test_D_16>: ;T1POST-LABEL: <test_D_16>: define void @test_D_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.D, align 16 call void @use_D(%struct.D* byval(%struct.D) align 16 %a) ret void } ;ARM-LABEL: <test_E_1>: ;THUMB2-LABEL: <test_E_1>: ;NO_NEON-LABEL:<test_E_1>: ;THUMB1-LABEL: <test_E_1>: ;T1POST-LABEL: <test_E_1>: define void @test_E_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;ARM: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;THUMB1: bne ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.E, align 1 call void @use_E(%struct.E* byval(%struct.E) align 1 %a) ret void } ;ARM-LABEL: <test_E_2>: ;THUMB2-LABEL: <test_E_2>: ;NO_NEON-LABEL:<test_E_2>: ;THUMB1-LABEL: <test_E_2>: ;T1POST-LABEL: <test_E_2>: define void @test_E_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.E, align 2 call void @use_E(%struct.E* byval(%struct.E) align 2 %a) ret void } ;ARM-LABEL: <test_E_4>: ;THUMB2-LABEL: <test_E_4>: ;NO_NEON-LABEL:<test_E_4>: ;THUMB1-LABEL: <test_E_4>: ;T1POST-LABEL: <test_E_4>: define void @test_E_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.E, align 4 call void @use_E(%struct.E* byval(%struct.E) align 4 %a) ret void } ;ARM-LABEL: <test_E_8>: ;THUMB2-LABEL: <test_E_8>: ;NO_NEON-LABEL:<test_E_8>: ;THUMB1-LABEL: <test_E_8>: ;T1POST-LABEL: <test_E_8>: define void @test_E_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.E, align 8 call void @use_E(%struct.E* byval(%struct.E) align 8 %a) ret void } ;ARM-LABEL: <test_E_16>: ;THUMB2-LABEL: <test_E_16>: ;NO_NEON-LABEL:<test_E_16>: ;THUMB1-LABEL: <test_E_16>: ;T1POST-LABEL: <test_E_16>: define void @test_E_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.E, align 16 call void @use_E(%struct.E* byval(%struct.E) align 16 %a) ret void } ;ARM-LABEL: <test_F_1>: ;THUMB2-LABEL: <test_F_1>: ;NO_NEON-LABEL:<test_F_1>: ;THUMB1-LABEL: <test_F_1>: ;T1POST-LABEL: <test_F_1>: define void @test_F_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;ARM: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;THUMB1: bne ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.F, align 1 call void @use_F(%struct.F* byval(%struct.F) align 1 %a) ret void } ;ARM-LABEL: <test_F_2>: ;THUMB2-LABEL: <test_F_2>: ;NO_NEON-LABEL:<test_F_2>: ;THUMB1-LABEL: <test_F_2>: ;T1POST-LABEL: <test_F_2>: define void @test_F_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.F, align 2 call void @use_F(%struct.F* byval(%struct.F) align 2 %a) ret void } ;ARM-LABEL: <test_F_4>: ;THUMB2-LABEL: <test_F_4>: ;NO_NEON-LABEL:<test_F_4>: ;THUMB1-LABEL: <test_F_4>: ;T1POST-LABEL: <test_F_4>: define void @test_F_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.F, align 4 call void @use_F(%struct.F* byval(%struct.F) align 4 %a) ret void } ;ARM-LABEL: <test_F_8>: ;THUMB2-LABEL: <test_F_8>: ;NO_NEON-LABEL:<test_F_8>: ;THUMB1-LABEL: <test_F_8>: ;T1POST-LABEL: <test_F_8>: define void @test_F_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.F, align 8 call void @use_F(%struct.F* byval(%struct.F) align 8 %a) ret void } ;ARM-LABEL: <test_F_16>: ;THUMB2-LABEL: <test_F_16>: ;NO_NEON-LABEL:<test_F_16>: ;THUMB1-LABEL: <test_F_16>: ;T1POST-LABEL: <test_F_16>: define void @test_F_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.F, align 16 call void @use_F(%struct.F* byval(%struct.F) align 16 %a) ret void } ;ARM-LABEL: <test_G_1>: ;THUMB2-LABEL: <test_G_1>: ;NO_NEON-LABEL:<test_G_1>: ;THUMB1-LABEL: <test_G_1>: ;T1POST-LABEL: <test_G_1>: define void @test_G_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.G, align 1 call void @use_G(%struct.G* byval(%struct.G) align 1 %a) ret void } ;ARM-LABEL: <test_G_2>: ;THUMB2-LABEL: <test_G_2>: ;NO_NEON-LABEL:<test_G_2>: ;THUMB1-LABEL: <test_G_2>: ;T1POST-LABEL: <test_G_2>: define void @test_G_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.G, align 2 call void @use_G(%struct.G* byval(%struct.G) align 2 %a) ret void } ;ARM-LABEL: <test_G_4>: ;THUMB2-LABEL: <test_G_4>: ;NO_NEON-LABEL:<test_G_4>: ;THUMB1-LABEL: <test_G_4>: ;T1POST-LABEL: <test_G_4>: define void @test_G_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.G, align 4 call void @use_G(%struct.G* byval(%struct.G) align 4 %a) ret void } ;ARM-LABEL: <test_G_8>: ;THUMB2-LABEL: <test_G_8>: ;NO_NEON-LABEL:<test_G_8>: ;THUMB1-LABEL: <test_G_8>: ;T1POST-LABEL: <test_G_8>: define void @test_G_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.G, align 8 call void @use_G(%struct.G* byval(%struct.G) align 8 %a) ret void } ;ARM-LABEL: <test_G_16>: ;THUMB2-LABEL: <test_G_16>: ;NO_NEON-LABEL:<test_G_16>: ;THUMB1-LABEL: <test_G_16>: ;T1POST-LABEL: <test_G_16>: define void @test_G_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.G, align 16 call void @use_G(%struct.G* byval(%struct.G) align 16 %a) ret void } ;ARM-LABEL: <test_H_1>: ;THUMB2-LABEL: <test_H_1>: ;NO_NEON-LABEL:<test_H_1>: ;THUMB1-LABEL: <test_H_1>: ;T1POST-LABEL: <test_H_1>: define void @test_H_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.H, align 1 call void @use_H(%struct.H* byval(%struct.H) align 1 %a) ret void } ;ARM-LABEL: <test_H_2>: ;THUMB2-LABEL: <test_H_2>: ;NO_NEON-LABEL:<test_H_2>: ;THUMB1-LABEL: <test_H_2>: ;T1POST-LABEL: <test_H_2>: define void @test_H_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.H, align 2 call void @use_H(%struct.H* byval(%struct.H) align 2 %a) ret void } ;ARM-LABEL: <test_H_4>: ;THUMB2-LABEL: <test_H_4>: ;NO_NEON-LABEL:<test_H_4>: ;THUMB1-LABEL: <test_H_4>: ;T1POST-LABEL: <test_H_4>: define void @test_H_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.H, align 4 call void @use_H(%struct.H* byval(%struct.H) align 4 %a) ret void } ;ARM-LABEL: <test_H_8>: ;THUMB2-LABEL: <test_H_8>: ;NO_NEON-LABEL:<test_H_8>: ;THUMB1-LABEL: <test_H_8>: ;T1POST-LABEL: <test_H_8>: define void @test_H_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.H, align 8 call void @use_H(%struct.H* byval(%struct.H) align 8 %a) ret void } ;ARM-LABEL: <test_H_16>: ;THUMB2-LABEL: <test_H_16>: ;NO_NEON-LABEL:<test_H_16>: ;THUMB1-LABEL: <test_H_16>: ;T1POST-LABEL: <test_H_16>: define void @test_H_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.H, align 16 call void @use_H(%struct.H* byval(%struct.H) align 16 %a) ret void } ;ARM-LABEL: <test_I_1>: ;THUMB2-LABEL: <test_I_1>: ;NO_NEON-LABEL:<test_I_1>: ;THUMB1-LABEL: <test_I_1>: ;T1POST-LABEL: <test_I_1>: define void @test_I_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.I, align 1 call void @use_I(%struct.I* byval(%struct.I) align 1 %a) ret void } ;ARM-LABEL: <test_I_2>: ;THUMB2-LABEL: <test_I_2>: ;NO_NEON-LABEL:<test_I_2>: ;THUMB1-LABEL: <test_I_2>: ;T1POST-LABEL: <test_I_2>: define void @test_I_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.I, align 2 call void @use_I(%struct.I* byval(%struct.I) align 2 %a) ret void } ;ARM-LABEL: <test_I_4>: ;THUMB2-LABEL: <test_I_4>: ;NO_NEON-LABEL:<test_I_4>: ;THUMB1-LABEL: <test_I_4>: ;T1POST-LABEL: <test_I_4>: define void @test_I_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.I, align 4 call void @use_I(%struct.I* byval(%struct.I) align 4 %a) ret void } ;ARM-LABEL: <test_I_8>: ;THUMB2-LABEL: <test_I_8>: ;NO_NEON-LABEL:<test_I_8>: ;THUMB1-LABEL: <test_I_8>: ;T1POST-LABEL: <test_I_8>: define void @test_I_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.I, align 8 call void @use_I(%struct.I* byval(%struct.I) align 8 %a) ret void } ;ARM-LABEL: <test_I_16>: ;THUMB2-LABEL: <test_I_16>: ;NO_NEON-LABEL:<test_I_16>: ;THUMB1-LABEL: <test_I_16>: ;T1POST-LABEL: <test_I_16>: define void @test_I_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.I, align 16 call void @use_I(%struct.I* byval(%struct.I) align 16 %a) ret void } ;ARM-LABEL: <test_J_1>: ;THUMB2-LABEL: <test_J_1>: ;NO_NEON-LABEL:<test_J_1>: ;THUMB1-LABEL: <test_J_1>: ;T1POST-LABEL: <test_J_1>: define void @test_J_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;ARM: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;THUMB1: bne ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.J, align 1 call void @use_J(%struct.J* byval(%struct.J) align 1 %a) ret void } ;ARM-LABEL: <test_J_2>: ;THUMB2-LABEL: <test_J_2>: ;NO_NEON-LABEL:<test_J_2>: ;THUMB1-LABEL: <test_J_2>: ;T1POST-LABEL: <test_J_2>: define void @test_J_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: bne ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: bne ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: bne ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: bne ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.J, align 2 call void @use_J(%struct.J* byval(%struct.J) align 2 %a) ret void } ;ARM-LABEL: <test_J_4>: ;THUMB2-LABEL: <test_J_4>: ;NO_NEON-LABEL:<test_J_4>: ;THUMB1-LABEL: <test_J_4>: ;T1POST-LABEL: <test_J_4>: define void @test_J_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: bne ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.J, align 4 call void @use_J(%struct.J* byval(%struct.J) align 4 %a) ret void } ;ARM-LABEL: <test_J_8>: ;THUMB2-LABEL: <test_J_8>: ;NO_NEON-LABEL:<test_J_8>: ;THUMB1-LABEL: <test_J_8>: ;T1POST-LABEL: <test_J_8>: define void @test_J_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.J, align 8 call void @use_J(%struct.J* byval(%struct.J) align 8 %a) ret void } ;ARM-LABEL: <test_J_16>: ;THUMB2-LABEL: <test_J_16>: ;NO_NEON-LABEL:<test_J_16>: ;THUMB1-LABEL: <test_J_16>: ;T1POST-LABEL: <test_J_16>: define void @test_J_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.J, align 16 call void @use_J(%struct.J* byval(%struct.J) align 16 %a) ret void } ;ARM-LABEL: <test_K_1>: ;THUMB2-LABEL: <test_K_1>: ;NO_NEON-LABEL:<test_K_1>: ;THUMB1-LABEL: <test_K_1>: ;T1POST-LABEL: <test_K_1>: define void @test_K_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;ARM: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;THUMB1: bne ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.K, align 1 call void @use_K(%struct.K* byval(%struct.K) align 1 %a) ret void } ;ARM-LABEL: <test_K_2>: ;THUMB2-LABEL: <test_K_2>: ;NO_NEON-LABEL:<test_K_2>: ;THUMB1-LABEL: <test_K_2>: ;T1POST-LABEL: <test_K_2>: define void @test_K_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: bne ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: bne ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: bne ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: bne ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.K, align 2 call void @use_K(%struct.K* byval(%struct.K) align 2 %a) ret void } ;ARM-LABEL: <test_K_4>: ;THUMB2-LABEL: <test_K_4>: ;NO_NEON-LABEL:<test_K_4>: ;THUMB1-LABEL: <test_K_4>: ;T1POST-LABEL: <test_K_4>: define void @test_K_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: bne ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.K, align 4 call void @use_K(%struct.K* byval(%struct.K) align 4 %a) ret void } ;ARM-LABEL: <test_K_8>: ;THUMB2-LABEL: <test_K_8>: ;NO_NEON-LABEL:<test_K_8>: ;THUMB1-LABEL: <test_K_8>: ;T1POST-LABEL: <test_K_8>: define void @test_K_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.K, align 8 call void @use_K(%struct.K* byval(%struct.K) align 8 %a) ret void } ;ARM-LABEL: <test_K_16>: ;THUMB2-LABEL: <test_K_16>: ;NO_NEON-LABEL:<test_K_16>: ;THUMB1-LABEL: <test_K_16>: ;T1POST-LABEL: <test_K_16>: define void @test_K_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.K, align 16 call void @use_K(%struct.K* byval(%struct.K) align 16 %a) ret void } ;ARM-LABEL: <test_L_1>: ;THUMB2-LABEL: <test_L_1>: ;NO_NEON-LABEL:<test_L_1>: ;THUMB1-LABEL: <test_L_1>: ;T1POST-LABEL: <test_L_1>: define void @test_L_1() { ;ARM: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;ARM: bne ;THUMB2: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;THUMB2: bne ;NO_NEON: ldrb r{{[0-9]+}}, [{{.*}}], #1 ;NO_NEON: bne ;THUMB1: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #1 ;THUMB1: bne ;T1POST-NOT: ldrb r{{[0-9]+}}, [{{.*}}], #1 entry: %a = alloca %struct.L, align 1 call void @use_L(%struct.L* byval(%struct.L) align 1 %a) ret void } ;ARM-LABEL: <test_L_2>: ;THUMB2-LABEL: <test_L_2>: ;NO_NEON-LABEL:<test_L_2>: ;THUMB1-LABEL: <test_L_2>: ;T1POST-LABEL: <test_L_2>: define void @test_L_2() { ;ARM: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;ARM: bne ;THUMB2: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;THUMB2: bne ;NO_NEON: ldrh r{{[0-9]+}}, [{{.*}}], #2 ;NO_NEON: bne ;THUMB1: ldrh r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #2 ;THUMB1: bne ;T1POST-NOT: ldrh r{{[0-9]+}}, [{{.*}}], #2 entry: %a = alloca %struct.L, align 2 call void @use_L(%struct.L* byval(%struct.L) align 2 %a) ret void } ;ARM-LABEL: <test_L_4>: ;THUMB2-LABEL: <test_L_4>: ;NO_NEON-LABEL:<test_L_4>: ;THUMB1-LABEL: <test_L_4>: ;T1POST-LABEL: <test_L_4>: define void @test_L_4() { ;ARM: ldr r{{[0-9]+}}, [{{.*}}], #4 ;ARM: bne ;THUMB2: ldr r{{[0-9]+}}, [{{.*}}], #4 ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: ldr r{{[0-9]+}}, [{{.*}}], #4 entry: %a = alloca %struct.L, align 4 call void @use_L(%struct.L* byval(%struct.L) align 4 %a) ret void } ;ARM-LABEL: <test_L_8>: ;THUMB2-LABEL: <test_L_8>: ;NO_NEON-LABEL:<test_L_8>: ;THUMB1-LABEL: <test_L_8>: ;T1POST-LABEL: <test_L_8>: define void @test_L_8() { ;ARM: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.L, align 8 call void @use_L(%struct.L* byval(%struct.L) align 8 %a) ret void } ;ARM-LABEL: <test_L_16>: ;THUMB2-LABEL: <test_L_16>: ;NO_NEON-LABEL:<test_L_16>: ;THUMB1-LABEL: <test_L_16>: ;T1POST-LABEL: <test_L_16>: define void @test_L_16() { ;ARM: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;ARM: bne ;THUMB2: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB2: bne ;NO_NEON: ldr r{{[0-9]+}}, [{{.*}}], #4 ;NO_NEON: bne ;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! ;THUMB1: ldr r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;THUMB1: adds [[BASE]], #4 ;THUMB1: bne ;T1POST-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]! entry: %a = alloca %struct.L, align 16 call void @use_L(%struct.L* byval(%struct.L) align 16 %a) ret void } ;V8MBASE-LABEL: <test_M>: define void @test_M() { ;V8MBASE: ldrb r{{[0-9]+}}, [[[BASE:r[0-9]+]]] ;V8MBASE: adds [[BASE]], #1 ;V8MBASE-NOT: movw entry: %a = alloca %struct.M, align 1 call void @use_M(%struct.M* byval(%struct.M) align 1 %a) ret void } ;V8MBASE-LABEL: <test_N>: define void @test_N() { ;V8MBASE: movw r{{[0-9]+}}, #{{[0-9]+}} ;V8MBASE-NOT: b #{{[0-9]+}} entry: %a = alloca %struct.N, align 1 call void @use_N(%struct.N* byval(%struct.N) align 1 %a) ret void }