|
| 1 | +; RUN: llc %s -stop-after=codegenprepare -o - | FileCheck %s |
| 2 | +; REQUIRES: x86-registered-target |
| 3 | + |
| 4 | +; CHECK: indirectbr ptr %jumpAddrLoaded, [label %returnExit] |
| 5 | + |
| 6 | +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" |
| 7 | +target triple = "x86_64-unknown-linux-gnu" |
| 8 | + |
| 9 | +; Function Attrs: noinline nounwind optnone sspreq willreturn |
| 10 | +define i64 @_sub_split_main__split0(ptr %Result, ptr %_context, ptr noalias %rc, ptr noalias %rc2, ptr %jumpAddr) #0 { |
| 11 | +_sub_split_main__split0_entry: |
| 12 | + %RC = alloca i64, align 8 |
| 13 | + %RCLineNumber_l5 = alloca i32, align 4 |
| 14 | + %Result_l7_c9 = alloca i32, align 4 |
| 15 | + br label %_sub_split_main__split0_first |
| 16 | + |
| 17 | +_sub_split_main__split0_first: ; preds = %_sub_split_main__split0_entry |
| 18 | + store i64 0, ptr %RC, align 8 |
| 19 | + store i32 0, ptr %RCLineNumber_l5, align 4 |
| 20 | + %value_l6_c15 = load ptr, ptr %rc, align 8 |
| 21 | + %rc3 = call i64 @"RefCount~_copyctor~RefCount~Void"(ptr %rc2, ptr %value_l6_c15, ptr %_context) |
| 22 | + %rcCmp_l6 = icmp ne i64 %rc3, 0 |
| 23 | + br i1 %rcCmp_l6, label %l3_chain_unwind, label %l6_rcc_ok |
| 24 | + |
| 25 | +l3_chain_unwind: ; preds = %l6_rcc_ok, %_sub_split_main__split0_first |
| 26 | + %RC1 = phi i64 [ %rc3, %_sub_split_main__split0_first ], [ %rc_l7, %l6_rcc_ok ] |
| 27 | + %RCLineNumber = phi i32 [ 6, %_sub_split_main__split0_first ], [ 7, %l6_rcc_ok ] |
| 28 | + store i64 %RC1, ptr %RC, align 8 |
| 29 | + store i32 %RCLineNumber, ptr %RCLineNumber_l5, align 4 |
| 30 | + br label %_sub_split_main__split0_rcc_unwind_top |
| 31 | + |
| 32 | +l6_rcc_ok: ; preds = %_sub_split_main__split0_first |
| 33 | + %rc_l7 = call i64 @"RefCount~rc~Int32"(ptr %Result_l7_c9, ptr %rc2) |
| 34 | + %_l7_c9 = load i32, ptr %Result_l7_c9, align 4 |
| 35 | + store i32 %_l7_c9, ptr %Result, align 4 |
| 36 | + store ptr blockaddress(@main, %returnExit), ptr %jumpAddr, align 8 |
| 37 | + %rcCmp_l7_i1 = icmp ne i64 %rc_l7, 0 |
| 38 | + br i1 %rcCmp_l7_i1, label %l3_chain_unwind, label %l7_rcc_ok |
| 39 | + |
| 40 | +l7_rcc_ok: ; preds = %l6_rcc_ok |
| 41 | + br label %_sub_split_main__split0_return |
| 42 | + |
| 43 | +_sub_split_main__split0_return: ; preds = %l7_rcc_ok, %_sub_split_main__split0_rcc_unwind_top |
| 44 | + %RCValue = load i64, ptr %RC, align 8 |
| 45 | + ret i64 %RCValue |
| 46 | + |
| 47 | +_sub_split_main__split0_rcc_unwind_top: ; preds = %l3_chain_unwind |
| 48 | + call void @stackTracePush() |
| 49 | + br label %_sub_split_main__split0_return |
| 50 | +} |
| 51 | + |
| 52 | +; Function Attrs: noinline nounwind optnone sspreq willreturn |
| 53 | +define i64 @main(ptr %Result, ptr %_context) #0 { |
| 54 | +main_entry: |
| 55 | + %RC = alloca i64, align 8 |
| 56 | + %RCLineNumber_l3 = alloca i32, align 4 |
| 57 | + %rc_l4 = alloca ptr, align 8 |
| 58 | + %rc2_l6 = alloca ptr, align 8 |
| 59 | + %jmpAddr_l5_c2 = alloca ptr, align 8 |
| 60 | + br label %main_first |
| 61 | + |
| 62 | +main_first: ; preds = %main_entry |
| 63 | + store i64 0, ptr %RC, align 8 |
| 64 | + store i32 0, ptr %RCLineNumber_l3, align 4 |
| 65 | + store ptr null, ptr %rc_l4, align 8 |
| 66 | + store ptr null, ptr %rc2_l6, align 8 |
| 67 | + %rc_l43 = call i64 @"RefCount~_ctor~Void"(ptr %rc_l4) |
| 68 | + %rcCmp_l4_i1 = icmp ne i64 %rc_l43, 0 |
| 69 | + br i1 %rcCmp_l4_i1, label %l3_chain_unwind, label %l4_rcc_ok |
| 70 | + |
| 71 | +l0_chain_unwind: ; preds = %l3_chain_unwind |
| 72 | + %RC1 = phi i64 [ %RC4, %l3_chain_unwind ] |
| 73 | + %RCLineNumber = phi i32 [ %RCLineNumber5, %l3_chain_unwind ] |
| 74 | + store i64 %RC1, ptr %RC, align 8 |
| 75 | + store i32 %RCLineNumber, ptr %RCLineNumber_l3, align 4 |
| 76 | + br label %main_rcc_unwind_top |
| 77 | + |
| 78 | +l3_chain_unwind: ; preds = %l4_rcc_ok, %main_first |
| 79 | + %RC4 = phi i64 [ %rc_l43, %main_first ], [ %rc_l5_i3, %l4_rcc_ok ] |
| 80 | + %RCLineNumber5 = phi i32 [ 4, %main_first ], [ 5, %l4_rcc_ok ] |
| 81 | + store i64 %RC4, ptr %RC, align 8 |
| 82 | + store i32 %RCLineNumber5, ptr %RCLineNumber_l3, align 4 |
| 83 | + %rc2_l6_unw_e = load ptr, ptr %rc2_l6, align 8 |
| 84 | + call void @"RefCount~_dtor~Void"(ptr %rc2_l6_unw_e, ptr %_context) |
| 85 | + store ptr null, ptr %rc2_l6, align 8 |
| 86 | + %rc_l4_unw_e = load ptr, ptr %rc_l4, align 8 |
| 87 | + call void @"RefCount~_dtor~Void"(ptr %rc_l4_unw_e, ptr %_context) |
| 88 | + store ptr null, ptr %rc_l4, align 8 |
| 89 | + br label %l0_chain_unwind |
| 90 | + |
| 91 | +l4_rcc_ok: ; preds = %main_first |
| 92 | + store ptr blockaddress(@main, %l5_regularExit), ptr %jmpAddr_l5_c2, align 8 |
| 93 | + %rc_l5_i3 = call i64 @_sub_split_main__split0(ptr %Result, ptr %_context, ptr %rc_l4, ptr %rc2_l6, ptr %jmpAddr_l5_c2) |
| 94 | + %rcCmp_l5_i4 = icmp ne i64 %rc_l5_i3, 0 |
| 95 | + br i1 %rcCmp_l5_i4, label %l3_chain_unwind, label %l5_rcc_ok |
| 96 | + |
| 97 | +returnExit: ; preds = %l5_rcc_ok |
| 98 | + %rc2_l6_unw_r = load ptr, ptr %rc2_l6, align 8 |
| 99 | + call void @"RefCount~_dtor~Void"(ptr %rc2_l6_unw_r, ptr %_context) |
| 100 | + store ptr null, ptr %rc2_l6, align 8 |
| 101 | + %rc_l4_unw_r = load ptr, ptr %rc_l4, align 8 |
| 102 | + call void @"RefCount~_dtor~Void"(ptr %rc_l4_unw_r, ptr %_context) |
| 103 | + store ptr null, ptr %rc_l4, align 8 |
| 104 | + br label %main_return |
| 105 | + |
| 106 | +l5_regularExit: ; No predecessors! |
| 107 | + %rc2_l6_unw = load ptr, ptr %rc2_l6, align 8 |
| 108 | + call void @"RefCount~_dtor~Void"(ptr %rc2_l6_unw, ptr %_context) |
| 109 | + store ptr null, ptr %rc2_l6, align 8 |
| 110 | + %rc_l4_unw = load ptr, ptr %rc_l4, align 8 |
| 111 | + call void @"RefCount~_dtor~Void"(ptr %rc_l4_unw, ptr %_context) |
| 112 | + store ptr null, ptr %rc_l4, align 8 |
| 113 | + br label %main_return |
| 114 | + |
| 115 | +l5_rcc_ok: ; preds = %l4_rcc_ok |
| 116 | + %jumpAddrLoaded = load ptr, ptr %jmpAddr_l5_c2, align 8 |
| 117 | + indirectbr ptr %jumpAddrLoaded, [label %returnExit] |
| 118 | + |
| 119 | +main_return: ; preds = %l5_regularExit, %returnExit, %main_rcc_unwind_top |
| 120 | + %RCValue = load i64, ptr %RC, align 8 |
| 121 | + ret i64 %RCValue |
| 122 | + |
| 123 | +main_rcc_unwind_top: ; preds = %l0_chain_unwind |
| 124 | + call void @stackTracePush() |
| 125 | + br label %main_return |
| 126 | +} |
| 127 | + |
| 128 | +; Function Attrs: nounwind sspreq willreturn |
| 129 | +declare void @stackTracePush() #1 |
| 130 | + |
| 131 | +; Function Attrs: nounwind sspreq willreturn |
| 132 | +declare i64 @"RefCount~_ctor~Void"(ptr) #1 |
| 133 | + |
| 134 | +; Function Attrs: nounwind sspreq willreturn |
| 135 | +declare i64 @"RefCount~_copyctor~RefCount~Void"(ptr, ptr, ptr) #1 |
| 136 | + |
| 137 | +; Function Attrs: nounwind sspreq willreturn |
| 138 | +declare i64 @"RefCount~rc~Int32"(ptr, ptr) #1 |
| 139 | + |
| 140 | +; Function Attrs: nounwind sspreq willreturn |
| 141 | +declare void @"RefCount~_dtor~Void"(ptr, ptr) #1 |
| 142 | + |
| 143 | +attributes #0 = { noinline nounwind optnone sspreq willreturn "frame-pointer"="all" } |
| 144 | +attributes #1 = { nounwind sspreq willreturn "frame-pointer"="all" } |
0 commit comments