mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-15 16:28:48 +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 &&
|
||||
isNonEscapingLocalObject(Object)) {
|
||||
bool PassedAsArg = false;
|
||||
unsigned ArgNo = 0;
|
||||
for (ImmutableCallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end();
|
||||
CI != CE; ++CI, ++ArgNo) {
|
||||
unsigned OperandNo = 0;
|
||||
for (auto CI = CS.data_operands_begin(), CE = CS.data_operands_end();
|
||||
CI != CE; ++CI, ++OperandNo) {
|
||||
// Only look at the no-capture or byval pointer arguments. If this
|
||||
// pointer were passed to arguments that were neither of these, then it
|
||||
// couldn't be no-capture.
|
||||
if (!(*CI)->getType()->isPointerTy() ||
|
||||
(!CS.doesNotCapture(ArgNo) && !CS.isByValArgument(ArgNo)))
|
||||
(!CS.doesNotCapture(OperandNo) && !CS.isByValArgument(OperandNo)))
|
||||
continue;
|
||||
|
||||
// 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