diff options
Diffstat (limited to 'llvm/test/CodeGen/ARM')
-rw-r--r-- | llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-load-store.mir | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/bad-constraint.ll | 25 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/calleetypeid-directcall-mismatched.ll | 32 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/callsite-emit-calleetypeid-tailcall.ll | 19 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/callsite-emit-calleetypeid.ll | 20 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/fcopysign.ll | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/fp16.ll | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/inlineasm-int-to-float.ll | 17 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/nop_concat_vectors.ll | 8 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/preferred-function-alignment.ll | 8 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/stack-protector-eh-sjlj.ll | 164 |
12 files changed, 295 insertions, 9 deletions
diff --git a/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll b/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll index dc1d4b2..25119fe 100644 --- a/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll +++ b/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll @@ -561,7 +561,7 @@ define void @test_load_store_struct(ptr %addr) { ; CHECK: [[ADDR1:%[0-9]+]]:_(p0) = COPY $r0 ; CHECK-DAG: [[VAL1:%[0-9]+]]:_(s32) = G_LOAD [[ADDR1]](p0) :: (load (s32) from %ir.addr) ; CHECK-DAG: [[OFFSET:%[0-9]+]]:_(s32) = G_CONSTANT i32 4 -; CHECK-DAG: [[ADDR2:%[0-9]+]]:_(p0) = G_PTR_ADD [[ADDR1]], [[OFFSET]](s32) +; CHECK-DAG: [[ADDR2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR1]], [[OFFSET]](s32) ; CHECK-DAG: [[VAL2:%[0-9]+]]:_(s32) = G_LOAD [[ADDR2]](p0) :: (load (s32) from %ir.addr + 4) ; CHECK-DAG: G_STORE [[VAL1]](s32), [[ADDR1]](p0) :: (store (s32) into %ir.addr) ; CHECK-DAG: [[ADDR3:%[0-9]+]]:_(p0) = COPY [[ADDR2]] diff --git a/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-load-store.mir b/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-load-store.mir index 044ad60..3c900c2 100644 --- a/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-load-store.mir +++ b/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-load-store.mir @@ -128,7 +128,7 @@ body: | ; CHECK: [[ADDR1:%[0-9]+]]:_(p0) = COPY $r0 ; CHECK-NEXT: [[V1:%[0-9]+]]:_(s32) = G_LOAD [[ADDR1]](p0) :: (load (s32), align 1) ; CHECK-NEXT: [[OFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 4 - ; CHECK-NEXT: [[ADDR2:%[0-9]+]]:_(p0) = G_PTR_ADD [[ADDR1]], [[OFF]] + ; CHECK-NEXT: [[ADDR2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR1]], [[OFF]] ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY [[ADDR2]] ; CHECK-NEXT: [[V2:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32) from unknown-address + 4, align 1) ; CHECK-NEXT: G_STORE [[V1]](s32), [[ADDR1]](p0) :: (store (s32), align 1) @@ -165,7 +165,7 @@ body: | ; CHECK: [[ADDR1:%[0-9]+]]:_(p0) = COPY $r0 ; CHECK-NEXT: [[V1:%[0-9]+]]:_(s32) = G_LOAD [[ADDR1]](p0) :: (load (s32), align 1) ; CHECK-NEXT: [[OFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 4 - ; CHECK-NEXT: [[ADDR2:%[0-9]+]]:_(p0) = G_PTR_ADD [[ADDR1]], [[OFF]] + ; CHECK-NEXT: [[ADDR2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR1]], [[OFF]] ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY [[ADDR2]] ; CHECK-NEXT: [[V2:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32) from unknown-address + 4, align 1) ; CHECK-NEXT: G_STORE [[V1]](s32), [[ADDR1]](p0) :: (store (s32), align 1) diff --git a/llvm/test/CodeGen/ARM/bad-constraint.ll b/llvm/test/CodeGen/ARM/bad-constraint.ll new file mode 100644 index 0000000..9b8fcd5 --- /dev/null +++ b/llvm/test/CodeGen/ARM/bad-constraint.ll @@ -0,0 +1,25 @@ +; RUN: not llc -filetype=obj %s -o /dev/null 2>&1 | FileCheck %s +; CHECK: error: couldn't allocate input reg for constraint '{d2}' +; CHECK-NEXT: error: couldn't allocate input reg for constraint '{s2}' + +target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "armv8a-unknown-linux-gnueabihf" + +@a = local_unnamed_addr global i32 0, align 4 + +define void @_Z1bv() local_unnamed_addr { +entry: + %0 = load i32, ptr @a, align 4 + %conv = sext i32 %0 to i64 + tail call void asm sideeffect "", "{d2}"(i64 %conv) + ret void +} + +define void @_Z1cv() local_unnamed_addr { +entry: + %0 = load i32, ptr @a, align 4 + %conv = sext i32 %0 to i64 + tail call void asm sideeffect "", "{s2}"(i64 %conv) + ret void +} + diff --git a/llvm/test/CodeGen/ARM/calleetypeid-directcall-mismatched.ll b/llvm/test/CodeGen/ARM/calleetypeid-directcall-mismatched.ll new file mode 100644 index 0000000..8f7b050 --- /dev/null +++ b/llvm/test/CodeGen/ARM/calleetypeid-directcall-mismatched.ll @@ -0,0 +1,32 @@ +;; Tests that callee_type metadata attached to direct call sites are safely ignored. + +; RUN: llc --call-graph-section -mtriple arm-linux-gnu < %s -stop-after=finalize-isel -o - | FileCheck --match-full-lines %s + +;; Test that `calleeTypeIds` field is not present in `callSites` +; CHECK-LABEL: callSites: +; CHECK-NEXT: - { bb: {{[0-9]+}}, offset: {{[0-9]+}}, fwdArgRegs: [] } +; CHECK-NEXT: - { bb: {{[0-9]+}}, offset: {{[0-9]+}}, fwdArgRegs: [] } +; CHECK-NEXT: - { bb: {{[0-9]+}}, offset: {{[0-9]+}}, fwdArgRegs: [] } +define i32 @foo(i32 %x, i32 %y) !type !0 { +entry: + ;; Call instruction with accurate callee_type. + ;; callee_type should be dropped seemlessly. + %call = call i32 @fizz(i32 %x, i32 %y), !callee_type !1 + ;; Call instruction with mismatched callee_type. + ;; callee_type should be dropped seemlessly without errors. + %call1 = call i32 @fizz(i32 %x, i32 %y), !callee_type !3 + %add = add nsw i32 %call, %call1 + ;; Call instruction with mismatched callee_type. + ;; callee_type should be dropped seemlessly without errors. + %call2 = call i32 @fizz(i32 %add, i32 %y), !callee_type !3 + %sub = sub nsw i32 %add, %call2 + ret i32 %sub +} + +declare !type !2 i32 @fizz(i32, i32) + +!0 = !{i64 0, !"_ZTSFiiiiE.generalized"} +!1 = !{!2} +!2 = !{i64 0, !"_ZTSFiiiE.generalized"} +!3 = !{!4} +!4 = !{i64 0, !"_ZTSFicE.generalized"} diff --git a/llvm/test/CodeGen/ARM/callsite-emit-calleetypeid-tailcall.ll b/llvm/test/CodeGen/ARM/callsite-emit-calleetypeid-tailcall.ll new file mode 100644 index 0000000..05e1e8b --- /dev/null +++ b/llvm/test/CodeGen/ARM/callsite-emit-calleetypeid-tailcall.ll @@ -0,0 +1,19 @@ +;; Tests that call site callee type ids can be extracted and set from +;; callee_type metadata for indirect tail calls. + +;; Verify the exact calleeTypeId value to ensure it is not garbage but the value +;; computed as the type id from the callee_type metadata. +; RUN: llc --call-graph-section -mtriple arm-linux-gnu < %s -stop-after=finalize-isel -o - | FileCheck --match-full-lines %s + +define i32 @check_tailcall(ptr %func, i8 %x) !type !0 { +entry: + ; CHECK: callSites: + ; CHECK-NEXT: - { bb: {{.*}}, offset: {{.*}}, fwdArgRegs: [], calleeTypeIds: + ; CHECK-NEXT: [ 3498816979441845844 ] } + %call = tail call i32 %func(i8 signext %x), !callee_type !1 + ret i32 %call +} + +!0 = !{i64 0, !"_ZTSFiPvcE.generalized"} +!1 = !{!2} +!2 = !{i64 0, !"_ZTSFicE.generalized"} diff --git a/llvm/test/CodeGen/ARM/callsite-emit-calleetypeid.ll b/llvm/test/CodeGen/ARM/callsite-emit-calleetypeid.ll new file mode 100644 index 0000000..a65e5c5 --- /dev/null +++ b/llvm/test/CodeGen/ARM/callsite-emit-calleetypeid.ll @@ -0,0 +1,20 @@ +;; Tests that call site callee type ids can be extracted and set from +;; callee_type metadata. + +;; Verify the exact calleeTypeIds value to ensure it is not garbage but the value +;; computed as the type id from the callee_type metadata. +; RUN: llc --call-graph-section -mtriple arm-linux-gnu < %s -stop-after=finalize-isel -o - | FileCheck --match-full-lines %s + +; CHECK: name: main +; CHECK: callSites: +; CHECK-NEXT: - { bb: {{.*}}, offset: {{.*}}, fwdArgRegs: [], calleeTypeIds: +; CHECK-NEXT: [ 7854600665770582568 ] } +define i32 @main() { +entry: + %fn = load ptr, ptr null, align 8 + call void %fn(i8 0), !callee_type !0 + ret i32 0 +} + +!0 = !{!1} +!1 = !{i64 0, !"_ZTSFvcE.generalized"} diff --git a/llvm/test/CodeGen/ARM/fcopysign.ll b/llvm/test/CodeGen/ARM/fcopysign.ll index b183418..dbebe44 100644 --- a/llvm/test/CodeGen/ARM/fcopysign.ll +++ b/llvm/test/CodeGen/ARM/fcopysign.ll @@ -85,6 +85,7 @@ define float @test4() nounwind { ; SOFT-NEXT: vadd.f32 d0, d0, d16 ; SOFT-NEXT: vmov r0, s0 ; SOFT-NEXT: pop {lr} +; SOFT-NEXT: bx lr ; ; HARD-LABEL: test4: ; HARD: @ %bb.0: @ %entry diff --git a/llvm/test/CodeGen/ARM/fp16.ll b/llvm/test/CodeGen/ARM/fp16.ll index dc35fa3..9ff7010 100644 --- a/llvm/test/CodeGen/ARM/fp16.ll +++ b/llvm/test/CodeGen/ARM/fp16.ll @@ -86,8 +86,8 @@ define i16 @test_to_fp16(double %in) { ; CHECK-FP16-SAFE: bl __aeabi_d2h -; CHECK-FP16-UNSAFE: vcvt.f32.f64 s0, d0 -; CHECK-FP16-UNSAFE-NEXT: vcvtb.f16.f32 s0, s0 +; CHECK-FP16-UNSAFE: vmov r0, r1, d0 +; CHECK-FP16-UNSAFE-NEXT: bl __aeabi_d2h ; CHECK-ARMV8: vcvtb.f16.f64 [[TMP:s[0-9]+]], d0 ; CHECK-ARMV8: vmov r0, [[TMP]] diff --git a/llvm/test/CodeGen/ARM/inlineasm-int-to-float.ll b/llvm/test/CodeGen/ARM/inlineasm-int-to-float.ll new file mode 100644 index 0000000..1c301b6 --- /dev/null +++ b/llvm/test/CodeGen/ARM/inlineasm-int-to-float.ll @@ -0,0 +1,17 @@ +; RUN: llc -filetype=asm %s -o - | FileCheck %s + +; CHECK: movw r0, :lower16:a +; CHECK-NEXT: movt r0, :upper16:a +; CHECK-NEXT: vldr s6, [r0] + +target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "armv8a-unknown-linux-gnueabihf" + +@a = local_unnamed_addr global i32 0, align 4 + +define void @_Z1dv() local_unnamed_addr { +entry: + %0 = load i32, ptr @a, align 4 + tail call void asm sideeffect "", "{s6}"(i32 %0) + ret void +} diff --git a/llvm/test/CodeGen/ARM/nop_concat_vectors.ll b/llvm/test/CodeGen/ARM/nop_concat_vectors.ll index cda1e83..aa3cdc3 100644 --- a/llvm/test/CodeGen/ARM/nop_concat_vectors.ll +++ b/llvm/test/CodeGen/ARM/nop_concat_vectors.ll @@ -1,10 +1,10 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s -;CHECK: _foo -;CHECK-NOT: vld1.32 -;CHECK-NOT: vst1.32 -;CHECK: bx define void @foo(ptr %J) { +; CHECK-LABEL: foo: +; CHECK: @ %bb.0: +; CHECK-NEXT: bx lr %A = load <16 x i8>, ptr %J %T1 = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> %T2 = shufflevector <8 x i8> %T1, <8 x i8> undef, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> diff --git a/llvm/test/CodeGen/ARM/preferred-function-alignment.ll b/llvm/test/CodeGen/ARM/preferred-function-alignment.ll index f3a227c..2fc6790 100644 --- a/llvm/test/CodeGen/ARM/preferred-function-alignment.ll +++ b/llvm/test/CodeGen/ARM/preferred-function-alignment.ll @@ -22,3 +22,11 @@ define void @test() { define void @test_optsize() optsize { ret void } + +; CHECK-LABEL: test_minsize +; ALIGN-CS-16: .p2align 1 +; ALIGN-CS-32: .p2align 2 + +define void @test_minsize() minsize { + ret void +} diff --git a/llvm/test/CodeGen/ARM/stack-protector-eh-sjlj.ll b/llvm/test/CodeGen/ARM/stack-protector-eh-sjlj.ll new file mode 100644 index 0000000..fbd01ca --- /dev/null +++ b/llvm/test/CodeGen/ARM/stack-protector-eh-sjlj.ll @@ -0,0 +1,164 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -O0 -mtriple=thumbv7s-apple-darwin < %s | FileCheck %s +target datalayout = "e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" + +; Function Attrs: mustprogress noinline optnone ssp +define ptr @foo() #0 personality ptr @__gxx_personality_sj0 { +; CHECK-LABEL: foo: +; CHECK: Lfunc_begin0: +; CHECK-NEXT: @ %bb.0: +; CHECK-NEXT: push {r4, r5, r6, r7, lr} +; CHECK-NEXT: add r7, sp, #12 +; CHECK-NEXT: push.w {r8, r10, r11} +; CHECK-NEXT: sub.w r4, sp, #64 +; CHECK-NEXT: bfc r4, #0, #4 +; CHECK-NEXT: mov sp, r4 +; CHECK-NEXT: vst1.64 {d8, d9, d10, d11}, [r4:128]! +; CHECK-NEXT: vst1.64 {d12, d13, d14, d15}, [r4:128] +; CHECK-NEXT: sub sp, #96 +; CHECK-NEXT: movw r0, :lower16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_2+4)) +; CHECK-NEXT: movt r0, :upper16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_2+4)) +; CHECK-NEXT: LPC0_2: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: movw r0, :lower16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_3+4)) +; CHECK-NEXT: movt r0, :upper16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_3+4)) +; CHECK-NEXT: LPC0_3: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: str r0, [sp, #92] +; CHECK-NEXT: movw r0, :lower16:(L___gxx_personality_sj0$non_lazy_ptr-(LPC0_4+4)) +; CHECK-NEXT: movt r0, :upper16:(L___gxx_personality_sj0$non_lazy_ptr-(LPC0_4+4)) +; CHECK-NEXT: LPC0_4: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: str r0, [sp, #36] +; CHECK-NEXT: ldr r0, LCPI0_0 +; CHECK-NEXT: LPC0_0: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: str r0, [sp, #40] +; CHECK-NEXT: str r7, [sp, #44] +; CHECK-NEXT: mov r0, sp +; CHECK-NEXT: str r0, [sp, #52] +; CHECK-NEXT: ldr r0, LCPI0_1 +; CHECK-NEXT: orr r0, r0, #1 +; CHECK-NEXT: LPC0_1: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: str r0, [sp, #48] +; CHECK-NEXT: add r0, sp, #12 +; CHECK-NEXT: bl __Unwind_SjLj_Register +; CHECK-NEXT: movs r0, #1 +; CHECK-NEXT: str r0, [sp, #16] +; CHECK-NEXT: movw r0, :lower16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_5+4)) +; CHECK-NEXT: movt r0, :upper16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_5+4)) +; CHECK-NEXT: LPC0_5: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r1, [sp, #92] +; CHECK-NEXT: cmp r0, r1 +; CHECK-NEXT: bne LBB0_7 +; CHECK-NEXT: @ %bb.1: @ %SP_return +; CHECK-NEXT: Ltmp0: +; CHECK-NEXT: movs r1, #0 +; CHECK-NEXT: mov r0, r1 +; CHECK-NEXT: bl _foo2 +; CHECK-NEXT: Ltmp1: +; CHECK-NEXT: b LBB0_2 +; CHECK-NEXT: LBB0_2: +; CHECK-NEXT: movs r0, #2 +; CHECK-NEXT: str r0, [sp, #16] +; CHECK-NEXT: movw r0, :lower16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_6+4)) +; CHECK-NEXT: movt r0, :upper16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_6+4)) +; CHECK-NEXT: LPC0_6: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r1, [sp, #92] +; CHECK-NEXT: cmp r0, r1 +; CHECK-NEXT: bne LBB0_7 +; CHECK-NEXT: @ %bb.3: @ %SP_return2 +; CHECK-NEXT: Ltmp2: +; CHECK-NEXT: movs r2, #0 +; CHECK-NEXT: mov r0, r2 +; CHECK-NEXT: mov r1, r2 +; CHECK-NEXT: bl _foo3 +; CHECK-NEXT: Ltmp3: +; CHECK-NEXT: b LBB0_6 +; CHECK-NEXT: LBB0_4: +; CHECK-NEXT: Ltmp4: +; CHECK-NEXT: ldr r0, [sp, #20] +; CHECK-NEXT: ldr r0, [sp, #24] +; CHECK-NEXT: add r0, sp, #12 +; CHECK-NEXT: bl __Unwind_SjLj_Unregister +; CHECK-NEXT: movw r0, :lower16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_7+4)) +; CHECK-NEXT: movt r0, :upper16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_7+4)) +; CHECK-NEXT: LPC0_7: +; CHECK-NEXT: add r0, pc +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: ldr r1, [sp, #92] +; CHECK-NEXT: cmp r0, r1 +; CHECK-NEXT: bne LBB0_7 +; CHECK-NEXT: @ %bb.5: @ %SP_return3 +; CHECK-NEXT: movs r0, #0 +; CHECK-NEXT: add r4, sp, #96 +; CHECK-NEXT: vld1.64 {d8, d9, d10, d11}, [r4:128]! +; CHECK-NEXT: vld1.64 {d12, d13, d14, d15}, [r4:128] +; CHECK-NEXT: sub.w r4, r7, #24 +; CHECK-NEXT: mov sp, r4 +; CHECK-NEXT: pop.w {r8, r10, r11} +; CHECK-NEXT: pop {r4, r5, r6, r7, pc} +; CHECK-NEXT: LBB0_6: +; CHECK-NEXT: trap +; CHECK-NEXT: LBB0_7: @ %CallStackCheckFailBlk +; CHECK-NEXT: bl ___stack_chk_fail +; CHECK-NEXT: LBB0_8: +; CHECK-NEXT: ldr r0, [sp, #16] +; CHECK-NEXT: str r0, [sp, #8] @ 4-byte Spill +; CHECK-NEXT: cmp r0, #2 +; CHECK-NEXT: bhi LBB0_12 +; CHECK-NEXT: @ %bb.9: +; CHECK-NEXT: ldr r1, [sp, #8] @ 4-byte Reload +; CHECK-NEXT: LCPI0_2: +; CHECK-NEXT: tbb [pc, r1] +; CHECK-NEXT: @ %bb.10: +; CHECK-NEXT: LJTI0_0: +; CHECK-NEXT: .data_region jt8 +; CHECK-NEXT: .byte (LBB0_11-(LCPI0_2+4))/2 +; CHECK-NEXT: .byte (LBB0_11-(LCPI0_2+4))/2 +; CHECK-NEXT: .end_data_region +; CHECK-NEXT: .p2align 1 +; CHECK-NEXT: LBB0_11: +; CHECK-NEXT: b LBB0_4 +; CHECK-NEXT: LBB0_12: +; CHECK-NEXT: trap +; CHECK-NEXT: .p2align 2 +; CHECK-NEXT: @ %bb.13: + %1 = alloca [14 x i8], align 16 + %2 = invoke i32 @"foo2"(ptr null, ptr null) #1 + to label %3 unwind label %4 + +3: ; preds = %0 + invoke void @"foo3"(ptr null, ptr null, ptr null) #2 + to label %6 unwind label %4 + +4: ; preds = %3, %0 + %5 = landingpad { ptr, i32 } + cleanup + ret ptr null + +6: ; preds = %3 + unreachable +} + +declare i32 @__gxx_personality_sj0(...) +declare i32 @foo2(ptr,ptr) +declare void @foo3(ptr,ptr,ptr) +; uselistorder directives +uselistorder ptr null, { 2, 3, 4, 5, 0, 6, 7, 1, 8, 9 } + +attributes #0 = { mustprogress ssp "frame-pointer"="all" "no-builtin-calloc" "no-builtin-stpcpy" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } +attributes #2 = { noreturn } |