mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-19 02:08:06 +00:00
[BasicAliasAnalysis] Take into account operand bundles in the getModRefInfo function
Differential Revision: http://reviews.llvm.org/D16225 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257991 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f351177eec
commit
a08c9225d2
@ -717,14 +717,14 @@ ModRefInfo BasicAAResult::getModRefInfo(ImmutableCallSite CS,
|
|||||||
if (!isa<Constant>(Object) && CS.getInstruction() != Object &&
|
if (!isa<Constant>(Object) && CS.getInstruction() != Object &&
|
||||||
isNonEscapingLocalObject(Object)) {
|
isNonEscapingLocalObject(Object)) {
|
||||||
bool PassedAsArg = false;
|
bool PassedAsArg = false;
|
||||||
unsigned ArgNo = 0;
|
unsigned OperandNo = 0;
|
||||||
for (ImmutableCallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end();
|
for (auto CI = CS.data_operands_begin(), CE = CS.data_operands_end();
|
||||||
CI != CE; ++CI, ++ArgNo) {
|
CI != CE; ++CI, ++OperandNo) {
|
||||||
// Only look at the no-capture or byval pointer arguments. If this
|
// Only look at the no-capture or byval pointer arguments. If this
|
||||||
// pointer were passed to arguments that were neither of these, then it
|
// pointer were passed to arguments that were neither of these, then it
|
||||||
// couldn't be no-capture.
|
// couldn't be no-capture.
|
||||||
if (!(*CI)->getType()->isPointerTy() ||
|
if (!(*CI)->getType()->isPointerTy() ||
|
||||||
(!CS.doesNotCapture(ArgNo) && !CS.isByValArgument(ArgNo)))
|
(!CS.doesNotCapture(OperandNo) && !CS.isByValArgument(OperandNo)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// If this is a no-capture pointer argument, see if we can tell that it
|
// If this is a no-capture pointer argument, see if we can tell that it
|
||||||
|
31
test/Transforms/DeadStoreElimination/operand-bundles.ll
Normal file
31
test/Transforms/DeadStoreElimination/operand-bundles.ll
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
; RUN: opt < %s -basicaa -dse -S | FileCheck %s
|
||||||
|
|
||||||
|
declare noalias i8* @malloc(i64) "malloc-like"
|
||||||
|
|
||||||
|
declare void @foo()
|
||||||
|
declare void @bar(i8*)
|
||||||
|
|
||||||
|
define void @test() {
|
||||||
|
%obj = call i8* @malloc(i64 8)
|
||||||
|
store i8 0, i8* %obj
|
||||||
|
; don't remove store. %obj should be treated like it will be read by the @foo.
|
||||||
|
; CHECK: store i8 0, i8* %obj
|
||||||
|
call void @foo() ["deopt" (i8* %obj)]
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
define void @test1() {
|
||||||
|
%obj = call i8* @malloc(i64 8)
|
||||||
|
store i8 0, i8* %obj
|
||||||
|
; CHECK: store i8 0, i8* %obj
|
||||||
|
call void @bar(i8* nocapture %obj)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
define void @test2() {
|
||||||
|
%obj = call i8* @malloc(i64 8)
|
||||||
|
store i8 0, i8* %obj
|
||||||
|
; CHECK-NOT: store i8 0, i8* %obj
|
||||||
|
call void @foo()
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user