-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Local: Handle noalias_addrspace in combineMetadata #103938
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
Local: Handle noalias_addrspace in combineMetadata #103938
Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. |
@llvm/pr-subscribers-llvm-transforms @llvm/pr-subscribers-llvm-ir Author: Matt Arsenault (arsenm) ChangesThis should act like range. Full diff: https://github.com/llvm/llvm-project/pull/103938.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index efb02fdec56d7..bbc8933d387e1 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -3319,6 +3319,10 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
if (DoesKMove)
K->setMetadata(Kind, MDNode::getMergedProfMetadata(KMD, JMD, K, J));
break;
+ case LLVMContext::MD_noalias_addrspace:
+ if (DoesKMove)
+ K->setMetadata(Kind, MDNode::getMostGenericRange(JMD, KMD));
+ break;
}
}
// Set !invariant.group from J if J has it. If both instructions have it
@@ -3360,7 +3364,8 @@ void llvm::combineMetadataForCSE(Instruction *K, const Instruction *J,
LLVMContext::MD_prof,
LLVMContext::MD_nontemporal,
LLVMContext::MD_noundef,
- LLVMContext::MD_mmra};
+ LLVMContext::MD_mmra,
+ LLVMContext::MD_noalias_addrspace};
combineMetadata(K, J, KnownIDs, KDominatesJ);
}
diff --git a/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll b/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll
index 18aa5c9e044a9..f8985e78c0ca5 100644
--- a/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll
+++ b/llvm/test/Transforms/SimplifyCFG/hoist-with-metadata.ll
@@ -319,7 +319,7 @@ out:
define void @hoist_noalias_addrspace_both(i1 %c, ptr %p, i64 %val) {
; CHECK-LABEL: @hoist_noalias_addrspace_both(
; CHECK-NEXT: if:
-; CHECK-NEXT: [[T:%.*]] = atomicrmw add ptr [[P:%.*]], i64 [[VAL:%.*]] seq_cst, align 8
+; CHECK-NEXT: [[T:%.*]] = atomicrmw add ptr [[P:%.*]], i64 [[VAL:%.*]] seq_cst, align 8, !noalias.addrspace [[META7:![0-9]+]]
; CHECK-NEXT: ret void
;
if:
@@ -361,7 +361,7 @@ out:
define void @hoist_noalias_addrspace_switch(i64 %i, ptr %p, i64 %val) {
; CHECK-LABEL: @hoist_noalias_addrspace_switch(
; CHECK-NEXT: out:
-; CHECK-NEXT: [[T:%.*]] = atomicrmw add ptr [[P:%.*]], i64 [[VAL:%.*]] seq_cst, align 8
+; CHECK-NEXT: [[T:%.*]] = atomicrmw add ptr [[P:%.*]], i64 [[VAL:%.*]] seq_cst, align 8, !noalias.addrspace [[META8:![0-9]+]]
; CHECK-NEXT: ret void
;
switch i64 %i, label %bb0 [
@@ -398,4 +398,6 @@ out:
; CHECK: [[RNG4]] = !{i32 0, i32 10}
; CHECK: [[META5]] = !{i64 4}
; CHECK: [[META6]] = !{float 2.500000e+00}
+; CHECK: [[META7]] = !{i32 5, i32 6}
+; CHECK: [[META8]] = !{i32 4, i32 8}
;.
|
16dd092
to
c3dbcec
Compare
79e1e8b
to
f84e99b
Compare
1952386
to
0f1cd91
Compare
f84e99b
to
29b8b60
Compare
0f1cd91
to
3ff8ae8
Compare
fb9d412
to
d7b148d
Compare
d7b148d
to
4a6df18
Compare
It looks like this still includes the LangRef/IR changes. |
3ff8ae8
to
f7b9b84
Compare
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.
Should we also have a test for how it combines non-contiguous ranges?
f7b9b84
to
4e5e920
Compare
// Handle common cases. | ||
if (empty() || Ranges.back().getUpper().slt(NewRange.getLower())) { | ||
Ranges.push_back(NewRange); | ||
return; | ||
} | ||
|
||
assert(getBitWidth() == NewRange.getBitWidth()); |
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 notice we're moving a bunch of asserts around. I think that needs explaining in the commit message. However, it feels like something's wrong.
Does insert
perhaps need to be updated so that it inserts 32-bit values depending on the range type? Would that fix us having mixed 64- and 32-bit range values? Is that even possible right now - what if we want to insert into an empty range? We can't know what bitwidth to use.
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.
An empty range has no bitwidth. I don't think it's worth adding an explicit field for bit width to give a bit width to the empty range
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 agree that an empty range has no bitwidth. I missed that ConstantRangeList
only deals with the insertion of pre-existing ConstantRange
s. I think it's okay on balance to require users to only insert/union/intersect ConstantRange
s of matching bitwidths.
I think a good way of expressing this would be to keep the asserts where they are but have getBitWidth
return a value that represents "none" or "empty" which always compares ==
true with bitwidths of other non-empty ranges. That's probably not worth the effort, though. What you have now is probably okay.
@@ -60,7 +60,7 @@ class [[nodiscard]] ConstantRangeList { | |||
bool empty() const { return Ranges.empty(); } | |||
|
|||
/// Get the bit width of this ConstantRangeList. | |||
uint32_t getBitWidth() const { return 64; } | |||
uint32_t getBitWidth() const { return Ranges.front().getBitWidth(); } |
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.
If the range list is empty, should this continue to return 64? Otherwise at best it'll assert and at worst it'll return garbage. An optional
could also represent this scenario.
If there's a new precondition that you can only call getBitWidth
on a non-empty range, that should be documented.
// Handle common cases. | ||
if (empty() || Ranges.back().getUpper().slt(NewRange.getLower())) { | ||
Ranges.push_back(NewRange); | ||
return; | ||
} | ||
|
||
assert(getBitWidth() == NewRange.getBitWidth()); |
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 agree that an empty range has no bitwidth. I missed that ConstantRangeList
only deals with the insertion of pre-existing ConstantRange
s. I think it's okay on balance to require users to only insert/union/intersect ConstantRange
s of matching bitwidths.
I think a good way of expressing this would be to keep the asserts where they are but have getBitWidth
return a value that represents "none" or "empty" which always compares ==
true with bitwidths of other non-empty ranges. That's probably not worth the effort, though. What you have now is probably okay.
8c22443
to
7424990
Compare
7424990
to
05170f0
Compare
05170f0
to
3918491
Compare
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.
ping
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 should act like range.
Previously ConstantRangeList assumed a 64-bit range. Now query from the actual entries. This also means that the empty range has no bitwidth, so move asserts to avoid checking the bitwidth of empty ranges.