# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=riscv32 -x mir -run-pass=machine-outliner -simplify-mir -verify-machineinstrs < %s \ # RUN: | FileCheck %s # RUN: llc -mtriple=riscv64 -x mir -run-pass=machine-outliner -simplify-mir -verify-machineinstrs < %s \ # RUN: | FileCheck %s # RUN: llc -mtriple=riscv32 -x mir -run-pass=machine-outliner -simplify-mir --function-sections -verify-machineinstrs < %s \ # RUN: | FileCheck -check-prefix=CHECK-FS %s # RUN: llc -mtriple=riscv64 -x mir -run-pass=machine-outliner -simplify-mir --function-sections -verify-machineinstrs < %s \ # RUN: | FileCheck -check-prefix=CHECK-FS %s --- | ; Cannot outline instructions with pcrel-lo operands if function section ; enabled. @bar = dso_local local_unnamed_addr global i32 0, align 4 define i32 @foo(i32 %a, i32 %b) { ret i32 0 } $foo2 = comdat any define i32 @foo2(i32 %a, i32 %b) comdat { ret i32 0 } define i32 @foo3(i32 %a, i32 %b) section ".abc" { ret i32 0 } ... --- name: foo tracksRegLiveness: true body: | ; CHECK-LABEL: name: foo ; CHECK: bb.0: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11, implicit $x13 ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11, implicit $x13 ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11, implicit $x13 ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.3: ; CHECK-NEXT: PseudoRET ; CHECK-FS-LABEL: name: foo ; CHECK-FS: bb.0: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.1: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.2: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.3: ; CHECK-FS-NEXT: PseudoRET bb.0: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.1: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.2: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.3: PseudoRET ... --- name: foo2 tracksRegLiveness: true body: | ; CHECK-LABEL: name: foo2 ; CHECK: bb.0: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_1, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_1, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_1, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.3: ; CHECK-NEXT: PseudoRET ; CHECK-FS-LABEL: name: foo2 ; CHECK-FS: bb.0: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.1: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.2: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x5 = PseudoCALLReg target-flags(riscv-call) @OUTLINED_FUNCTION_0, implicit-def $x5, implicit-def $x10, implicit-def $x11, implicit-def $x12, implicit $x10, implicit $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.3: ; CHECK-FS-NEXT: PseudoRET bb.0: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.1: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.2: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.3: PseudoRET ... --- name: foo3 tracksRegLiveness: true body: | ; CHECK-LABEL: name: foo3 ; CHECK: bb.0: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x11 = ORI $x11, 1023 ; CHECK-NEXT: $x12 = ADDI $x10, 17 ; CHECK-NEXT: $x11 = AND $x12, $x11 ; CHECK-NEXT: $x10 = SUB $x10, $x11 ; CHECK-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x11 = ORI $x11, 1023 ; CHECK-NEXT: $x12 = ADDI $x10, 17 ; CHECK-NEXT: $x11 = AND $x12, $x11 ; CHECK-NEXT: $x10 = SUB $x10, $x11 ; CHECK-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: liveins: $x10, $x11, $x13 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $x11 = ORI $x11, 1023 ; CHECK-NEXT: $x12 = ADDI $x10, 17 ; CHECK-NEXT: $x11 = AND $x12, $x11 ; CHECK-NEXT: $x10 = SUB $x10, $x11 ; CHECK-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-NEXT: PseudoBR %bb.3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.3: ; CHECK-NEXT: PseudoRET ; CHECK-FS-LABEL: name: foo3 ; CHECK-FS: bb.0: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x11 = ORI $x11, 1023 ; CHECK-FS-NEXT: $x12 = ADDI $x10, 17 ; CHECK-FS-NEXT: $x11 = AND $x12, $x11 ; CHECK-FS-NEXT: $x10 = SUB $x10, $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.1: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x11 = ORI $x11, 1023 ; CHECK-FS-NEXT: $x12 = ADDI $x10, 17 ; CHECK-FS-NEXT: $x11 = AND $x12, $x11 ; CHECK-FS-NEXT: $x10 = SUB $x10, $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.2: ; CHECK-FS-NEXT: liveins: $x10, $x11, $x13 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: $x11 = ORI $x11, 1023 ; CHECK-FS-NEXT: $x12 = ADDI $x10, 17 ; CHECK-FS-NEXT: $x11 = AND $x12, $x11 ; CHECK-FS-NEXT: $x10 = SUB $x10, $x11 ; CHECK-FS-NEXT: $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) ; CHECK-FS-NEXT: PseudoBR %bb.3 ; CHECK-FS-NEXT: {{ $}} ; CHECK-FS-NEXT: bb.3: ; CHECK-FS-NEXT: PseudoRET bb.0: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.1: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.2: liveins: $x10, $x11, $x13 $x11 = ORI $x11, 1023 $x12 = ADDI $x10, 17 $x11 = AND $x12, $x11 $x10 = SUB $x10, $x11 $x11 = LW killed renamable $x13, target-flags(riscv-pcrel-lo) :: (dereferenceable load (s32) from @bar) PseudoBR %bb.3 bb.3: PseudoRET ...