197 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2; RUN: llc -O0 -mtriple=aarch64-apple-ios -global-isel -stop-after=irtranslator %s -o - | FileCheck %s3 4@_ZTIi = external global ptr5 6declare i32 @foo(i32)7declare i32 @__gxx_personality_v0(...)8declare i32 @llvm.eh.typeid.for(ptr)9 10define { ptr, i32 } @bar() personality ptr @__gxx_personality_v0 {11 ; CHECK-LABEL: name: bar12 ; CHECK: bb.1 (%ir-block.0):13 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)14 ; CHECK-NEXT: {{ $}}15 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4216 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF17 ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF18 ; CHECK-NEXT: G_INVOKE_REGION_START19 ; CHECK-NEXT: EH_LABEL <mcsymbol >20 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp21 ; CHECK-NEXT: $w0 = COPY [[C]](s32)22 ; CHECK-NEXT: BL @foo, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0, implicit-def $w023 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp24 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w025 ; CHECK-NEXT: EH_LABEL <mcsymbol >26 ; CHECK-NEXT: G_BR %bb.327 ; CHECK-NEXT: {{ $}}28 ; CHECK-NEXT: bb.2.broken (landing-pad):29 ; CHECK-NEXT: liveins: $x0, $x130 ; CHECK-NEXT: {{ $}}31 ; CHECK-NEXT: EH_LABEL <mcsymbol >32 ; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(s128) = G_IMPLICIT_DEF33 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x034 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x135 ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY2]](p0)36 ; CHECK-NEXT: $x0 = COPY [[COPY1]](p0)37 ; CHECK-NEXT: $w1 = COPY [[PTRTOINT]](s32)38 ; CHECK-NEXT: RET_ReallyLR implicit $x0, implicit $w139 ; CHECK-NEXT: {{ $}}40 ; CHECK-NEXT: bb.3.continue:41 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 142 ; CHECK-NEXT: $x0 = COPY [[DEF]](p0)43 ; CHECK-NEXT: $w1 = COPY [[C1]](s32)44 ; CHECK-NEXT: RET_ReallyLR implicit $x0, implicit $w145 %res32 = invoke i32 @foo(i32 42) to label %continue unwind label %broken46 47 48broken:49 %ptr.sel = landingpad { ptr, i32 } catch ptr @_ZTIi50 ret { ptr, i32 } %ptr.sel51 52continue:53 %sel.int = tail call i32 @llvm.eh.typeid.for(ptr @_ZTIi)54 %res.good = insertvalue { ptr, i32 } undef, i32 %sel.int, 155 ret { ptr, i32 } %res.good56}57 58define void @test_invoke_indirect(ptr %callee) personality ptr @__gxx_personality_v0 {59 ; CHECK-LABEL: name: test_invoke_indirect60 ; CHECK: bb.1 (%ir-block.0):61 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)62 ; CHECK-NEXT: liveins: $x063 ; CHECK-NEXT: {{ $}}64 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64(p0) = COPY $x065 ; CHECK-NEXT: G_INVOKE_REGION_START66 ; CHECK-NEXT: EH_LABEL <mcsymbol >67 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp68 ; CHECK-NEXT: BLR [[COPY]](p0), csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp69 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp70 ; CHECK-NEXT: EH_LABEL <mcsymbol >71 ; CHECK-NEXT: G_BR %bb.372 ; CHECK-NEXT: {{ $}}73 ; CHECK-NEXT: bb.2.broken (landing-pad):74 ; CHECK-NEXT: liveins: $x0, $x175 ; CHECK-NEXT: {{ $}}76 ; CHECK-NEXT: EH_LABEL <mcsymbol >77 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s128) = G_IMPLICIT_DEF78 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x079 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x180 ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY2]](p0)81 ; CHECK-NEXT: RET_ReallyLR82 ; CHECK-NEXT: {{ $}}83 ; CHECK-NEXT: bb.3.continue:84 ; CHECK-NEXT: RET_ReallyLR85 invoke void %callee() to label %continue unwind label %broken86 87broken:88 landingpad { ptr, i32 } catch ptr @_ZTIi89 ret void90 91continue:92 ret void93}94 95declare void @printf(ptr, ...)96define void @test_invoke_varargs() personality ptr @__gxx_personality_v0 {97 ; CHECK-LABEL: name: test_invoke_varargs98 ; CHECK: bb.1 (%ir-block.0):99 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)100 ; CHECK-NEXT: {{ $}}101 ; CHECK-NEXT: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0102 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 42103 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00104 ; CHECK-NEXT: G_INVOKE_REGION_START105 ; CHECK-NEXT: EH_LABEL <mcsymbol >106 ; CHECK-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp107 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $sp108 ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 0109 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C3]](s64)110 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[C1]](s32)111 ; CHECK-NEXT: G_STORE [[ANYEXT]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 1)112 ; CHECK-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 8113 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C4]](s64)114 ; CHECK-NEXT: G_STORE [[C2]](s32), [[PTR_ADD1]](p0) :: (store (s32) into stack + 8, align 1)115 ; CHECK-NEXT: $x0 = COPY [[C]](p0)116 ; CHECK-NEXT: BL @printf, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x0117 ; CHECK-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp118 ; CHECK-NEXT: EH_LABEL <mcsymbol >119 ; CHECK-NEXT: G_BR %bb.3120 ; CHECK-NEXT: {{ $}}121 ; CHECK-NEXT: bb.2.broken (landing-pad):122 ; CHECK-NEXT: liveins: $x0, $x1123 ; CHECK-NEXT: {{ $}}124 ; CHECK-NEXT: EH_LABEL <mcsymbol >125 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s128) = G_IMPLICIT_DEF126 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x0127 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x1128 ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY2]](p0)129 ; CHECK-NEXT: RET_ReallyLR130 ; CHECK-NEXT: {{ $}}131 ; CHECK-NEXT: bb.3.continue:132 ; CHECK-NEXT: RET_ReallyLR133 invoke void(ptr, ...) @printf(ptr null, i32 42, float 1.0) to label %continue unwind label %broken134 135broken:136 landingpad { ptr, i32 } catch ptr @_ZTIi137 ret void138 139continue:140 ret void141}142 143@global_var = external global i32144 145declare void @may_throw()146define i32 @test_lpad_phi() personality ptr @__gxx_personality_v0 {147 ; CHECK-LABEL: name: test_lpad_phi148 ; CHECK: bb.1 (%ir-block.0):149 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)150 ; CHECK-NEXT: {{ $}}151 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 42152 ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @global_var153 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 11154 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 13155 ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 55156 ; CHECK-NEXT: G_STORE [[C]](s32), [[GV]](p0) :: (store (s32) into @global_var)157 ; CHECK-NEXT: G_INVOKE_REGION_START158 ; CHECK-NEXT: EH_LABEL <mcsymbol >159 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp160 ; CHECK-NEXT: BL @may_throw, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp161 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp162 ; CHECK-NEXT: EH_LABEL <mcsymbol >163 ; CHECK-NEXT: G_BR %bb.3164 ; CHECK-NEXT: {{ $}}165 ; CHECK-NEXT: bb.2.lpad (landing-pad):166 ; CHECK-NEXT: successors: %bb.3(0x80000000)167 ; CHECK-NEXT: liveins: $x0, $x1168 ; CHECK-NEXT: {{ $}}169 ; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI [[C1]](s32), %bb.1170 ; CHECK-NEXT: EH_LABEL <mcsymbol >171 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s128) = G_IMPLICIT_DEF172 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0173 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1174 ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY1]](p0)175 ; CHECK-NEXT: G_STORE [[PHI]](s32), [[GV]](p0) :: (store (s32) into @global_var)176 ; CHECK-NEXT: G_BR %bb.3177 ; CHECK-NEXT: {{ $}}178 ; CHECK-NEXT: bb.3.continue:179 ; CHECK-NEXT: [[PHI1:%[0-9]+]]:_(s32) = G_PHI [[C2]](s32), %bb.1, [[C3]](s32), %bb.2180 ; CHECK-NEXT: $w0 = COPY [[PHI1]](s32)181 ; CHECK-NEXT: RET_ReallyLR implicit $w0182 store i32 42, ptr @global_var183 invoke void @may_throw()184 to label %continue unwind label %lpad185 186lpad: ; preds = %entry187 %p = phi i32 [ 11, %0 ] ; Trivial, but -O0 keeps it188 %1 = landingpad { ptr, i32 }189 catch ptr null190 store i32 %p, ptr @global_var191 br label %continue192 193continue: ; preds = %entry, %lpad194 %r.0 = phi i32 [ 13, %0 ], [ 55, %lpad ]195 ret i32 %r.0196}197