-
Notifications
You must be signed in to change notification settings - Fork 11k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Analysis] Attribute Range should not prevent tail call optimization #91122
Conversation
jsji
commented
May 5, 2024
- Remove Range attr when comparing for tailcall
- Add test for testcall with range
@llvm/pr-subscribers-llvm-selectiondag @llvm/pr-subscribers-backend-x86 Author: Jinsong Ji (jsji) Changes
Full diff: https://github.com/llvm/llvm-project/pull/91122.diff 2 Files Affected:
diff --git a/llvm/lib/CodeGen/Analysis.cpp b/llvm/lib/CodeGen/Analysis.cpp
index af7643d93591f7..e693cdbd0ccc1c 100644
--- a/llvm/lib/CodeGen/Analysis.cpp
+++ b/llvm/lib/CodeGen/Analysis.cpp
@@ -593,9 +593,10 @@ bool llvm::attributesPermitTailCall(const Function *F, const Instruction *I,
// Following attributes are completely benign as far as calling convention
// goes, they shouldn't affect whether the call is a tail call.
- for (const auto &Attr : {Attribute::Alignment, Attribute::Dereferenceable,
- Attribute::DereferenceableOrNull, Attribute::NoAlias,
- Attribute::NonNull, Attribute::NoUndef}) {
+ for (const auto &Attr :
+ {Attribute::Alignment, Attribute::Dereferenceable,
+ Attribute::DereferenceableOrNull, Attribute::NoAlias,
+ Attribute::NonNull, Attribute::NoUndef, Attribute::Range}) {
CallerAttrs.removeAttribute(Attr);
CalleeAttrs.removeAttribute(Attr);
}
diff --git a/llvm/test/CodeGen/X86/tailcall-range.ll b/llvm/test/CodeGen/X86/tailcall-range.ll
new file mode 100644
index 00000000000000..1f7712d2494326
--- /dev/null
+++ b/llvm/test/CodeGen/X86/tailcall-range.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
+; RUN: opt -passes=ipsccp -S -mtriple=x86_64-linux < %s | llc -mtriple=x86_64-linux | FileCheck %s
+
+define i32 @foo(ptr %this, ...) {
+; CHECK-LABEL: foo:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movzbl 0, %eax
+; CHECK-NEXT: retq
+entry:
+ %call = load volatile i1, ptr null, align 1
+ %spec.select = zext i1 %call to i32
+ ret i32 %spec.select
+}
+
+define i32 @bar(ptr %this, ...) {
+; CHECK-LABEL: bar:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: xorl %edi, %edi
+; CHECK-NEXT: jmp foo@PLT # TAILCALL
+entry:
+ %4 = musttail call i32 (ptr, ...) @foo(ptr null, ...)
+ ret i32 %4
+}
|
Do not know so mush about how this works (new contributor to llvm) but it sounds on the comment as this attribute also shall be in the list. There also is the same list of attributes in
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code change looks fine, but the test should not be calling ipsccp. Adjust the input IR to have the range attribute instead.
shall there not be a update of some test for the TargetLowering.cpp update now that it is added to this PR |
This reverts commit 6b78e63.
Remove the changes from this PR first for now. Will follow up with another PR once I get the test for it ready. |
I'd rather not have these two pieces of code go out of sync. |
I am not able to come up with a reasonable testcase for now.
Let me know if you can find some testcase that shows problems . |
I'm surprised we allow musttail on intrinsic calls, which aren't really supposed to have ABI |
This reverts commit 7d3aa09.
#91347 Opened to track follow up. Thanks. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm with some test nits
hmm did a comment on the thread of comments on the test but had not noticed that it was marked as resolved do not know if it was removed
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
; CHECK-NEXT: movzbl 0, %eax | ||
; CHECK-NEXT: retq | ||
entry: | ||
%call = load volatile i1, ptr null, align 1 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
%call = load volatile i1, ptr null, align 1 | |
%call = load volatile i1, ptr %this, align 1 |
was possibly intended here? Best to avoid "obviously UB" inputs when we can...