From f6a402010b246346f99e8353824c134ead6037d3 Mon Sep 17 00:00:00 2001 From: Hideto Ueno Date: Tue, 17 Sep 2019 06:53:27 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372075 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/Attributor.cpp | 17 ++++++++++++----- .../FunctionAttrs/internal-noalias.ll | 4 ++-- .../FunctionAttrs/noalias_returned.ll | 15 +++++++-------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/Transforms/IPO/Attributor.cpp b/lib/Transforms/IPO/Attributor.cpp index 90b0772a869..a6f8472e85d 100644 --- a/lib/Transforms/IPO/Attributor.cpp +++ b/lib/Transforms/IPO/Attributor.cpp @@ -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(); } diff --git a/test/Transforms/FunctionAttrs/internal-noalias.ll b/test/Transforms/FunctionAttrs/internal-noalias.ll index 7449c301783..edc3fe07dae 100644 --- a/test/Transforms/FunctionAttrs/internal-noalias.ll +++ b/test/Transforms/FunctionAttrs/internal-noalias.ll @@ -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: diff --git a/test/Transforms/FunctionAttrs/noalias_returned.ll b/test/Transforms/FunctionAttrs/noalias_returned.ll index 2f71d1e5791..410d1d6cbc3 100644 --- a/test/Transforms/FunctionAttrs/noalias_returned.ll +++ b/test/Transforms/FunctionAttrs/noalias_returned.ll @@ -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 } -- 2.40.0