[IR] Lift attribute handling for assume bundles into CallBase
Rather than special-casing assume in BasicAA getModRefBehavior(),
do this one level higher, in the attribute handling of CallBase.
For assumes with operand bundles, the inaccessiblememonly attribute
applies regardless of operand bundles.
GitOrigin-RevId: 93a636d9f6385543a1c77506880a08e10c50792f
diff --git a/include/llvm/IR/InstrTypes.h b/include/llvm/IR/InstrTypes.h
index 5c1d2bd..86e86c4 100644
--- a/include/llvm/IR/InstrTypes.h
+++ b/include/llvm/IR/InstrTypes.h
@@ -2013,12 +2013,7 @@
/// Return true if this operand bundle user has operand bundles that
/// may read from the heap.
- bool hasReadingOperandBundles() const {
- // Implementation note: this is a conservative implementation of operand
- // bundle semantics, where *any* operand bundle forces a callsite to be at
- // least readonly.
- return hasOperandBundles();
- }
+ bool hasReadingOperandBundles() const;
/// Return true if this operand bundle user has operand bundles that
/// may write to the heap.
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp
index 65117d8..acf7bef 100644
--- a/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/lib/Analysis/BasicAliasAnalysis.cpp
@@ -683,11 +683,6 @@
// Can't do better than this.
return FMRB_DoesNotAccessMemory;
- // The assume intrinsic can have operand bundles, but still only accesses
- // inaccessible memory in that case (to maintain control dependencies).
- if (isIntrinsicCall(Call, Intrinsic::assume))
- return FMRB_OnlyAccessesInaccessibleMem;
-
FunctionModRefBehavior Min = FMRB_UnknownModRefBehavior;
// If the callsite knows it only reads memory, don't return worse
diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp
index 6666d74..15567e9 100644
--- a/lib/IR/Instructions.cpp
+++ b/lib/IR/Instructions.cpp
@@ -466,6 +466,13 @@
return CreateNew ? Create(CB, Bundles, InsertPt) : CB;
}
+bool CallBase::hasReadingOperandBundles() const {
+ // Implementation note: this is a conservative implementation of operand
+ // bundle semantics, where *any* non-assume operand bundle forces a callsite
+ // to be at least readonly.
+ return hasOperandBundles() && getIntrinsicID() != Intrinsic::assume;
+}
+
//===----------------------------------------------------------------------===//
// CallInst Implementation
//===----------------------------------------------------------------------===//