brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.3 KiB · 4bbfd91 Raw
372 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s | FileCheck %s3; RUN: llc -early-live-intervals < %s | FileCheck %s4target triple = "thumbv6m-unknown-unknown-eabi"5 6define void @vla_emergency_spill(i32 %n) {7; CHECK-LABEL: vla_emergency_spill:8; CHECK:       @ %bb.0: @ %entry9; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}10; CHECK-NEXT:    push {r4, r5, r6, r7, lr}11; CHECK-NEXT:    .setfp r7, sp, #1212; CHECK-NEXT:    add r7, sp, #1213; CHECK-NEXT:    ldr r6, .LCPI0_014; CHECK-NEXT:    .pad #410015; CHECK-NEXT:    add sp, r616; CHECK-NEXT:    mov r6, sp17; CHECK-NEXT:    adds r0, r0, #718; CHECK-NEXT:    movs r1, #719; CHECK-NEXT:    bics r0, r120; CHECK-NEXT:    mov r1, sp21; CHECK-NEXT:    subs r0, r1, r022; CHECK-NEXT:    mov sp, r023; CHECK-NEXT:    adds r1, r6, #424; CHECK-NEXT:    @APP25; CHECK-NEXT:    @NO_APP26; CHECK-NEXT:    str r0, [r6]27; CHECK-NEXT:    ldr r0, .LCPI0_128; CHECK-NEXT:    str r5, [r0, r6]29; CHECK-NEXT:    ldr r0, [r6]30; CHECK-NEXT:    @APP31; CHECK-NEXT:    @NO_APP32; CHECK-NEXT:    subs r6, r7, #733; CHECK-NEXT:    subs r6, #534; CHECK-NEXT:    mov sp, r635; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}36; CHECK-NEXT:    .p2align 237; CHECK-NEXT:  @ %bb.1:38; CHECK-NEXT:  .LCPI0_0:39; CHECK-NEXT:    .long 4294963196 @ 0xffffeffc40; CHECK-NEXT:  .LCPI0_1:41; CHECK-NEXT:    .long 1024 @ 0x40042entry:43  %x = alloca [1024 x i32], align 444  %vla = alloca i8, i32 %n, align 145  %asm1 = call { i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},0,1,2,3,4,5"(ptr %vla, ptr %x, i32 undef, i32 undef, i32 undef, i32 undef)46  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 047  %asmresult1 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 148  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 249  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 350  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 451  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 552  %arrayidx = getelementptr inbounds [1024 x i32], ptr %x, i32 0, i32 25553  store i32 %asmresult5, ptr %arrayidx, align 454  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5}"(i32 %asmresult, i32 %asmresult1, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5) #255  ret void56}57 58define void @simple_emergency_spill(i32 %n) {59; CHECK-LABEL: simple_emergency_spill:60; CHECK:       @ %bb.0: @ %entry61; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}62; CHECK-NEXT:    push {r4, r5, r6, r7, lr}63; CHECK-NEXT:    ldr r7, .LCPI1_064; CHECK-NEXT:    .pad #819665; CHECK-NEXT:    add sp, r766; CHECK-NEXT:    add r0, sp, #467; CHECK-NEXT:    ldr r1, .LCPI1_368; CHECK-NEXT:    add r1, sp69; CHECK-NEXT:    @APP70; CHECK-NEXT:    @NO_APP71; CHECK-NEXT:    str r0, [sp]72; CHECK-NEXT:    ldr r0, .LCPI1_273; CHECK-NEXT:    add r0, sp74; CHECK-NEXT:    str r5, [r0]75; CHECK-NEXT:    ldr r0, [sp]76; CHECK-NEXT:    @APP77; CHECK-NEXT:    @NO_APP78; CHECK-NEXT:    ldr r7, .LCPI1_179; CHECK-NEXT:    add sp, r780; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}81; CHECK-NEXT:    .p2align 282; CHECK-NEXT:  @ %bb.1:83; CHECK-NEXT:  .LCPI1_0:84; CHECK-NEXT:    .long 4294959100 @ 0xffffdffc85; CHECK-NEXT:  .LCPI1_1:86; CHECK-NEXT:    .long 8196 @ 0x200487; CHECK-NEXT:  .LCPI1_2:88; CHECK-NEXT:    .long 5120 @ 0x140089; CHECK-NEXT:  .LCPI1_3:90; CHECK-NEXT:    .long 4100 @ 0x100491entry:92  %x = alloca [1024 x i32], align 493  %y = alloca [1024 x i32], align 494  %asm1 = call { i32, i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},={r7},0,1,2,3,4,5,6,7"(ptr %y, ptr %x, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)95  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 096  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 197  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 298  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 399  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 4100  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 5101  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 6102  %asmresult8 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 7103  %arrayidx = getelementptr inbounds [1024 x i32], ptr %x, i32 0, i32 255104  store i32 %asmresult6, ptr %arrayidx, align 4105  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6},{r7}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7, i32 %asmresult8)106  ret void107}108 109; We have some logic to try to spill registers instead of allocating an110; emergency spill slot, but for targets where the stack alignment is 8,111; it only triggers when there are two available registers.  (This is112; maybe worth looking into, to improve the generated code quality.)113;114; The scavenger itself only cares whether a register is allocatable, not115; whether it was actually spilled in the prologue, and r7 is first on116; the priority list, so we use it anyway.  This is likely to confuse117; debuggers, so maybe worth changing at some point.118define void @simple_emergency_spill_nor7(i32 %n) {119; CHECK-LABEL: simple_emergency_spill_nor7:120; CHECK:       @ %bb.0: @ %entry121; CHECK-NEXT:    .save {r4, r5, r6, lr}122; CHECK-NEXT:    push {r4, r5, r6, lr}123; CHECK-NEXT:    ldr r6, .LCPI2_0124; CHECK-NEXT:    .pad #8196125; CHECK-NEXT:    add sp, r6126; CHECK-NEXT:    add r0, sp, #4127; CHECK-NEXT:    ldr r1, .LCPI2_3128; CHECK-NEXT:    add r1, sp129; CHECK-NEXT:    @APP130; CHECK-NEXT:    @NO_APP131; CHECK-NEXT:    str r7, [sp]132; CHECK-NEXT:    ldr r7, .LCPI2_2133; CHECK-NEXT:    add r7, sp134; CHECK-NEXT:    str r5, [r7]135; CHECK-NEXT:    ldr r7, [sp]136; CHECK-NEXT:    @APP137; CHECK-NEXT:    @NO_APP138; CHECK-NEXT:    ldr r6, .LCPI2_1139; CHECK-NEXT:    add sp, r6140; CHECK-NEXT:    pop {r4, r5, r6, pc}141; CHECK-NEXT:    .p2align 2142; CHECK-NEXT:  @ %bb.1:143; CHECK-NEXT:  .LCPI2_0:144; CHECK-NEXT:    .long 4294959100 @ 0xffffdffc145; CHECK-NEXT:  .LCPI2_1:146; CHECK-NEXT:    .long 8196 @ 0x2004147; CHECK-NEXT:  .LCPI2_2:148; CHECK-NEXT:    .long 5120 @ 0x1400149; CHECK-NEXT:  .LCPI2_3:150; CHECK-NEXT:    .long 4100 @ 0x1004151entry:152  %x = alloca [1024 x i32], align 4153  %y = alloca [1024 x i32], align 4154  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"(ptr %y, ptr %x, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)155  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0156  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1157  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2158  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3159  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4160  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5161  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6162  %arrayidx = getelementptr inbounds [1024 x i32], ptr %x, i32 0, i32 255163  store i32 %asmresult6, ptr %arrayidx, align 4164  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)165  ret void166}167 168define void @arg_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, ptr byval([252 x i32]) %p) {169; CHECK-LABEL: arg_emergency_spill:170; CHECK:       @ %bb.0: @ %entry171; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}172; CHECK-NEXT:    push {r4, r5, r6, r7, lr}173; CHECK-NEXT:    .pad #4174; CHECK-NEXT:    sub sp, #4175; CHECK-NEXT:    add r0, sp, #24176; CHECK-NEXT:    @APP177; CHECK-NEXT:    @NO_APP178; CHECK-NEXT:    str r0, [sp]179; CHECK-NEXT:    add r0, sp, #904180; CHECK-NEXT:    str r5, [r0, #124]181; CHECK-NEXT:    ldr r0, [sp]182; CHECK-NEXT:    @APP183; CHECK-NEXT:    @NO_APP184; CHECK-NEXT:    add sp, #4185; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}186entry:187  %asm1 = call { i32, i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},={r7},0,1,2,3,4,5,6,7"(ptr %p, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)188  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 0189  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 1190  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 2191  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 3192  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 4193  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 5194  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 6195  %asmresult8 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 7196  %arrayidx = getelementptr inbounds i32, ptr %p, i32 251197  store i32 %asmresult6, ptr %arrayidx, align 4198  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6},{r7}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7, i32 %asmresult8)199  ret void200}201 202; We currently overestimate the amount of required stack space by 16 bytes,203; so this is the largest stack that doesn't require an emergency spill slot.204define void @arg_no_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, ptr byval([248 x i32]) %p) {205; CHECK-LABEL: arg_no_emergency_spill:206; CHECK:       @ %bb.0: @ %entry207; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}208; CHECK-NEXT:    push {r4, r5, r6, r7, lr}209; CHECK-NEXT:    add r0, sp, #20210; CHECK-NEXT:    @APP211; CHECK-NEXT:    @NO_APP212; CHECK-NEXT:    str r5, [sp, #1008]213; CHECK-NEXT:    @APP214; CHECK-NEXT:    @NO_APP215; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}216entry:217  %asm1 = call { i32, i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},={r7},0,1,2,3,4,5,6,7"(ptr %p, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)218  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 0219  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 1220  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 2221  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 3222  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 4223  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 5224  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 6225  %asmresult8 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 7226  %arrayidx = getelementptr inbounds i32, ptr %p, i32 247227  store i32 %asmresult6, ptr %arrayidx, align 4228  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6},{r7}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7, i32 %asmresult8)229  ret void230}231 232define void @aligned_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, ptr byval([31 x i32]) %p) {233; CHECK-LABEL: aligned_emergency_spill:234; CHECK:       @ %bb.0: @ %entry235; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}236; CHECK-NEXT:    push {r4, r5, r6, r7, lr}237; CHECK-NEXT:    .setfp r7, sp, #12238; CHECK-NEXT:    add r7, sp, #12239; CHECK-NEXT:    .pad #44240; CHECK-NEXT:    sub sp, #44241; CHECK-NEXT:    mov r4, sp242; CHECK-NEXT:    lsrs r4, r4, #4243; CHECK-NEXT:    lsls r4, r4, #4244; CHECK-NEXT:    mov sp, r4245; CHECK-NEXT:    add r0, sp, #16246; CHECK-NEXT:    adds r1, r7, #7247; CHECK-NEXT:    adds r1, #1248; CHECK-NEXT:    @APP249; CHECK-NEXT:    @NO_APP250; CHECK-NEXT:    str r0, [sp]251; CHECK-NEXT:    ldr r0, .LCPI5_0252; CHECK-NEXT:    str r5, [r0, r7]253; CHECK-NEXT:    ldr r0, [sp]254; CHECK-NEXT:    @APP255; CHECK-NEXT:    @NO_APP256; CHECK-NEXT:    subs r6, r7, #7257; CHECK-NEXT:    subs r6, #5258; CHECK-NEXT:    mov sp, r6259; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}260; CHECK-NEXT:    .p2align 2261; CHECK-NEXT:  @ %bb.1:262; CHECK-NEXT:  .LCPI5_0:263; CHECK-NEXT:    .long 128 @ 0x80264entry:265  %y = alloca [4 x i32], align 16266  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"(ptr %y, ptr %p, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) #3267  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0268  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1269  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2270  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3271  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4272  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5273  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6274  %arrayidx = getelementptr inbounds i32, ptr %p, i32 30275  store i32 %asmresult6, ptr %arrayidx, align 4276  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)277  ret void278}279 280; This function should have no emergency spill slot, so its stack should be281; smaller than @aligned_emergency_spill.282define void @aligned_no_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, ptr byval([30 x i32]) %p) {283; CHECK-LABEL: aligned_no_emergency_spill:284; CHECK:       @ %bb.0: @ %entry285; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}286; CHECK-NEXT:    push {r4, r5, r6, r7, lr}287; CHECK-NEXT:    .setfp r7, sp, #12288; CHECK-NEXT:    add r7, sp, #12289; CHECK-NEXT:    .pad #28290; CHECK-NEXT:    sub sp, #28291; CHECK-NEXT:    mov r4, sp292; CHECK-NEXT:    lsrs r4, r4, #4293; CHECK-NEXT:    lsls r4, r4, #4294; CHECK-NEXT:    mov sp, r4295; CHECK-NEXT:    mov r0, sp296; CHECK-NEXT:    adds r1, r7, #7297; CHECK-NEXT:    adds r1, #1298; CHECK-NEXT:    @APP299; CHECK-NEXT:    @NO_APP300; CHECK-NEXT:    str r5, [r7, #124]301; CHECK-NEXT:    @APP302; CHECK-NEXT:    @NO_APP303; CHECK-NEXT:    subs r6, r7, #7304; CHECK-NEXT:    subs r6, #5305; CHECK-NEXT:    mov sp, r6306; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}307entry:308  %y = alloca [4 x i32], align 16309  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"(ptr %y, ptr %p, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) #3310  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0311  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1312  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2313  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3314  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4315  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5316  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6317  %arrayidx = getelementptr inbounds i32, ptr %p, i32 29318  store i32 %asmresult6, ptr %arrayidx, align 4319  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)320  ret void321}322 323; This function shouldn't fail to compile.  (It's UB, so it doesn't really324; matter what it compiles to, exactly, but we need to check at some point325; so we don't generate code that requires an emergency spill slot we never326; allocated.  If the store gets eliminated, this testcase probably needs327; to be rewritten.)328define void @aligned_out_of_range_access(i32 %n, i32 %n2, i32 %n3, i32 %n4, ptr byval([30 x i32]) %p) {329; CHECK-LABEL: aligned_out_of_range_access:330; CHECK:       @ %bb.0: @ %entry331; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}332; CHECK-NEXT:    push {r4, r5, r6, r7, lr}333; CHECK-NEXT:    .setfp r7, sp, #12334; CHECK-NEXT:    add r7, sp, #12335; CHECK-NEXT:    .pad #44336; CHECK-NEXT:    sub sp, #44337; CHECK-NEXT:    mov r4, sp338; CHECK-NEXT:    lsrs r4, r4, #4339; CHECK-NEXT:    lsls r4, r4, #4340; CHECK-NEXT:    mov sp, r4341; CHECK-NEXT:    add r0, sp, #16342; CHECK-NEXT:    adds r1, r7, #7343; CHECK-NEXT:    adds r1, #1344; CHECK-NEXT:    str r1, [sp, #12] @ 4-byte Spill345; CHECK-NEXT:    @APP346; CHECK-NEXT:    @NO_APP347; CHECK-NEXT:    str r0, [sp, #8] @ 4-byte Spill348; CHECK-NEXT:    ldr r0, [sp, #12] @ 4-byte Reload349; CHECK-NEXT:    str r5, [r0, #120]350; CHECK-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload351; CHECK-NEXT:    @APP352; CHECK-NEXT:    @NO_APP353; CHECK-NEXT:    subs r6, r7, #7354; CHECK-NEXT:    subs r6, #5355; CHECK-NEXT:    mov sp, r6356; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}357entry:358  %y = alloca [4 x i32], align 16359  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"(ptr %y, ptr %p, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) #3360  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0361  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1362  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2363  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3364  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4365  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5366  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6367  %arrayidx = getelementptr inbounds i32, ptr %p, i32 30368  store i32 %asmresult6, ptr %arrayidx, align 4369  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)370  ret void371}372