-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Skip negative length while inferring initializes attr #120874
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
@llvm/pr-subscribers-llvm-transforms Author: Haopeng Liu (haopliu) ChangesBail out negative length while inferring initializes attr. Otherwise it causes an assertion error: Full diff: https://github.com/llvm/llvm-project/pull/120874.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
index afb0ea72b269c8..0a83bb1cd60535 100644
--- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
@@ -633,10 +633,13 @@ ArgumentAccessInfo getArgmentAccessInfo(const Instruction *I,
[](Value *Length,
std::optional<int64_t> Offset) -> std::optional<ConstantRange> {
auto *ConstantLength = dyn_cast<ConstantInt>(Length);
- if (ConstantLength && Offset)
+ if (ConstantLength && Offset) {
+ if (ConstantLength->getSExtValue() < 0)
+ return std::nullopt;
return ConstantRange(
APInt(64, *Offset, true),
APInt(64, *Offset + ConstantLength->getSExtValue(), true));
+ }
return std::nullopt;
};
if (auto *SI = dyn_cast<StoreInst>(I)) {
diff --git a/llvm/test/Transforms/FunctionAttrs/initializes.ll b/llvm/test/Transforms/FunctionAttrs/initializes.ll
index 2aa8385fe4ca7b..c607fbeabb5087 100644
--- a/llvm/test/Transforms/FunctionAttrs/initializes.ll
+++ b/llvm/test/Transforms/FunctionAttrs/initializes.ll
@@ -423,6 +423,17 @@ define void @memset_offset(ptr %p) {
ret void
}
+define void @memset_neg(ptr %p) {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
+; CHECK-LABEL: define void @memset_neg(
+; CHECK-SAME: ptr nocapture writeonly [[P:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[P]], i8 2, i64 -1, i1 false)
+; CHECK-NEXT: ret void
+;
+ call void @llvm.memset(ptr %p, i8 2, i64 -1, i1 false)
+ ret void
+}
+
define void @memset_volatile(ptr %p) {
; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: write)
; CHECK-LABEL: define void @memset_volatile(
|
@@ -633,10 +633,13 @@ ArgumentAccessInfo getArgmentAccessInfo(const Instruction *I, | |||
[](Value *Length, | |||
std::optional<int64_t> Offset) -> std::optional<ConstantRange> { | |||
auto *ConstantLength = dyn_cast<ConstantInt>(Length); | |||
if (ConstantLength && Offset) | |||
if (ConstantLength && Offset) { |
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.
Include in the if condition?
if (ConstantLength && Offset) { | |
if (ConstantLength && Offset && ConstantLength->isNonNegative()) { |
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.
Done, 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
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/190/builds/11874 Here is the relevant piece of the build log for the reference
|
Local branch amd-gfx 2432d11 Merged main:dd577c05ad0d into amd-gfx:7e1b5aab3054 Remote branch main 8daba2c Skip negative length while inferring initializes attr (llvm#120874)
Bail out negative length while inferring initializes attr. Otherwise it causes an assertion error:
Attribute 'initializes' does not support unordered ranges