mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[RISCV] Support llvm.thread.pointer
Fixes https://bugs.llvm.org/show_bug.cgi?id=45303 (clang crashed on __builtin_thread_pointer) Reviewed By: lenary, MaskRay, luismarques Differential Revision: https://reviews.llvm.org/D76828
This commit is contained in:
parent
5704836e92
commit
c491612e0c
@ -210,6 +210,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
|
||||
|
||||
setOperationAction(ISD::TRAP, MVT::Other, Legal);
|
||||
setOperationAction(ISD::DEBUGTRAP, MVT::Other, Legal);
|
||||
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
|
||||
|
||||
if (Subtarget.hasStdExtA()) {
|
||||
setMaxAtomicSizeInBitsSupported(Subtarget.getXLen());
|
||||
@ -429,6 +430,8 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
|
||||
SDValue FPConv = DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, NewOp0);
|
||||
return FPConv;
|
||||
}
|
||||
case ISD::INTRINSIC_WO_CHAIN:
|
||||
return LowerINTRINSIC_WO_CHAIN(Op, DAG);
|
||||
}
|
||||
}
|
||||
|
||||
@ -832,6 +835,20 @@ SDValue RISCVTargetLowering::lowerShiftRightParts(SDValue Op, SelectionDAG &DAG,
|
||||
return DAG.getMergeValues(Parts, DL);
|
||||
}
|
||||
|
||||
SDValue RISCVTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
SDLoc DL(Op);
|
||||
switch (IntNo) {
|
||||
default:
|
||||
return SDValue(); // Don't custom lower most intrinsics.
|
||||
case Intrinsic::thread_pointer: {
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
return DAG.getRegister(RISCV::X4, PtrVT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the opcode of the target-specific SDNode that implements the 32-bit
|
||||
// form of the given Opcode.
|
||||
static RISCVISD::NodeType getRISCVWOpcode(unsigned Opcode) {
|
||||
|
@ -203,6 +203,7 @@ private:
|
||||
SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue lowerShiftRightParts(SDValue Op, SelectionDAG &DAG, bool IsSRA) const;
|
||||
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
||||
|
||||
bool isEligibleForTailCallOptimization(
|
||||
CCState &CCInfo, CallLoweringInfo &CLI, MachineFunction &MF,
|
||||
|
14
test/CodeGen/RISCV/thread-pointer.ll
Normal file
14
test/CodeGen/RISCV/thread-pointer.ll
Normal file
@ -0,0 +1,14 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=riscv64 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=riscv32 | FileCheck %s
|
||||
|
||||
declare i8* @llvm.thread.pointer()
|
||||
|
||||
define i8* @thread_pointer() nounwind {
|
||||
; CHECK-LABEL: thread_pointer:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: mv a0, tp
|
||||
; CHECK-NEXT: ret
|
||||
%1 = tail call i8* @llvm.thread.pointer()
|
||||
ret i8* %1
|
||||
}
|
Loading…
Reference in New Issue
Block a user