| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --filter "SLLI|SRAI|ADDI|XOR|ADD|JALR|PseudoCALLReg" --version 5 | |
| # The two runs intentionally use the same check prefix: debug instructions | |
| # must not change outlining decisions, calls, or outlined-function numbering. | |
| # `critical` is intentionally too short to outline in both runs; | |
| # the debug operands in a0/a1/a2 exercise candidate liveness. | |
| # RUN: llc -mtriple=riscv32-unknown-elf -run-pass=machine-outliner \ | |
| # RUN: -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK | |
| # RUN: llc -mtriple=riscv32-unknown-elf \ | |
| # RUN: -run-pass=mir-strip-debug,machine-outliner \ | |
| # RUN: -mir-strip-debugify-only=0 -verify-machineinstrs %s -o - | \ | |
| # RUN: FileCheck %s --check-prefix=CHECK | |
| --- | | |
| define void @critical() { ret void } | |
| define void @a0() { ret void } | |
| define void @a1() { ret void } | |
| define void @a2() { ret void } | |
| define void @b0() { ret void } | |
| define void @b1() { ret void } | |
| define void @b2() { ret void } | |
| define void @c0() { ret void } | |
| define void @c1() { ret void } | |
| define void @c2() { ret void } | |
| define void @d0() { ret void } | |
| define void @d1() { ret void } | |
| define void @d2() { ret void } | |
| ... | |
| --- | |
| name: critical | |
| tracksRegLiveness: true | |
| body: | | |
| ; CHECK-LABEL: name: critical | |
| ; CHECK: bb.0: | |
| ; CHECK: bb.1: | |
| bb.0: | |
| liveins: $x7, $x15 | |
| DBG_VALUE $x15, $noreg | |
| $x12 = DIV $x7, $x15 | |
| bb.1: | |
| PseudoRET | |
| ... | |
| --- | |
| name: a0 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: a0 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_3, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 1 | |
| $x11 = SLLI $x10, 10 | |
| DBG_VALUE $x5, $noreg | |
| $x10 = SRAI $x11, 21 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 10 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 1 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: a1 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: a1 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_3, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 2 | |
| $x11 = SLLI $x10, 10 | |
| DBG_VALUE $x5, $noreg | |
| $x10 = SRAI $x11, 21 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 10 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 2 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: a2 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: a2 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_3, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 3 | |
| $x11 = SLLI $x10, 10 | |
| DBG_VALUE $x5, $noreg | |
| $x10 = SRAI $x11, 21 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 10 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 3 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: b0 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: b0 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 4 | |
| $x11 = SLLI $x10, 21 | |
| $x10 = SRAI $x11, 21 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 21 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 4 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: b1 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: b1 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 5 | |
| $x11 = SLLI $x10, 21 | |
| $x10 = SRAI $x11, 21 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 21 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 5 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: b2 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: b2 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 6 | |
| $x11 = SLLI $x10, 21 | |
| $x10 = SRAI $x11, 21 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 21 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 6 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: c0 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: c0 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_1, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 7 | |
| $x11 = SLLI $x10, 3 | |
| $x10 = SRAI $x11, 3 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 3 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 7 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: c1 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: c1 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_1, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 8 | |
| $x11 = SLLI $x10, 3 | |
| $x10 = SRAI $x11, 3 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 3 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 8 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: c2 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: c2 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_1, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 9 | |
| $x11 = SLLI $x10, 3 | |
| $x10 = SRAI $x11, 3 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 3 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 9 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: d0 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: d0 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_2, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 10 | |
| $x11 = SLLI $x10, 18 | |
| $x10 = SRAI $x11, 18 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 18 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 10 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: d1 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: d1 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_2, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 11 | |
| $x11 = SLLI $x10, 18 | |
| $x10 = SRAI $x11, 18 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 18 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 11 | |
| PseudoRET implicit $x10 | |
| ... | |
| --- | |
| name: d2 | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $x10 | |
| ; CHECK-LABEL: name: d2 | |
| ; CHECK: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_2, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit-def $x13, implicit-def $x14, implicit $x10 | |
| ; CHECK-NEXT: $x0 = ADDI $x0, 12 | |
| $x11 = SLLI $x10, 18 | |
| $x10 = SRAI $x11, 18 | |
| $x11 = SRAI $x11, 31 | |
| $x12 = ADDI $x10, 18 | |
| $x13 = XOR $x12, $x11 | |
| $x14 = ADD $x13, $x10 | |
| $x0 = ADDI $x0, 12 | |
| PseudoRET implicit $x10 | |
| ... |