252 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=x86_64-- -run-pass=machine-sink -verify-machineinstrs -o - %s | FileCheck %s3 4---5name: func_no_pic6tracksRegLiveness: true7jumpTable:8 kind: block-address9 entries:10 - id: 011 blocks: [ '%bb.4', '%bb.1', '%bb.2', '%bb.3' ]12body: |13 ; CHECK-LABEL: name: func_no_pic14 ; CHECK: bb.0:15 ; CHECK-NEXT: successors: %bb.5(0x20000000), %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000)16 ; CHECK-NEXT: liveins: $edi17 ; CHECK-NEXT: {{ $}}18 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64_nosp = COPY $rdi19 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY]], %jump-table.0, $noreg :: (load (s64) from jump-table)20 ; CHECK-NEXT: {{ $}}21 ; CHECK-NEXT: bb.5:22 ; CHECK-NEXT: successors: %bb.4(0x80000000)23 ; CHECK-NEXT: {{ $}}24 ; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 4225 ; CHECK-NEXT: JMP_1 %bb.426 ; CHECK-NEXT: {{ $}}27 ; CHECK-NEXT: bb.1:28 ; CHECK-NEXT: successors: %bb.4(0x80000000)29 ; CHECK-NEXT: {{ $}}30 ; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 631 ; CHECK-NEXT: JMP_1 %bb.432 ; CHECK-NEXT: {{ $}}33 ; CHECK-NEXT: bb.2:34 ; CHECK-NEXT: successors: %bb.4(0x80000000)35 ; CHECK-NEXT: {{ $}}36 ; CHECK-NEXT: [[MOV32ri2:%[0-9]+]]:gr32 = MOV32ri 137 ; CHECK-NEXT: JMP_1 %bb.438 ; CHECK-NEXT: {{ $}}39 ; CHECK-NEXT: bb.3:40 ; CHECK-NEXT: successors: %bb.4(0x80000000)41 ; CHECK-NEXT: {{ $}}42 ; CHECK-NEXT: [[MOV32ri3:%[0-9]+]]:gr32 = MOV32ri 9243 ; CHECK-NEXT: JMP_1 %bb.444 ; CHECK-NEXT: {{ $}}45 ; CHECK-NEXT: bb.4:46 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gr32 = PHI [[MOV32ri]], %bb.5, [[MOV32ri1]], %bb.1, [[MOV32ri2]], %bb.2, [[MOV32ri3]], %bb.347 ; CHECK-NEXT: $eax = COPY [[PHI]]48 ; CHECK-NEXT: RET 049 bb.0:50 successors: %bb.4, %bb.1, %bb.2, %bb.351 liveins: $edi52 53 %0:gr64_nosp = COPY $rdi54 ; MachineSink should split the critical edges and sink the next two55 ; insns out of the switch-jump header into new less frequently executed56 ; blocks.57 %1:gr32 = MOV32ri 4258 JMP64m $noreg, 8, %0, %jump-table.0, $noreg :: (load (s64) from jump-table)59 60 bb.1:61 %2:gr32 = MOV32ri 662 JMP_1 %bb.463 64 bb.2:65 %3:gr32 = MOV32ri 166 JMP_1 %bb.467 68 bb.3:69 %4:gr32 = MOV32ri 9270 JMP_1 %bb.471 72 bb.4:73 %5:gr32 = PHI %1, %bb.0, %2, %bb.1, %3, %bb.2, %4, %bb.374 $eax = COPY %575 RET 076 77...78---79name: func_pic80tracksRegLiveness: true81jumpTable:82 kind: label-difference3283 entries:84 - id: 085 blocks: [ '%bb.4', '%bb.1', '%bb.2', '%bb.3' ]86body: |87 ; CHECK-LABEL: name: func_pic88 ; CHECK: bb.0:89 ; CHECK-NEXT: successors: %bb.5(0x20000000), %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000)90 ; CHECK-NEXT: liveins: $edi91 ; CHECK-NEXT: {{ $}}92 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64_nosp = COPY $rdi93 ; CHECK-NEXT: [[LEA64r:%[0-9]+]]:gr64 = LEA64r $rip, 1, $noreg, %jump-table.0, $noreg94 ; CHECK-NEXT: [[MOVSX64rm32_:%[0-9]+]]:gr64 = MOVSX64rm32 [[LEA64r]], 4, [[COPY]], 0, $noreg :: (load (s32) from jump-table)95 ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[MOVSX64rm32_]], [[LEA64r]], implicit-def dead $eflags96 ; CHECK-NEXT: JMP64r killed [[ADD64rr]]97 ; CHECK-NEXT: {{ $}}98 ; CHECK-NEXT: bb.5:99 ; CHECK-NEXT: successors: %bb.4(0x80000000)100 ; CHECK-NEXT: {{ $}}101 ; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42102 ; CHECK-NEXT: JMP_1 %bb.4103 ; CHECK-NEXT: {{ $}}104 ; CHECK-NEXT: bb.1:105 ; CHECK-NEXT: successors: %bb.4(0x80000000)106 ; CHECK-NEXT: {{ $}}107 ; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 6108 ; CHECK-NEXT: JMP_1 %bb.4109 ; CHECK-NEXT: {{ $}}110 ; CHECK-NEXT: bb.2:111 ; CHECK-NEXT: successors: %bb.4(0x80000000)112 ; CHECK-NEXT: {{ $}}113 ; CHECK-NEXT: [[MOV32ri2:%[0-9]+]]:gr32 = MOV32ri 1114 ; CHECK-NEXT: JMP_1 %bb.4115 ; CHECK-NEXT: {{ $}}116 ; CHECK-NEXT: bb.3:117 ; CHECK-NEXT: successors: %bb.4(0x80000000)118 ; CHECK-NEXT: {{ $}}119 ; CHECK-NEXT: [[MOV32ri3:%[0-9]+]]:gr32 = MOV32ri 92120 ; CHECK-NEXT: JMP_1 %bb.4121 ; CHECK-NEXT: {{ $}}122 ; CHECK-NEXT: bb.4:123 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gr32 = PHI [[MOV32ri]], %bb.5, [[MOV32ri1]], %bb.1, [[MOV32ri2]], %bb.2, [[MOV32ri3]], %bb.3124 ; CHECK-NEXT: $eax = COPY [[PHI]]125 ; CHECK-NEXT: RET 0126 bb.0:127 successors: %bb.4, %bb.1, %bb.2, %bb.3128 liveins: $edi129 130 %0:gr64_nosp = COPY $rdi131 ; MachineSink should split the critical edges and sink the next two132 ; insns out of the switch-jump header into new less frequently executed133 ; blocks.134 %1:gr32 = MOV32ri 42135 %2:gr64 = LEA64r $rip, 1, $noreg, %jump-table.0, $noreg136 %3:gr64 = MOVSX64rm32 %2, 4, %0, 0, $noreg :: (load (s32) from jump-table)137 %4:gr64 = ADD64rr %3, %2, implicit-def dead $eflags138 JMP64r killed %4139 140 bb.1:141 %5:gr32 = MOV32ri 6142 JMP_1 %bb.4143 144 bb.2:145 %6:gr32 = MOV32ri 1146 JMP_1 %bb.4147 148 bb.3:149 %7:gr32 = MOV32ri 92150 JMP_1 %bb.4151 152 bb.4:153 %8:gr32 = PHI %1, %bb.0, %5, %bb.1, %6, %bb.2, %7, %bb.3154 $eax = COPY %8155 RET 0156 157...158---159name: multiple_jump_table_users160tracksRegLiveness: true161jumpTable:162 kind: block-address163 entries:164 - id: 0165 blocks: [ '%bb.6', '%bb.3', '%bb.4', '%bb.5' ]166body: |167 ; CHECK-LABEL: name: multiple_jump_table_users168 ; CHECK: bb.0:169 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)170 ; CHECK-NEXT: liveins: $edi171 ; CHECK-NEXT: {{ $}}172 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64_nosp = COPY $rdi173 ; CHECK-NEXT: CMP64ri8 [[COPY]], 42, implicit-def $eflags174 ; CHECK-NEXT: JCC_1 %bb.1, 15, implicit $eflags175 ; CHECK-NEXT: JMP_1 %bb.2176 ; CHECK-NEXT: {{ $}}177 ; CHECK-NEXT: bb.1:178 ; CHECK-NEXT: successors: %bb.6(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000), %bb.5(0x20000000)179 ; CHECK-NEXT: {{ $}}180 ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */181 ; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 13182 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY]], %jump-table.0, $noreg :: (load (s64) from jump-table)183 ; CHECK-NEXT: {{ $}}184 ; CHECK-NEXT: bb.2:185 ; CHECK-NEXT: successors: %bb.6(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000), %bb.5(0x20000000)186 ; CHECK-NEXT: {{ $}}187 ; CHECK-NEXT: INLINEASM &"", 1 /* sideeffect attdialect */188 ; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 42189 ; CHECK-NEXT: JMP64m $noreg, 8, [[COPY]], %jump-table.0, $noreg :: (load (s64) from jump-table)190 ; CHECK-NEXT: {{ $}}191 ; CHECK-NEXT: bb.3:192 ; CHECK-NEXT: successors: %bb.6(0x80000000)193 ; CHECK-NEXT: {{ $}}194 ; CHECK-NEXT: [[MOV32ri2:%[0-9]+]]:gr32 = MOV32ri 6195 ; CHECK-NEXT: JMP_1 %bb.6196 ; CHECK-NEXT: {{ $}}197 ; CHECK-NEXT: bb.4:198 ; CHECK-NEXT: successors: %bb.6(0x80000000)199 ; CHECK-NEXT: {{ $}}200 ; CHECK-NEXT: [[MOV32ri3:%[0-9]+]]:gr32 = MOV32ri 1201 ; CHECK-NEXT: JMP_1 %bb.6202 ; CHECK-NEXT: {{ $}}203 ; CHECK-NEXT: bb.5:204 ; CHECK-NEXT: successors: %bb.6(0x80000000)205 ; CHECK-NEXT: {{ $}}206 ; CHECK-NEXT: [[MOV32ri4:%[0-9]+]]:gr32 = MOV32ri 92207 ; CHECK-NEXT: JMP_1 %bb.6208 ; CHECK-NEXT: {{ $}}209 ; CHECK-NEXT: bb.6:210 ; CHECK-NEXT: [[PHI:%[0-9]+]]:gr32 = PHI [[MOV32ri]], %bb.1, [[MOV32ri1]], %bb.2, [[MOV32ri2]], %bb.3, [[MOV32ri3]], %bb.4, [[MOV32ri4]], %bb.5211 ; CHECK-NEXT: $eax = COPY [[PHI]]212 ; CHECK-NEXT: RET 0213 bb.0:214 liveins: $edi215 %0:gr64_nosp = COPY $rdi216 217 CMP64ri8 %0:gr64_nosp, 42, implicit-def $eflags218 JCC_1 %bb.1, 15, implicit $eflags219 JMP_1 %bb.2220 221 bb.1:222 successors: %bb.6, %bb.3, %bb.4, %bb.5223 INLINEASM &"", 1 /* sideeffect attdialect */224 %1:gr32 = MOV32ri 13225 JMP64m $noreg, 8, %0, %jump-table.0, $noreg :: (load (s64) from jump-table)226 227 bb.2:228 successors: %bb.6, %bb.3, %bb.4, %bb.5229 INLINEASM &"", 1 /* sideeffect attdialect */230 %2:gr32 = MOV32ri 42231 ; This is a 2d user of jump-table.0 . This case is not supported yet;232 ; Should not attempt edge splitting.233 JMP64m $noreg, 8, %0, %jump-table.0, $noreg :: (load (s64) from jump-table)234 235 bb.3:236 %3:gr32 = MOV32ri 6237 JMP_1 %bb.6238 239 bb.4:240 %4:gr32 = MOV32ri 1241 JMP_1 %bb.6242 243 bb.5:244 %5:gr32 = MOV32ri 92245 JMP_1 %bb.6246 247 bb.6:248 %6:gr32 = PHI %1, %bb.1, %2, %bb.2, %3, %bb.3, %4, %bb.4, %5, %bb.5249 $eax = COPY %6250 RET 0251...252