forked from OSchip/llvm-project
[RISCV] Fix Machine Outliner jump table handling.
Don't outline machine instructions which are using jump table indexes since they are materialized as local labels (like the already handled case of constant pools). Reviewed By: paquette Differential Revision: https://reviews.llvm.org/D109436
This commit is contained in:
parent
12dcbf913c
commit
261cbe98c3
|
@ -1139,7 +1139,7 @@ RISCVInstrInfo::getOutliningType(MachineBasicBlock::iterator &MBBI,
|
|||
|
||||
// Make sure the operands don't reference something unsafe.
|
||||
for (const auto &MO : MI.operands())
|
||||
if (MO.isMBB() || MO.isBlockAddress() || MO.isCPI())
|
||||
if (MO.isMBB() || MO.isBlockAddress() || MO.isCPI() || MO.isJTI())
|
||||
return outliner::InstrType::Illegal;
|
||||
|
||||
// Don't allow instructions which won't be materialized to impact outlining
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
# RUN: llc -march=riscv32 -x mir -run-pass=machine-outliner -simplify-mir -verify-machineinstrs < %s \
|
||||
# RUN: | FileCheck -check-prefix=RV32I-MO %s
|
||||
# RUN: llc -march=riscv64 -x mir -run-pass=machine-outliner -simplify-mir -verify-machineinstrs < %s \
|
||||
# RUN: | FileCheck -check-prefix=RV64I-MO %s
|
||||
|
||||
--- |
|
||||
; Cannot outline instructions with jump-table index operands
|
||||
define i32 @foo(i32 %a, i32 %b) #0 { ret i32 0 }
|
||||
|
||||
...
|
||||
---
|
||||
name: foo
|
||||
tracksRegLiveness: true
|
||||
jumpTable:
|
||||
kind: block-address
|
||||
entries:
|
||||
- id: 0
|
||||
blocks: [ '%bb.0', '%bb.1', '%bb.2', '%bb.3' ]
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $x10, $x11
|
||||
; RV32I-MO-LABEL: name: foo
|
||||
; RV32I-MO: $x5 = PseudoCALLReg {{.*}} @OUTLINED_FUNCTION_0
|
||||
; RV32I-MO: $x12 = LUI target-flags(riscv-hi) %jump-table.0
|
||||
; RV32I-MO: $x12 = ADDI $x12, target-flags(riscv-lo) %jump-table.0
|
||||
;
|
||||
; RV64I-MO-LABEL: name: foo
|
||||
; RV64I-MO: $x5 = PseudoCALLReg {{.*}} @OUTLINED_FUNCTION_0
|
||||
; RV64I-MO: $x12 = LUI target-flags(riscv-hi) %jump-table.0
|
||||
; RV64I-MO: $x12 = ADDI $x12, target-flags(riscv-lo) %jump-table.0
|
||||
|
||||
$x11 = ORI $x11, 1023
|
||||
$x12 = ADDI $x10, 17
|
||||
$x11 = AND $x12, $x11
|
||||
$x10 = SUB $x10, $x11
|
||||
$x12 = LUI target-flags(riscv-hi) %jump-table.0
|
||||
$x12 = ADDI $x12, target-flags(riscv-lo) %jump-table.0
|
||||
PseudoBR %bb.3
|
||||
|
||||
bb.1:
|
||||
liveins: $x10, $x11
|
||||
|
||||
$x11 = ORI $x11, 1023
|
||||
$x12 = ADDI $x10, 17
|
||||
$x11 = AND $x12, $x11
|
||||
$x10 = SUB $x10, $x11
|
||||
$x12 = LUI target-flags(riscv-hi) %jump-table.0
|
||||
$x12 = ADDI $x12, target-flags(riscv-lo) %jump-table.0
|
||||
PseudoBR %bb.3
|
||||
|
||||
bb.2:
|
||||
liveins: $x10, $x11
|
||||
|
||||
$x11 = ORI $x11, 1023
|
||||
$x12 = ADDI $x10, 17
|
||||
$x11 = AND $x12, $x11
|
||||
$x10 = SUB $x10, $x11
|
||||
$x12 = LUI target-flags(riscv-hi) %jump-table.0
|
||||
$x12 = ADDI $x12, target-flags(riscv-lo) %jump-table.0
|
||||
PseudoBR %bb.3
|
||||
|
||||
bb.3:
|
||||
PseudoRET
|
||||
|
||||
...
|
Loading…
Reference in New Issue