129 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 52# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=tailduplication -tail-dup-pred-size=1 -tail-dup-succ-size=1 %s -o - | FileCheck %s3#4# Check that only the computed gotos are duplicated aggressively.5#6--- |7 @computed_goto.dispatch = constant [5 x ptr] [ptr null, ptr blockaddress(@computed_goto, %bb1), ptr blockaddress(@computed_goto, %bb2), ptr blockaddress(@computed_goto, %bb3), ptr blockaddress(@computed_goto, %bb4)]8 declare i64 @f0()9 declare i64 @f1()10 declare i64 @f2()11 declare i64 @f3()12 declare i64 @f4()13 declare i64 @f5()14 define void @computed_goto() {15 start:16 ret void17 bb1:18 ret void19 bb2:20 ret void21 bb3:22 ret void23 bb4:24 ret void25 }26 define void @jump_table() { ret void }27 define void @jump_table_pic() { ret void }28...29---30name: computed_goto31alignment: 132exposesReturnsTwice: false33legalized: false34regBankSelected: false35selected: false36failedISel: false37tracksRegLiveness: true38body: |39 ; CHECK-LABEL: name: computed_goto40 ; CHECK: bb.0:41 ; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)42 ; CHECK-NEXT: {{ $}}43 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax44 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rax45 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_nosp = COPY [[COPY]]46 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64_nosp = COPY [[COPY1]]47 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY2]], @computed_goto.dispatch, $noreg48 ; CHECK-NEXT: {{ $}}49 ; CHECK-NEXT: bb.1.bb1 (ir-block-address-taken %ir-block.bb1):50 ; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)51 ; CHECK-NEXT: {{ $}}52 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax53 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr64 = COPY $rax54 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_nosp = COPY [[COPY3]]55 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64_nosp = COPY [[COPY1]]56 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY2]], @computed_goto.dispatch, $noreg57 ; CHECK-NEXT: {{ $}}58 ; CHECK-NEXT: bb.2.bb2 (ir-block-address-taken %ir-block.bb2):59 ; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)60 ; CHECK-NEXT: {{ $}}61 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax62 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr64 = COPY $rax63 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_nosp = COPY [[COPY4]]64 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64_nosp = COPY [[COPY1]]65 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY2]], @computed_goto.dispatch, $noreg66 ; CHECK-NEXT: {{ $}}67 ; CHECK-NEXT: bb.3.bb3 (ir-block-address-taken %ir-block.bb3):68 ; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)69 ; CHECK-NEXT: {{ $}}70 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax71 ; CHECK-NEXT: [[COPY5:%[0-9]+]]:gr64 = COPY $rax72 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_nosp = COPY [[COPY5]]73 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64_nosp = COPY [[COPY1]]74 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY2]], @computed_goto.dispatch, $noreg75 ; CHECK-NEXT: {{ $}}76 ; CHECK-NEXT: bb.4.bb4 (ir-block-address-taken %ir-block.bb4):77 ; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)78 ; CHECK-NEXT: {{ $}}79 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax80 ; CHECK-NEXT: [[COPY6:%[0-9]+]]:gr64 = COPY $rax81 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_nosp = COPY [[COPY6]]82 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64_nosp = COPY [[COPY1]]83 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY2]], @computed_goto.dispatch, $noreg84 bb.0:85 successors: %bb.5(0x80000000)86 87 CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax88 %0:gr64 = COPY $rax89 %6:gr64_nosp = COPY %090 JMP_1 %bb.591 92 bb.1.bb1 (ir-block-address-taken %ir-block.bb1):93 successors: %bb.5(0x80000000)94 95 CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax96 %1:gr64 = COPY $rax97 %6:gr64_nosp = COPY %198 JMP_1 %bb.599 100 bb.2.bb2 (ir-block-address-taken %ir-block.bb2):101 successors: %bb.5(0x80000000)102 103 CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax104 %2:gr64 = COPY $rax105 %6:gr64_nosp = COPY %2106 JMP_1 %bb.5107 108 bb.3.bb3 (ir-block-address-taken %ir-block.bb3):109 successors: %bb.5(0x80000000)110 111 CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax112 %3:gr64 = COPY $rax113 %6:gr64_nosp = COPY %3114 JMP_1 %bb.5115 116 bb.4.bb4 (ir-block-address-taken %ir-block.bb4):117 successors: %bb.5(0x80000000)118 119 CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax120 %4:gr64 = COPY $rax121 %6:gr64_nosp = COPY %4122 123 bb.5:124 successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)125 126 %5:gr64_nosp = COPY %6127 JMP64m $noreg, 8, %5, @computed_goto.dispatch, $noreg128...129