forked from OSchip/llvm-project
[OperandBundles] Teach AliasAnalysis about operand bundles
Summary: If a `CallSite` has operand bundles, then do not peek into the called function to get a more precise `ModRef` answer. This is tested using `argmemonly`, `-basicaa` and `-gvn`; but the functionality is not specific to any of these. Depends on D13961 Reviewers: reames, chandlerc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D13962 llvm-svn: 250974
This commit is contained in:
parent
98a341bc0c
commit
769e7e2f71
|
|
@ -759,6 +759,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS) {
|
FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS) {
|
||||||
|
if (!CS.hasOperandBundles())
|
||||||
|
// If CS has operand bundles then aliasing attributes from the function it
|
||||||
|
// calls do not directly apply to the CallSite. This can be made more
|
||||||
|
// precise in the future.
|
||||||
if (const Function *F = CS.getCalledFunction())
|
if (const Function *F = CS.getCalledFunction())
|
||||||
return getBestAAResults().getModRefBehavior(F);
|
return getBestAAResults().getModRefBehavior(F);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1255,8 +1255,8 @@ protected:
|
||||||
/// \brief Is the function attribute S disallowed by some operand bundle on
|
/// \brief Is the function attribute S disallowed by some operand bundle on
|
||||||
/// this operand bundle user?
|
/// this operand bundle user?
|
||||||
bool isFnAttrDisallowedByOpBundle(StringRef S) const {
|
bool isFnAttrDisallowedByOpBundle(StringRef S) const {
|
||||||
// Operand bundles only possibly disallow readnone and readonly attributes.
|
// Operand bundles only possibly disallow readnone, readonly and argmenonly
|
||||||
// All String attributes are fine.
|
// attributes. All String attributes are fine.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1267,6 +1267,9 @@ protected:
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
case Attribute::ArgMemOnly:
|
||||||
|
return hasReadingOperandBundles();
|
||||||
|
|
||||||
case Attribute::ReadNone:
|
case Attribute::ReadNone:
|
||||||
return hasReadingOperandBundles();
|
return hasReadingOperandBundles();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
; RUN: opt -S -basicaa -gvn < %s | FileCheck %s
|
||||||
|
|
||||||
|
declare void @argmemonly_function(i32 *) argmemonly
|
||||||
|
|
||||||
|
define i32 @test0(i32* %P, i32* noalias %P2) {
|
||||||
|
; CHECK-LABEL: @test0(
|
||||||
|
%v1 = load i32, i32* %P
|
||||||
|
; CHECK: %v1 = load i32, i32* %P
|
||||||
|
call void @argmemonly_function(i32* %P2) [ "tag"() ]
|
||||||
|
; CHECK: call void @argmemonly_function(
|
||||||
|
%v2 = load i32, i32* %P
|
||||||
|
; CHECK: %v2 = load i32, i32* %P
|
||||||
|
%diff = sub i32 %v1, %v2
|
||||||
|
; CHECK: %diff = sub i32 %v1, %v2
|
||||||
|
ret i32 %diff
|
||||||
|
; CHECK: ret i32 %diff
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @test1(i32* %P, i32* noalias %P2) {
|
||||||
|
; CHECK-LABEL: @test1(
|
||||||
|
%v1 = load i32, i32* %P
|
||||||
|
call void @argmemonly_function(i32* %P2) argmemonly [ "tag"() ]
|
||||||
|
; CHECK: call void @argmemonly_function(
|
||||||
|
%v2 = load i32, i32* %P
|
||||||
|
%diff = sub i32 %v1, %v2
|
||||||
|
ret i32 %diff
|
||||||
|
; CHECK: ret i32 0
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue