forked from OSchip/llvm-project
[Attributor] Use Alias Analysis in noalias callsite argument deduction
Summary: This patch adds a check of alias analysis in `noalias` callsite argument deduction. Reviewers: jdoerfert, sstefan1 Reviewed By: jdoerfert Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67604 llvm-svn: 372075
This commit is contained in:
parent
b6c05b2a52
commit
30d86f1858
|
@ -1762,11 +1762,18 @@ struct AANoAliasCallSiteArgument final : AANoAliasImpl {
|
|||
if (!ArgOp->getType()->isPointerTy())
|
||||
continue;
|
||||
|
||||
// TODO: Use AliasAnalysis
|
||||
// AAResults& AAR = ..;
|
||||
// if(AAR.isNoAlias(&getAssociatedValue(), ArgOp))
|
||||
// return indicatePessimitisicFixpoint();
|
||||
if (const Function *F = getAnchorScope()) {
|
||||
if (AAResults *AAR = A.getInfoCache().getAAResultsForFunction(*F)) {
|
||||
LLVM_DEBUG(dbgs()
|
||||
<< "[Attributor][NoAliasCSArg] Check alias between "
|
||||
"callsite arguments "
|
||||
<< AAR->isNoAlias(&getAssociatedValue(), ArgOp) << " "
|
||||
<< getAssociatedValue() << " " << *ArgOp << "\n");
|
||||
|
||||
if (AAR->isNoAlias(&getAssociatedValue(), ArgOp))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return indicatePessimisticFixpoint();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt -S -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=6 < %s | FileCheck %s
|
||||
; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=6 < %s | FileCheck %s
|
||||
|
||||
define dso_local i32 @visible(i32* noalias %A, i32* noalias %B) #0 {
|
||||
entry:
|
||||
|
@ -10,7 +10,7 @@ entry:
|
|||
|
||||
; FIXME: Should be something like this.
|
||||
; define internal i32 @noalias_args(i32* nocapture readonly %A, i32* noalias nocapture readonly %B)
|
||||
; CHECK: define internal i32 @noalias_args(i32* nocapture %A, i32* nocapture %B)
|
||||
; CHECK: define internal i32 @noalias_args(i32* nocapture %A, i32* noalias nocapture %B)
|
||||
|
||||
define internal i32 @noalias_args(i32* %A, i32* %B) #0 {
|
||||
entry:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt -S -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=5 < %s | FileCheck %s
|
||||
; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=5 < %s | FileCheck %s
|
||||
|
||||
; TEST 1 - negative.
|
||||
|
||||
|
@ -203,7 +203,7 @@ define void @test12_1() {
|
|||
; CHECK-NEXT: [[B:%.*]] = tail call noalias i8* @malloc(i64 4)
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* noalias [[B]])
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* noalias nocapture [[B]])
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* noalias [[B]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
|
@ -220,7 +220,7 @@ define void @test12_2(){
|
|||
; CHECK-LABEL: @test12_2(
|
||||
; CHECK-NEXT: [[A:%.*]] = tail call noalias i8* @malloc(i64 4)
|
||||
; FIXME: This should be @use_nocapture(i8* noalias [[A]])
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* [[A]])
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* nocapture [[A]])
|
||||
; FIXME: This should be @use_nocapture(i8* noalias [[A]])
|
||||
; CHECK-NEXT: tail call void @use_nocapture(i8* [[A]])
|
||||
; CHECK-NEXT: tail call void @use(i8* [[A]])
|
||||
|
@ -239,7 +239,7 @@ declare void @two_args(i8* nocapture , i8* nocapture)
|
|||
define void @test12_3(){
|
||||
; CHECK-LABEL: @test12_3(
|
||||
%A = tail call noalias i8* @malloc(i64 4)
|
||||
; CHECK: tail call void @two_args(i8* %A, i8* %A)
|
||||
; CHECK: tail call void @two_args(i8* nocapture %A, i8* %A)
|
||||
tail call void @two_args(i8* %A, i8* %A)
|
||||
ret void
|
||||
}
|
||||
|
@ -252,18 +252,17 @@ define void @test12_4(){
|
|||
%A_1 = getelementptr i8, i8* %A, i64 1
|
||||
%B_0 = getelementptr i8, i8* %B, i64 0
|
||||
|
||||
; FIXME: This should be @two_args(i8* noalias %A, i8* noalias %B)
|
||||
; CHECK: tail call void @two_args(i8* %A, i8* %B)
|
||||
; CHECK: tail call void @two_args(i8* noalias %A, i8* noalias %B)
|
||||
tail call void @two_args(i8* %A, i8* %B)
|
||||
|
||||
; CHECK: tail call void @two_args(i8* %A, i8* %A_0)
|
||||
; CHECK: tail call void @two_args(i8* %A, i8* nocapture %A_0)
|
||||
tail call void @two_args(i8* %A, i8* %A_0)
|
||||
|
||||
; CHECK: tail call void @two_args(i8* %A, i8* %A_1)
|
||||
tail call void @two_args(i8* %A, i8* %A_1)
|
||||
|
||||
; FIXME: This should be @two_args(i8* noalias %A_0, i8* noalias %B_0)
|
||||
; CHECK: tail call void @two_args(i8* %A_0, i8* %B_0)
|
||||
; CHECK: tail call void @two_args(i8* %A_0, i8* nocapture %B_0)
|
||||
tail call void @two_args(i8* %A_0, i8* %B_0)
|
||||
ret void
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue