]> granicus.if.org Git - llvm/commitdiff
[XRay][AArch64] More staging for tail call support in XRay on AArch64 - in LLVM
authorSerge Rogatch <srogatch@accesssoftek.com>
Wed, 25 Jan 2017 20:21:49 +0000 (20:21 +0000)
committerSerge Rogatch <srogatch@accesssoftek.com>
Wed, 25 Jan 2017 20:21:49 +0000 (20:21 +0000)
Summary:
This patch prepares more for tail call support in XRay. Until the logging part supports tail calls, this is just staging, so it seems LLVM part is mostly ready with this patch.
Related: https://reviews.llvm.org/D28948 (compiler-rt)

Reviewers: dberris, rengolin

Reviewed By: dberris

Subscribers: llvm-commits, iid_iunknown, aemerson

Differential Revision: https://reviews.llvm.org/D28947

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293080 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64InstrInfo.cpp
lib/Target/AArch64/AArch64InstrInfo.h
test/CodeGen/AArch64/xray-tail-call-sled.ll [new file with mode: 0644]

index 9cdb8e961b4bdb62600b988955e792d8d024c3bc..8e3b7658c3ec8c09e9f886e116de47af4b1f9ad1 100644 (file)
@@ -1627,6 +1627,17 @@ bool AArch64InstrInfo::isUnscaledLdSt(MachineInstr &MI) const {
   return isUnscaledLdSt(MI.getOpcode());
 }
 
+bool AArch64InstrInfo::isTailCall(const MachineInstr &Inst) const
+{
+  switch (Inst.getOpcode()) {
+  case AArch64::TCRETURNdi:
+  case AArch64::TCRETURNri:
+    return true;
+  default:
+    return false;
+  }
+}
+
 // Is this a candidate for ld/st merging or pairing?  For example, we don't
 // touch volatiles or load/stores that have a hint to avoid pair formation.
 bool AArch64InstrInfo::isCandidateToMergeOrPair(MachineInstr &MI) const {
index 5037866925d39bea3fcedffcdb60628e627e5d50..8d9e8e3da1c5e864db5af718b18f88daf599e290 100644 (file)
@@ -87,6 +87,8 @@ public:
   /// Return true if this is an unscaled load/store.
   bool isUnscaledLdSt(MachineInstr &MI) const;
 
+  bool isTailCall(const MachineInstr &Inst) const override;
+
   static bool isPairableLdStInst(const MachineInstr &MI) {
     switch (MI.getOpcode()) {
     default:
diff --git a/test/CodeGen/AArch64/xray-tail-call-sled.ll b/test/CodeGen/AArch64/xray-tail-call-sled.ll
new file mode 100644 (file)
index 0000000..6ada3ce
--- /dev/null
@@ -0,0 +1,69 @@
+; RUN: llc -filetype=asm -o - -mtriple=aarch64-linux-gnu < %s | FileCheck %s\r
+\r
+define i32 @callee() nounwind noinline uwtable "function-instrument"="xray-always" {\r
+; CHECK:       .p2align        2\r
+; CHECK-LABEL: .Lxray_sled_0:\r
+; CHECK-NEXT:  b       #32\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-LABEL: .Ltmp0:\r
+  ret i32 0\r
+; CHECK-NEXT:  mov     w0, wzr\r
+; CHECK-NEXT:  .p2align        2\r
+; CHECK-LABEL: .Lxray_sled_1:\r
+; CHECK-NEXT:  b       #32\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-LABEL: .Ltmp1:\r
+; CHECK-NEXT:  ret\r
+}\r
+; CHECK:       .p2align 4\r
+; CHECK-NEXT:  .xword .Lxray_synthetic_0\r
+; CHECK-NEXT:  .section xray_instr_map,{{.*}}\r
+; CHECK-LABEL: Lxray_synthetic_0:\r
+; CHECK:       .xword .Lxray_sled_0\r
+; CHECK:       .xword .Lxray_sled_1\r
+\r
+define i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" {\r
+; CHECK:       .p2align        2\r
+; CHECK-LABEL: .Lxray_sled_2:\r
+; CHECK-NEXT:  b       #32\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-LABEL: .Ltmp2:\r
+; CHECK:       .p2align        2\r
+; CHECK-LABEL: .Lxray_sled_3:\r
+; CHECK-NEXT:  b       #32\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-NEXT:  nop\r
+; CHECK-LABEL: .Ltmp3:\r
+  %retval = tail call i32 @callee()\r
+; CHECK:       b       callee\r
+  ret i32 %retval\r
+}\r
+; CHECK:       .p2align 4\r
+; CHECK-NEXT:  .xword .Lxray_synthetic_1\r
+; CHECK-NEXT:  .section xray_instr_map,{{.*}}\r
+; CHECK-LABEL: Lxray_synthetic_1:\r
+; CHECK:       .xword .Lxray_sled_2\r
+; CHECK:       .xword .Lxray_sled_3\r