diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index b57d185bb638b..96115eb8eea52 100644 --- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -5475,7 +5475,8 @@ void PPCDAGToDAGISel::Select(SDNode *N) { // generate secure plt code for TLS symbols. getGlobalBaseReg(); } break; - case PPCISD::CALL: { + case PPCISD::CALL: + case PPCISD::CALL_RM: { if (PPCLowering->getPointerTy(CurDAG->getDataLayout()) != MVT::i32 || !TM.isPositionIndependent() || !Subtarget->isSecurePlt() || !Subtarget->isTargetELF()) @@ -5491,8 +5492,7 @@ void PPCDAGToDAGISel::Select(SDNode *N) { if (ES->getTargetFlags() == PPCII::MO_PLT) getGlobalBaseReg(); } - } - break; + } break; case PPCISD::GlobalBaseReg: ReplaceNode(N, getGlobalBaseReg()); diff --git a/llvm/test/CodeGen/PowerPC/ppc32-secure-plt-rm.ll b/llvm/test/CodeGen/PowerPC/ppc32-secure-plt-rm.ll new file mode 100644 index 0000000000000..96008b712e0e9 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/ppc32-secure-plt-rm.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -mattr=+secure-plt -relocation-model=pic | FileCheck %s + +; This variant of ppc32-pic-large.ll checks that a strictfp call sets +; r30 for the secure PLT. + +declare void @call_foo() + +define void @foo() { +entry: + call void @call_foo() #0 + ret void +} + +attributes #0 = { strictfp } + +!llvm.module.flags = !{!0} +!0 = !{i32 1, !"PIC Level", i32 2} + +; CHECK: addis 30, 30, .LTOC-.L0$pb@ha +; CHECK: addi 30, 30, .LTOC-.L0$pb@l +; CHECK: bl call_foo@PLT+32768