[PATCH] D39808: [ARM GlobalISel] Fix call opcode for Thumb

Javed Absar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 8 10:03:41 PST 2017


javed.absar created this revision.
Herald added subscribers: kristof.beyls, igorb, aemerson.

Fixing call opcodes for Thumb.
Review https://reviews.llvm.org/D39592  (Adding legalizer for Thumb) is gated on this patch.

Currently this patch is not complete, and running the test causes assertion failure
 "Assertion `RC && RC->isAllocatable() && "Invalid RC for virtual register", so it seems to missing something. 
But putting it up to get early feedback if the direction is ok.


https://reviews.llvm.org/D39808

Files:
  lib/Target/ARM/ARMCallLowering.cpp
  test/CodeGen/ARM/GlobalISel/arm-call-lowering.ll


Index: test/CodeGen/ARM/GlobalISel/arm-call-lowering.ll
===================================================================
--- test/CodeGen/ARM/GlobalISel/arm-call-lowering.ll
+++ test/CodeGen/ARM/GlobalISel/arm-call-lowering.ll
@@ -1,14 +1,17 @@
-; RUN: llc -mtriple arm-unknown -mattr=-v4t -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,NOV4T
-; RUN: llc -mtriple arm-unknown -mattr=+v4t -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,V4T
-; RUN: llc -mtriple arm-unknown -mattr=+v5t -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,V5T
+; RUN: llc -mtriple arm-unknown -mattr=-v4t -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,DIREC-CALL-ARM,NOV4T
+; RUN: llc -mtriple arm-unknown -mattr=+v4t -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,DIREC-CALL-ARM,V4T
+; RUN: llc -mtriple arm-unknown -mattr=+v5t -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,V5T,DIREC-CALL-ARM,V5T-CALL-ARM
+
+; RUN: llc -mtriple thumb-unknown -mattr=+v5t -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,V5T,DIRECT-CALL-THUMB,V5T-CALL-THUMB
 
 define arm_aapcscc void @test_indirect_call(void() *%fptr) {
 ; CHECK-LABEL: name: test_indirect_call
 ; V5T: %[[FPTR:[0-9]+]]:gpr(p0) = COPY %r0
 ; V4T: %[[FPTR:[0-9]+]]:tgpr(p0) = COPY %r0
 ; NOV4T: %[[FPTR:[0-9]+]]:tgpr(p0) = COPY %r0
 ; CHECK: ADJCALLSTACKDOWN 0, 0, 14, _, implicit-def %sp, implicit %sp
-; V5T: BLX %[[FPTR]](p0), csr_aapcs, implicit-def %lr, implicit %sp
+; V5T-CALL-ARM:    BLX %[[FPTR]](p0), csr_aapcs, implicit-def %lr, implicit %sp
+; V5T-CALL-THUMB: tBLXr %[[FPTR]](p0), csr_aapcs, implicit-def %lr, implicit %sp
 ; V4T: BX_CALL %[[FPTR]](p0), csr_aapcs, implicit-def %lr, implicit %sp
 ; NOV4T: BMOVPCRX_CALL %[[FPTR]](p0), csr_aapcs, implicit-def %lr, implicit %sp
 ; CHECK: ADJCALLSTACKUP 0, 0, 14, _, implicit-def %sp, implicit %sp
@@ -22,7 +25,9 @@
 define arm_aapcscc void @test_direct_call() {
 ; CHECK-LABEL: name: test_direct_call
 ; CHECK: ADJCALLSTACKDOWN 0, 0, 14, _, implicit-def %sp, implicit %sp
-; CHECK: BL @call_target, csr_aapcs, implicit-def %lr, implicit %sp
+; DIRECT-CALL-ARM:    BL @call_target, csr_aapcs, implicit-def %lr, implicit %sp
+; DIRECT-CALL-THUMB: tBL @call_target, csr_aapcs, implicit-def %lr, implicit %sp
+; CALL-THUMB: BL @call_target, csr_aapcs, implicit-def %lr, implicit %sp
 ; CHECK: ADJCALLSTACKUP 0, 0, 14, _, implicit-def %sp, implicit %sp
 entry:
   notail call arm_aapcscc void @call_target()
Index: lib/Target/ARM/ARMCallLowering.cpp
===================================================================
--- lib/Target/ARM/ARMCallLowering.cpp
+++ lib/Target/ARM/ARMCallLowering.cpp
@@ -421,7 +421,7 @@
   auto Subtarget = TLI.getSubtarget();
 
   if (Subtarget->isThumb())
-    return false;
+    return true;
 
   // Quick exit if there aren't any args
   if (F.arg_empty())
@@ -506,10 +506,13 @@
   // registers, but don't insert it yet.
   bool isDirect = !Callee.isReg();
   auto CallOpcode =
-      isDirect ? ARM::BL
-               : STI.hasV5TOps()
-                     ? ARM::BLX
-                     : STI.hasV4TOps() ? ARM::BX_CALL : ARM::BMOVPCRX_CALL;
+      STI.isThumb() ? (isDirect ? ARM::tBL : ARM::tBLXr)
+                    : (isDirect ? ARM::BL
+                                : STI.hasV5TOps()
+                                      ? ARM::BLX
+                                      : STI.hasV4TOps() ? ARM::BX_CALL
+                                                        : ARM::BMOVPCRX_CALL);
+
   auto MIB = MIRBuilder.buildInstrNoInsert(CallOpcode)
                  .add(Callee)
                  .addRegMask(TRI->getCallPreservedMask(MF, CallConv));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39808.122111.patch
Type: text/x-patch
Size: 3986 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171108/d2f03b49/attachment.bin>


More information about the llvm-commits mailing list