[PATCH] D153782: [ARM] allow long-call codegen for armv6-M eXecute Only (XO)

Ties Stuij via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 28 02:50:58 PDT 2023


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG4f19c6a7c742: [ARM] allow long-call codegen for armv6-M eXecute Only (XO) (authored by stuij).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D153782/new/

https://reviews.llvm.org/D153782

Files:
  llvm/lib/Target/ARM/ARMISelLowering.cpp
  llvm/test/CodeGen/ARM/large-stack.ll
  llvm/test/CodeGen/Thumb/thumb-execute-only-long-calls.ll
  llvm/test/CodeGen/Thumb2/thumb2-execute-only-long-calls.ll


Index: llvm/test/CodeGen/Thumb2/thumb2-execute-only-long-calls.ll
===================================================================
--- llvm/test/CodeGen/Thumb2/thumb2-execute-only-long-calls.ll
+++ llvm/test/CodeGen/Thumb2/thumb2-execute-only-long-calls.ll
@@ -23,7 +23,7 @@
 ; RWPI:       movw    [[REG0:r[0-9]+]], :lower16:bar
 ; RWPI-NEXT:  movt    [[REG0]], :upper16:bar
 ; RWPI-NEXT:  blx     [[REG0]]
-; RWPI-NOT:   .LCPI0_0:
+; RWPI-NOT:   .LCPI1_0:
 entry:
   call void @bar()
   ret void
Index: llvm/test/CodeGen/Thumb/thumb-execute-only-long-calls.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/Thumb/thumb-execute-only-long-calls.ll
@@ -0,0 +1,34 @@
+; RUN: llc < %s -mtriple=thumbv6m-arm-none-eabi -relocation-model=static | FileCheck %s -check-prefixes=CHECK
+
+define void @fn() #0 {
+entry:
+; CHECK-LABEL: fn:
+; CHECK:       ldr [[REG:r[0-9]+]], .LCPI0_0
+; CHECK-NEXT:  blx [[REG]]
+; CHECK:       .LCPI0_0:
+; CHECK-NEXT:  .long   bar
+  call void @bar()
+  ret void
+}
+
+define void @execute_only_fn() #1 {
+; CHECK-LABEL: execute_only_fn:
+; CHECK:       movs    [[REG0:r[0-9]+]], :upper8_15:bar
+; CHECK-NEXT:  lsls    [[REG0]], r0, #8
+; CHECK-NEXT:  adds    [[REG0]], :upper0_7:bar
+; CHECK-NEXT:  lsls    [[REG0]], r0, #8
+; CHECK-NEXT:  adds    [[REG0]], :lower8_15:bar
+; CHECK-NEXT:  lsls    [[REG0]], r0, #8
+; CHECK-NEXT:  adds    [[REG0]], :lower0_7:bar
+; CHECK-NEXT:  blx     [[REG0]]
+; CHECK-NOT:   .LCPI1_0:
+
+entry:
+  call void @bar()
+  ret void
+}
+
+attributes #0 = { noinline optnone "target-features"="+thumb-mode,+long-calls" }
+attributes #1 = { noinline optnone "target-features"="+execute-only,+thumb-mode,+long-calls" }
+
+declare dso_local void @bar()
Index: llvm/test/CodeGen/ARM/large-stack.ll
===================================================================
--- llvm/test/CodeGen/ARM/large-stack.ll
+++ llvm/test/CodeGen/ARM/large-stack.ll
@@ -1,4 +1,5 @@
 ; RUN: llc -mtriple=arm-eabi %s -o /dev/null
+; RUN: llc -mtriple=thumbv6m-eabi -mattr=+execute-only %s -o -
 
 define void @test1() {
     %tmp = alloca [ 64 x i32 ] , align 4
Index: llvm/lib/Target/ARM/ARMISelLowering.cpp
===================================================================
--- llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -2660,13 +2660,9 @@
     // those, the target's already in a register, so we don't need to do
     // anything extra.
     if (isa<GlobalAddressSDNode>(Callee)) {
-      // When generating execute-only code we use movw movt pair.
-      // Currently execute-only is only available for architectures that
-      // support movw movt, so we are safe to assume that.
       if (Subtarget->genExecuteOnly()) {
-        assert(Subtarget->useMovt() &&
-               "long-calls with execute-only requires movt and movw!");
-        ++NumMovwMovt;
+        if (Subtarget->useMovt())
+          ++NumMovwMovt;
         Callee = DAG.getNode(ARMISD::Wrapper, dl, PtrVt,
                              DAG.getTargetGlobalAddress(GVal, dl, PtrVt));
       } else {
@@ -2685,13 +2681,9 @@
     } else if (ExternalSymbolSDNode *S=dyn_cast<ExternalSymbolSDNode>(Callee)) {
       const char *Sym = S->getSymbol();
 
-      // When generating execute-only code we use movw movt pair.
-      // Currently execute-only is only available for architectures that
-      // support movw movt, so we are safe to assume that.
       if (Subtarget->genExecuteOnly()) {
-        assert(Subtarget->useMovt() &&
-               "long-calls with execute-only requires movt and movw!");
-        ++NumMovwMovt;
+        if (Subtarget->useMovt())
+          ++NumMovwMovt;
         Callee = DAG.getNode(ARMISD::Wrapper, dl, PtrVt,
                              DAG.getTargetGlobalAddress(GVal, dl, PtrVt));
       } else {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153782.535305.patch
Type: text/x-patch
Size: 3853 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230628/e3821608/attachment.bin>


More information about the llvm-commits mailing list