mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
patchpoint: factor SD builder code for live vars. Plain stackmap also optimizes Constant values now.
llvm-svn: 195488
This commit is contained in:
parent
e150fb7056
commit
0167d0293a
@ -6781,6 +6781,23 @@ SelectionDAGBuilder::LowerCallOperands(const CallInst &CI, unsigned ArgIdx,
|
||||
return TLI->LowerCallTo(CLI);
|
||||
}
|
||||
|
||||
/// \brief Add a stack map intrinsic call's live variable operands to a stackmap
|
||||
/// or patchpoint target node's operand list.
|
||||
static void addStackMapLiveVars(const CallInst &CI, unsigned StartIdx,
|
||||
SmallVectorImpl<SDValue> &Ops,
|
||||
SelectionDAGBuilder &Builder) {
|
||||
for (unsigned i = StartIdx, e = CI.getNumArgOperands(); i != e; ++i) {
|
||||
SDValue OpVal = Builder.getValue(CI.getArgOperand(i));
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(OpVal)) {
|
||||
Ops.push_back(
|
||||
Builder.DAG.getTargetConstant(StackMaps::ConstantOp, MVT::i64));
|
||||
Ops.push_back(
|
||||
Builder.DAG.getTargetConstant(C->getSExtValue(), MVT::i64));
|
||||
} else
|
||||
Ops.push_back(OpVal);
|
||||
}
|
||||
}
|
||||
|
||||
/// \brief Lower llvm.experimental.stackmap directly to its target opcode.
|
||||
void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
|
||||
// void @llvm.experimental.stackmap(i32 <id>, i32 <numShadowBytes>,
|
||||
@ -6814,8 +6831,7 @@ void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
|
||||
cast<ConstantSDNode>(tmp)->getZExtValue(), MVT::i32));
|
||||
}
|
||||
// Push live variables for the stack map.
|
||||
for (unsigned i = 2, e = CI.getNumArgOperands(); i != e; ++i)
|
||||
Ops.push_back(getValue(CI.getArgOperand(i)));
|
||||
addStackMapLiveVars(CI, 2, Ops, *this);
|
||||
|
||||
// Push the chain (this is originally the first operand of the call, but
|
||||
// becomes now the last or second to last operand).
|
||||
@ -6923,17 +6939,7 @@ void SelectionDAGBuilder::visitPatchpoint(const CallInst &CI) {
|
||||
Ops.push_back(*i);
|
||||
|
||||
// Push live variables for the stack map.
|
||||
for (unsigned i = NumMetaOpers + NumArgs, e = CI.getNumArgOperands();
|
||||
i != e; ++i) {
|
||||
SDValue OpVal = getValue(CI.getArgOperand(i));
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(OpVal)) {
|
||||
Ops.push_back(
|
||||
DAG.getTargetConstant(StackMaps::ConstantOp, MVT::i64));
|
||||
Ops.push_back(
|
||||
DAG.getTargetConstant(C->getSExtValue(), MVT::i64));
|
||||
} else
|
||||
Ops.push_back(OpVal);
|
||||
}
|
||||
addStackMapLiveVars(CI, NumMetaOpers + NumArgs, Ops, *this);
|
||||
|
||||
// Push the register mask info.
|
||||
if (hasGlue)
|
||||
|
@ -9,7 +9,7 @@
|
||||
; CHECK-NEXT: .long 1
|
||||
; CHECK-NEXT: .quad 4294967296
|
||||
; Num Callsites
|
||||
; CHECK-NEXT: .long 11
|
||||
; CHECK-NEXT: .long 12
|
||||
|
||||
; Constant arguments
|
||||
;
|
||||
@ -287,6 +287,24 @@ define void @subRegOffset(i16 %arg) {
|
||||
ret void
|
||||
}
|
||||
|
||||
; Map a constant value.
|
||||
;
|
||||
; CHECK: .long 15
|
||||
; CHECK-LABEL: .long L{{.*}}-_liveConstant
|
||||
; CHECK-NEXT: .short 0
|
||||
; 1 location
|
||||
; CHECK-NEXT: .short 1
|
||||
; Loc 0: SmallConstant
|
||||
; CHECK-NEXT: .byte 4
|
||||
; CHECK-NEXT: .byte 8
|
||||
; CHECK-NEXT: .short 0
|
||||
; CHECK-NEXT: .long 33
|
||||
|
||||
define void @liveConstant() {
|
||||
tail call void (i32, i32, ...)* @llvm.experimental.stackmap(i32 15, i32 5, i32 33)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @llvm.experimental.stackmap(i32, i32, ...)
|
||||
declare void @llvm.experimental.patchpoint.void(i32, i32, i8*, i32, ...)
|
||||
declare i64 @llvm.experimental.patchpoint.i64(i32, i32, i8*, i32, ...)
|
||||
|
Loading…
x
Reference in New Issue
Block a user