[PATCH] D56486: [CodeGen] Ignore return sext/zext attributes of unused results for tail calls

Francis Visoiu Mistrih via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 9 04:35:16 PST 2019


thegameg created this revision.
thegameg added reviewers: rnk, hfinkel, t.p.northover, rob.lougher, greened, wmi.
Herald added a subscriber: javed.absar.

If the caller's return type does not have a zeroext attribute but the callee does a tail call zeroext, we won't consider the tail call during CodeGenPrepare because the attributes don't match.

However, if the result of the tail call has no uses, it makes sense to drop the sext/zext attributes.


https://reviews.llvm.org/D56486

Files:
  lib/CodeGen/Analysis.cpp
  test/CodeGen/AArch64/tail-call-unused-zext.ll


Index: test/CodeGen/AArch64/tail-call-unused-zext.ll
===================================================================
--- /dev/null
+++ test/CodeGen/AArch64/tail-call-unused-zext.ll
@@ -0,0 +1,36 @@
+; RUN: llc -mtriple=arm64--- -stop-after=expand-isel-pseudos -o - %s | FileCheck %s
+
+; Check that we ignore the zeroext attribute on the return type of the tail
+; call, since the return value is unused. This happens during CodeGenPrepare in
+; dupRetToEnableTailCallOpts, which calls attributesPermitTailCall to check if
+; the attributes of the caller and the callee match.
+
+declare zeroext i1 @zcallee()
+define void @zcaller() {
+; CHECK-LABEL: name: zcaller
+entry:
+  br i1 undef, label %calllabel, label %retlabel
+calllabel:
+; CHECK: bb.1.calllabel:
+; CHECK-NOT: BL @zcallee
+; CHECK-NEXT: TCRETURNdi @zcallee
+  %unused_result = tail call zeroext i1 @zcallee()
+  br label %retlabel
+retlabel:
+  ret void
+}
+
+declare signext i1 @scallee()
+define void @scaller() {
+; CHECK-LABEL: name: scaller
+entry:
+  br i1 undef, label %calllabel, label %retlabel
+calllabel:
+; CHECK: bb.1.calllabel:
+; CHECK-NOT: BL @scallee
+; CHECK-NEXT: TCRETURNdi @scallee
+  %unused_result = tail call signext i1 @scallee()
+  br label %retlabel
+retlabel:
+  ret void
+}
Index: lib/CodeGen/Analysis.cpp
===================================================================
--- lib/CodeGen/Analysis.cpp
+++ lib/CodeGen/Analysis.cpp
@@ -546,6 +546,21 @@
     CalleeAttrs.removeAttribute(Attribute::SExt);
   }
 
+  // Drop sext and zext return attributes if the result is not used.
+  // This enables tail calls for code like:
+  //
+  // define void @caller() {
+  // entry:
+  //   %unused_result = tail call zeroext i1 @callee()
+  //   br label %retlabel
+  // retlabel:
+  //   ret void
+  // }
+  if (I->use_empty()) {
+    CalleeAttrs.removeAttribute(Attribute::SExt);
+    CalleeAttrs.removeAttribute(Attribute::ZExt);
+  }
+
   // If they're still different, there's some facet we don't understand
   // (currently only "inreg", but in future who knows). It may be OK but the
   // only safe option is to reject the tail call.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56486.180815.patch
Type: text/x-patch
Size: 2134 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190109/21a17fc7/attachment.bin>


More information about the llvm-commits mailing list