[PATCH] D35168: [mips] Handle the `long-calls` feature flags in the MIPS backend
Simon Atanasyan via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 9 06:15:03 PDT 2017
atanasyan created this revision.
Herald added a subscriber: arichardson.
If the `long-calls` feature flags is enabled, disable use of the `jal` instruction. Instead of that call a function by by first loading its address into a register, and then using the contents of that register.
Repository:
rL LLVM
https://reviews.llvm.org/D35168
Files:
lib/Target/Mips/Mips.td
lib/Target/Mips/MipsISelLowering.cpp
lib/Target/Mips/MipsSubtarget.h
test/CodeGen/Mips/long-calls.ll
Index: test/CodeGen/Mips/long-calls.ll
===================================================================
--- /dev/null
+++ test/CodeGen/Mips/long-calls.ll
@@ -0,0 +1,31 @@
+; RUN: llc -march=mips -mattr=-long-calls %s -o - \
+; RUN: | FileCheck -check-prefix=OFF %s
+; RUN: llc -march=mips -mattr=+long-calls %s -o - \
+; RUN: | FileCheck -check-prefix=ON %s
+
+declare void @callee()
+declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i32, i1)
+
+ at val = internal unnamed_addr global [20 x i32] zeroinitializer, align 4
+
+define void @caller() {
+
+; Use `jal` instruction with R_MIPS_26 relocation.
+; OFF: jal callee
+; OFF: jal memset
+
+; Save the `callee` and `memset` addresses in $25 register
+; and use `jalr` for the jumps.
+; ON: lui $1, %hi(callee)
+; ON: addiu $25, $1, %lo(callee)
+; ON: jalr $25
+
+; ON: addiu $1, $zero, %lo(memset)
+; ON: lui $2, %hi(memset)
+; ON: addu $25, $2, $1
+; ON: jalr $25
+
+ call void @callee()
+ call void @llvm.memset.p0i8.i32(i8* bitcast ([20 x i32]* @val to i8*), i8 0, i32 80, i32 4, i1 false)
+ ret void
+}
Index: lib/Target/Mips/MipsSubtarget.h
===================================================================
--- lib/Target/Mips/MipsSubtarget.h
+++ lib/Target/Mips/MipsSubtarget.h
@@ -149,6 +149,9 @@
// related instructions.
bool DisableMadd4;
+ // Disable use of the `jal` instruction.
+ bool UseLongCalls = false;
+
InstrItineraryData InstrItins;
// We can override the determination of whether we are in mips16 mode
@@ -265,6 +268,8 @@
bool useSoftFloat() const { return IsSoftFloat; }
+ bool useLongCalls() const { return UseLongCalls; }
+
bool enableLongBranchPass() const {
return hasStandardEncoding() || allowMixed16_32();
}
Index: lib/Target/Mips/MipsISelLowering.cpp
===================================================================
--- lib/Target/Mips/MipsISelLowering.cpp
+++ lib/Target/Mips/MipsISelLowering.cpp
@@ -3021,6 +3021,15 @@
EVT Ty = Callee.getValueType();
bool GlobalOrExternal = false, IsCallReloc = false;
+ if (Subtarget.useLongCalls() && Subtarget.hasSym32() && !IsPIC) {
+ // Get the address of the callee into a register to prevent
+ // using of the `jal` instruction for the direct call.
+ if (auto *N = dyn_cast<GlobalAddressSDNode>(Callee))
+ Callee = getAddrNonPIC(N, SDLoc(N), Ty, DAG);
+ else if (auto *N = dyn_cast<ExternalSymbolSDNode>(Callee))
+ Callee = getAddrNonPIC(N, SDLoc(N), Ty, DAG);
+ }
+
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
if (IsPIC) {
const GlobalValue *Val = G->getGlobal();
Index: lib/Target/Mips/Mips.td
===================================================================
--- lib/Target/Mips/Mips.td
+++ lib/Target/Mips/Mips.td
@@ -188,6 +188,9 @@
def FeatureMadd4 : SubtargetFeature<"nomadd4", "DisableMadd4", "true",
"Disable 4-operand madd.fmt and related instructions">;
+def FeatureLongCalls : SubtargetFeature<"long-calls", "UseLongCalls", "true",
+ "Disable use of the jal instruction">;
+
//===----------------------------------------------------------------------===//
// Mips processors supported.
//===----------------------------------------------------------------------===//
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35168.105736.patch
Type: text/x-patch
Size: 3352 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170709/17acfad6/attachment-0001.bin>
More information about the llvm-commits
mailing list