summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/Metadata.cpp
diff options
context:
space:
mode:
authorBjorn Steinbrink <bsteinbr@gmail.com>2015-02-08 17:07:14 +0000
committerBjorn Steinbrink <bsteinbr@gmail.com>2015-02-08 17:07:14 +0000
commit5ec75227717620e4716dc858178166767926573e (patch)
treec43c49eac870d6f60c58651d5faa4ef021e3238a /llvm/lib/IR/Metadata.cpp
parentb928d4c2fcd9ce276230f586751ecbaa9823d1b7 (diff)
downloadbcm5719-llvm-5ec75227717620e4716dc858178166767926573e.tar.gz
bcm5719-llvm-5ec75227717620e4716dc858178166767926573e.zip
Correctly combine alias.scope metadata by a union instead of intersecting
Summary: The alias.scope metadata represents sets of things an instruction might alias with. When generically combining the metadata from two instructions the result must be the union of the original sets, because the new instruction might alias with anything any of the original instructions aliased with. Reviewers: hfinkel Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D7490 llvm-svn: 228525
Diffstat (limited to 'llvm/lib/IR/Metadata.cpp')
-rw-r--r--llvm/lib/IR/Metadata.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp
index 6227c209352..55dc96b10bf 100644
--- a/llvm/lib/IR/Metadata.cpp
+++ b/llvm/lib/IR/Metadata.cpp
@@ -782,6 +782,28 @@ MDNode *MDNode::intersect(MDNode *A, MDNode *B) {
return getOrSelfReference(A->getContext(), MDs);
}
+MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {
+ if (!A || !B)
+ return nullptr;
+
+ SmallVector<Metadata *, 4> MDs(B->op_begin(), B->op_end());
+ for (unsigned i = 0, ie = A->getNumOperands(); i != ie; ++i) {
+ Metadata *MD = A->getOperand(i);
+ bool insert = true;
+ for (unsigned j = 0, je = B->getNumOperands(); j != je; ++j)
+ if (MD == B->getOperand(j)) {
+ insert = false;
+ break;
+ }
+ if (insert)
+ MDs.push_back(MD);
+ }
+
+ // FIXME: This preserves long-standing behaviour, but is it really the right
+ // behaviour? Or was that an unintended side-effect of node uniquing?
+ return getOrSelfReference(A->getContext(), MDs);
+}
+
MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) {
if (!A || !B)
return nullptr;
OpenPOWER on IntegriCloud