mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[GlobalISel] Introduce a G_DYN_STACKALLOC opcode to represent dynamic allocas.
This just adds the opcode and verifier, it will be used to replace existing dynamic alloca handling in a subsequent patch. Differential Revision: https://reviews.llvm.org/D66677 llvm-svn: 369833
This commit is contained in:
parent
a4f53c7413
commit
b67ced190e
@ -590,12 +590,15 @@ HANDLE_TARGET_OPCODE(G_BLOCK_ADDR)
|
|||||||
/// Generic jump table address
|
/// Generic jump table address
|
||||||
HANDLE_TARGET_OPCODE(G_JUMP_TABLE)
|
HANDLE_TARGET_OPCODE(G_JUMP_TABLE)
|
||||||
|
|
||||||
|
/// Generic dynamic stack allocation.
|
||||||
|
HANDLE_TARGET_OPCODE(G_DYN_STACKALLOC)
|
||||||
|
|
||||||
// TODO: Add more generic opcodes as we move along.
|
// TODO: Add more generic opcodes as we move along.
|
||||||
|
|
||||||
/// Marker for the end of the generic opcode.
|
/// Marker for the end of the generic opcode.
|
||||||
/// This is used to check if an opcode is in the range of the
|
/// This is used to check if an opcode is in the range of the
|
||||||
/// generic opcodes.
|
/// generic opcodes.
|
||||||
HANDLE_TARGET_OPCODE_MARKER(PRE_ISEL_GENERIC_OPCODE_END, G_JUMP_TABLE)
|
HANDLE_TARGET_OPCODE_MARKER(PRE_ISEL_GENERIC_OPCODE_END, G_DYN_STACKALLOC)
|
||||||
|
|
||||||
/// BUILTIN_OP_END - This must be the last enum value in this list.
|
/// BUILTIN_OP_END - This must be the last enum value in this list.
|
||||||
/// The target-specific post-isel opcode values start here.
|
/// The target-specific post-isel opcode values start here.
|
||||||
|
@ -189,6 +189,12 @@ def G_JUMP_TABLE : GenericInstruction {
|
|||||||
let hasSideEffects = 0;
|
let hasSideEffects = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def G_DYN_STACKALLOC : GenericInstruction {
|
||||||
|
let OutOperandList = (outs ptype0:$dst);
|
||||||
|
let InOperandList = (ins type1:$size, i32imm:$align);
|
||||||
|
let hasSideEffects = 1;
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Binary ops.
|
// Binary ops.
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -1437,6 +1437,27 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TargetOpcode::G_DYN_STACKALLOC: {
|
||||||
|
const MachineOperand &DstOp = MI->getOperand(0);
|
||||||
|
const MachineOperand &AllocOp = MI->getOperand(1);
|
||||||
|
const MachineOperand &AlignOp = MI->getOperand(2);
|
||||||
|
|
||||||
|
if (!DstOp.isReg() || !MRI->getType(DstOp.getReg()).isPointer()) {
|
||||||
|
report("dst operand 0 must be a pointer type", MI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AllocOp.isReg() || !MRI->getType(AllocOp.getReg()).isScalar()) {
|
||||||
|
report("src operand 1 must be a scalar reg type", MI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AlignOp.isImm()) {
|
||||||
|
report("src operand 2 must be an immediate type", MI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
25
test/MachineVerifier/test_g_dyn_stackalloc.mir
Normal file
25
test/MachineVerifier/test_g_dyn_stackalloc.mir
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# RUN: not llc -march=aarch64 -o /dev/null -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
|
||||||
|
# REQUIRES: global-isel, aarch64-registered-target
|
||||||
|
|
||||||
|
---
|
||||||
|
name: test_dyn_stackalloc
|
||||||
|
legalized: true
|
||||||
|
tracksRegLiveness: true
|
||||||
|
body: |
|
||||||
|
bb.0:
|
||||||
|
liveins: $x0
|
||||||
|
%0:_(s64) = COPY $x0
|
||||||
|
%1:_(p0) = COPY $x0
|
||||||
|
; CHECK: Bad machine code: Too few operands
|
||||||
|
G_DYN_STACKALLOC
|
||||||
|
|
||||||
|
; CHECK: dst operand 0 must be a pointer type
|
||||||
|
%3:_(s64) = G_DYN_STACKALLOC %0, 4
|
||||||
|
|
||||||
|
; CHECK: src operand 1 must be a scalar reg type
|
||||||
|
%4:_(p0) = G_DYN_STACKALLOC 0, 4
|
||||||
|
|
||||||
|
; CHECK: src operand 2 must be an immediate type
|
||||||
|
%5:_(p0) = G_DYN_STACKALLOC %0, %0
|
||||||
|
|
||||||
|
...
|
Loading…
Reference in New Issue
Block a user