215 lines · plain
1# RUN: llc --run-pass=register-coalescer -o - %s | FileCheck %s2# pr454893# Coalescing variables across a setjmp call can add a undefined4# variable value when longjmp if such variables are spilled and5# altered between the setjmp and longjmp.6 7# This file tests a very particular case for8# no coalescing stack pointers across the9# setjmp call.10# CHECK: %[[R1:[0-9]+]]:gpr = ADDri %stack.0.P0, 0, 1411 12# Stack pointer13# CHECK: %[[R2:[0-9]+]]:gpr = nuw ADDri %[[R1]], 8, 1414# CHECK: @setjmp15 16# Not changed between setjmp and bar(longjmp)17# CHECK-NOT: %{{[0-9]+}}:dpr, %[[R2]]:gpr = VLD1d32wb_fixed %[[R2]], 0,18# CHECK: BL @_Z3barPx3S37{{.*}}19# CHECK: %[[R3:[0-9]+]]:gpr = COPY %[[R2]]20 21# Used after bar22# CHECK-NOT: VLD1d32wb_fixed %[[R2]]23# CHECK: VLD1d32wb_fixed %[[R3]]24--- |25 target triple = "armv8-arm-none-eabi"26 27 %"class.std::__1::ios_base::Init" = type { i8 }28 %struct.S37 = type <{ i8, [7 x i8], %struct.S38, [2 x %"class.std::__1::complex"], float, [4 x i8], i64, i32, [4 x i8] }>29 %struct.S38 = type { double, i8 }30 %"class.std::__1::complex" = type { double, double }31 %struct.S18 = type <{ i32, [4 x i8], double, double, double, i32, [4 x i8], %struct.S23, i32, [4 x i8] }>32 %struct.S23 = type { [2 x double], half }33 define i32 @main() {34 entry:35 %P0 = alloca %struct.S37, align 836 %0 = bitcast ptr %P0 to ptr37 %jb1 = alloca [20 x i64], align 838 %P1 = alloca %struct.S18, align 839 %jb2 = alloca [20 x i64], align 840 %1 = bitcast ptr %P0 to ptr41 %M2.i = getelementptr inbounds %struct.S37, ptr %P0, i32 0, i32 242 %2 = bitcast ptr %M2.i to ptr43 call void @llvm.memset.p0.i64(ptr nonnull align 8 dereferenceable(48) %2, i8 0, i64 48, i1 false)44 %M6.i = getelementptr inbounds %struct.S37, ptr %P0, i32 0, i32 745 store i32 0, ptr %M6.i, align 846 %3 = bitcast ptr %jb1 to ptr47 %arraydecay1 = bitcast ptr %jb1 to ptr48 %call1 = call i32 @setjmp(ptr nonnull %arraydecay1)49 %tobool = icmp eq i32 %call1, 050 br i1 %tobool, label %if.then, label %if.end51 if.then: ; preds = %entry52 %4 = bitcast ptr %jb1 to ptr53 call void (ptr, ptr, ...) @_Z3barPx3S37z(ptr nonnull %4, ptr nonnull byval(%struct.S37) align 8 %P0)54 unreachable55 if.end: ; preds = %entry56 %5 = bitcast ptr %jb1 to ptr57 %6 = bitcast ptr %P0 to ptr58 call void asm sideeffect "", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{sp},~{lr}"()59 %7 = bitcast ptr %0 to ptr60 %BM0.i = getelementptr inbounds %struct.S18, ptr %0, i32 0, i32 261 store double 0.000000e+00, ptr %BM0.i, align 862 %M0.i = getelementptr inbounds %struct.S18, ptr %0, i32 0, i32 563 store i32 42, ptr %M0.i, align 864 %M3.i = getelementptr inbounds %struct.S18, ptr %0, i32 0, i32 765 %8 = bitcast ptr %M3.i to ptr66 call void @llvm.memset.p0.i64(ptr nonnull align 8 dereferenceable(28) %8, i8 0, i64 28, i1 false)67 %9 = bitcast ptr %jb1 to ptr68 %arraydecay42 = bitcast ptr %jb1 to ptr69 %call5 = call i32 @setjmp(ptr nonnull %arraydecay42)70 %tobool6 = icmp eq i32 %call5, 071 br i1 %tobool6, label %if.then7, label %if.end1072 if.then7: ; preds = %if.end73 %10 = bitcast ptr %jb1 to ptr74 call void (ptr, ptr, ...) @_Z3fooPx3S18z(ptr nonnull %10, ptr nonnull byval(%struct.S18) align 8 %0)75 unreachable76 if.end10: ; preds = %if.end77 %11 = bitcast ptr %jb1 to ptr78 %12 = bitcast ptr %0 to ptr79 ret i32 080 }81 declare i32 @setjmp(ptr)82 declare void @_Z3barPx3S37z(ptr, ptr byval(%struct.S37) align 8, ...)83 declare void @_Z3fooPx3S18z(ptr, ptr byval(%struct.S18) align 8, ...)84 declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)85...86---87name: main88exposesReturnsTwice: true89frameInfo:90 adjustsStack: true91stack:92 - { id: 0, name: P0, size: 80, alignment: 8, local-offset: -80 }93 - { id: 1, name: jb1, size: 160, alignment: 8, local-offset: -240 }94machineFunctionInfo: {}95body: |96 bb.0:97 successors: %bb.1(0x00000001), %bb.4(0x7fffffff)98 %0:qpr = VMOVv4i32 0, 14, $noreg99 %1:gpr = ADDri %stack.0.P0, 0, 14, $noreg, $noreg100 %2:gpr = ADDri %1, 40, 14, $noreg, $noreg101 VST1q64 %2, 0, %0, 14, $noreg102 %3:gpr = ADDri %1, 24, 14, $noreg, $noreg103 VST1q64 killed %3, 0, %0, 14, $noreg104 %4:gpr = nuw ADDri %1, 8, 14, $noreg, $noreg105 VST1q64 %4, 0, %0, 14, $noreg106 %5:gpr = MOVi 0, 14, $noreg, $noreg107 STRi12 %5, %stack.0.P0, 72, 14, $noreg108 ADJCALLSTACKDOWN 0, 0, 14, $noreg, implicit-def dead $sp, implicit $sp109 %6:gpr = ADDri %stack.1.jb1, 0, 14, $noreg, $noreg110 $r0 = COPY killed %6111 BL @setjmp, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit-def $sp, implicit-def $r0112 ADJCALLSTACKUP 0, 0, 14, $noreg, implicit-def dead $sp, implicit $sp113 %7:gpr = COPY killed $r0114 CMPri killed %7, 0, 14, $noreg, implicit-def $cpsr115 Bcc %bb.4, 1, killed $cpsr116 B %bb.1117 bb.1:118 ADJCALLSTACKDOWN 72, 0, 14, $noreg, implicit-def dead $sp, implicit $sp119 %24:gpr = LDRi12 %stack.0.P0, 0, 14, $noreg120 %25:gpr = LDRi12 %stack.0.P0, 4, 14, $noreg121 %27:gpr = COPY $sp122 %29:gpr = MOVi16 72, 14, $noreg123 %61:gpr = COPY killed %29124 %62:gpr = COPY killed %4125 %63:gpr = COPY killed %27126 bb.2 (call-frame-size 72):127 %35:gpr = COPY killed %63128 %33:gpr = COPY killed %62129 %31:gpr = COPY killed %61130 %32:gpr = COPY killed %33131 %36:dpr, %32:gpr = VLD1d32wb_fixed %32, 0, 14, $noreg132 %34:gpr = COPY killed %35133 %34:gpr = VST1d32wb_fixed %34, 0, killed %36, 14, $noreg134 %30:gpr = SUBri killed %31, 8, 14, $noreg, def $cpsr135 %61:gpr = COPY killed %30136 %62:gpr = COPY killed %32137 %63:gpr = COPY killed %34138 Bcc %bb.2, 1, killed $cpsr139 bb.3 (call-frame-size 72):140 successors:141 %28:gpr = ADDri %stack.1.jb1, 0, 14, $noreg, $noreg142 $r0 = COPY killed %28143 $r2 = COPY killed %24144 $r3 = COPY killed %25145 BL @_Z3barPx3S37z, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit killed $r2, implicit killed $r3, implicit-def $sp146 ADJCALLSTACKUP 72, 0, 14, $noreg, implicit-def dead $sp, implicit $sp147 bb.4:148 successors: %bb.5(0x00000001), %bb.6(0x7fffffff)149 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0, 12, implicit-def dead early-clobber $r1, 12, implicit-def dead early-clobber $r2, 12, implicit-def dead early-clobber $r3, 12, implicit-def dead early-clobber $r4, 12, implicit-def dead early-clobber $r5, 12, implicit-def dead early-clobber $r6, 12, implicit-def dead early-clobber $r7, 12, implicit-def dead early-clobber $r8, 12, implicit-def dead early-clobber $r9, 12, implicit-def dead early-clobber $r10, 12, implicit-def dead early-clobber $r11, 12, implicit-def dead early-clobber $r12, 12, implicit-def early-clobber $sp, 12, implicit-def dead early-clobber $lr150 VST1q64 killed %2, 0, %0, 14, $noreg151 %11:gpr = ADDri killed %1, 52, 14, $noreg, $noreg152 VST1q32 killed %11, 0, killed %0, 14, $noreg153 STRi12 %5, %stack.0.P0, 12, 14, $noreg154 STRi12 killed %5, %stack.0.P0, 8, 14, $noreg155 %13:gpr = MOVi 42, 14, $noreg, $noreg156 STRi12 killed %13, %stack.0.P0, 32, 14, $noreg157 ADJCALLSTACKDOWN 0, 0, 14, $noreg, implicit-def dead $sp, implicit $sp158 %14:gpr = ADDri %stack.1.jb1, 0, 14, $noreg, $noreg159 $r0 = COPY killed %14160 BL @setjmp, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit-def $sp, implicit-def $r0161 ADJCALLSTACKUP 0, 0, 14, $noreg, implicit-def dead $sp, implicit $sp162 %15:gpr = COPY killed $r0163 CMPri killed %15, 0, 14, $noreg, implicit-def $cpsr164 Bcc %bb.6, 1, killed $cpsr165 B %bb.5166 bb.5:167 successors:168 ADJCALLSTACKDOWN 64, 0, 14, $noreg, implicit-def dead $sp, implicit $sp169 %18:gpr = LDRi12 %stack.0.P0, 0, 14, $noreg170 %19:gpr = LDRi12 %stack.0.P0, 4, 14, $noreg171 %21:gpr = COPY $sp172 %37:gpr = COPY killed %4173 %39:dpr, %37:gpr = VLD1d32wb_fixed %37, 0, 14, $noreg174 %38:gpr = COPY killed %21175 %38:gpr = VST1d32wb_fixed %38, 0, killed %39, 14, $noreg176 %40:gpr = COPY killed %37177 %42:dpr, %40:gpr = VLD1d32wb_fixed %40, 0, 14, $noreg178 %41:gpr = COPY killed %38179 %41:gpr = VST1d32wb_fixed %41, 0, killed %42, 14, $noreg180 %43:gpr = COPY killed %40181 %45:dpr, %43:gpr = VLD1d32wb_fixed %43, 0, 14, $noreg182 %44:gpr = COPY killed %41183 %44:gpr = VST1d32wb_fixed %44, 0, killed %45, 14, $noreg184 %46:gpr = COPY killed %43185 %48:dpr, %46:gpr = VLD1d32wb_fixed %46, 0, 14, $noreg186 %47:gpr = COPY killed %44187 %47:gpr = VST1d32wb_fixed %47, 0, killed %48, 14, $noreg188 %49:gpr = COPY killed %46189 %51:dpr, %49:gpr = VLD1d32wb_fixed %49, 0, 14, $noreg190 %50:gpr = COPY killed %47191 %50:gpr = VST1d32wb_fixed %50, 0, killed %51, 14, $noreg192 %52:gpr = COPY killed %49193 %54:dpr, %52:gpr = VLD1d32wb_fixed %52, 0, 14, $noreg194 %53:gpr = COPY killed %50195 %53:gpr = VST1d32wb_fixed %53, 0, killed %54, 14, $noreg196 %55:gpr = COPY killed %52197 %57:dpr, %55:gpr = VLD1d32wb_fixed %55, 0, 14, $noreg198 %56:gpr = COPY killed %53199 %56:gpr = VST1d32wb_fixed %56, 0, killed %57, 14, $noreg200 %58:gpr = COPY killed %55201 %60:dpr, dead %58:gpr = VLD1d32wb_fixed %58, 0, 14, $noreg202 %59:gpr = COPY killed %56203 dead %59:gpr = VST1d32wb_fixed %59, 0, killed %60, 14, $noreg204 %22:gpr = ADDri %stack.1.jb1, 0, 14, $noreg, $noreg205 $r0 = COPY killed %22206 $r2 = COPY killed %18207 $r3 = COPY killed %19208 BL @_Z3fooPx3S18z, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit killed $r2, implicit killed $r3, implicit-def $sp209 ADJCALLSTACKUP 64, 0, 14, $noreg, implicit-def dead $sp, implicit $sp210 bb.6:211 %16:gpr = MOVi 0, 14, $noreg, $noreg212 $r0 = COPY killed %16213 BX_RET 14, $noreg, implicit killed $r0214...215