-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[IR] Do not set none
for function uwtable
#93387
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
Conversation
This avoids the pitfall where we set the uwtable to none: ``` func.setUWTableKind(llvm::UWTableKind::None) ``` `Attribute::getAsString()` would see an unknown attribute and fail an assertion. In this patch, we assert that we do not see a None uwtable kind. This also skips the check of `UWTableKind::Async`. It is dominated by the check of `UWTableKind::Default`, which has the same enum value (nfc).
@llvm/pr-subscribers-llvm-ir Author: Joshua Cao (caojoshua) ChangesThis avoids the pitfall where we set the uwtable to none:
This also skips the check of Full diff: https://github.com/llvm/llvm-project/pull/93387.diff 3 Files Affected:
diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index cb514cde95b51..be745a0083cb7 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -654,7 +654,8 @@ class LLVM_EXTERNAL_VISIBILITY Function : public GlobalObject,
return getUWTableKind() != UWTableKind::None;
}
void setUWTableKind(UWTableKind K) {
- addFnAttr(Attribute::getWithUWTableKind(getContext(), K));
+ if (K != UWTableKind::None)
+ addFnAttr(Attribute::getWithUWTableKind(getContext(), K));
}
/// True if this function needs an unwind table.
bool needsUnwindTableEntry() const {
diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp
index dc2f5ef15206e..f174dd857def0 100644
--- a/llvm/lib/CodeGen/MachineOutliner.cpp
+++ b/llvm/lib/CodeGen/MachineOutliner.cpp
@@ -717,8 +717,7 @@ MachineFunction *MachineOutliner::createOutlinedFunction(
[](UWTableKind K, const outliner::Candidate &C) {
return std::max(K, C.getMF()->getFunction().getUWTableKind());
});
- if (UW != UWTableKind::None)
- F->setUWTableKind(UW);
+ F->setUWTableKind(UW);
BasicBlock *EntryBB = BasicBlock::Create(C, "entry", F);
IRBuilder<> Builder(EntryBB);
diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp
index c8d6bdd423878..cc3a2ceb6de84 100644
--- a/llvm/lib/IR/Attributes.cpp
+++ b/llvm/lib/IR/Attributes.cpp
@@ -526,13 +526,9 @@ std::string Attribute::getAsString(bool InAttrGrp) const {
if (hasAttribute(Attribute::UWTable)) {
UWTableKind Kind = getUWTableKind();
- if (Kind != UWTableKind::None) {
- return Kind == UWTableKind::Default
- ? "uwtable"
- : ("uwtable(" +
- Twine(Kind == UWTableKind::Sync ? "sync" : "async") + ")")
- .str();
- }
+ assert(Kind != UWTableKind::None &&
+ "uwtable attribute should not be none");
+ return Kind == UWTableKind::Default ? "uwtable" : "uwtable(sync)";
}
if (hasAttribute(Attribute::AllocKind)) {
|
IREE sets a None uwtable kind. With a IREE build with assertions, when printing LLVM IR with
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
llvm/lib/IR/Attributes.cpp
Outdated
Twine(Kind == UWTableKind::Sync ? "sync" : "async") + ")") | ||
.str(); | ||
} | ||
assert(Kind != UWTableKind::None && |
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.
I'm not sure if the Kind
is always expected to not be UWTableKind::None
, but the current code seems to make that assumption. If it is None, we fall through to the llvm_unreachable at the bottom of the function.
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
This avoids the pitfall where we set the uwtable to none:
Attribute::getAsString()
would see an unknown attribute and fail an assertion. In this patch, we assert that we do not see a None uwtable kind.This also skips the check of
UWTableKind::Async
. It is dominated by the check ofUWTableKind::Default
, which has the same enum value (nfc).