Index: llvm/trunk/lib/Transforms/IPO/Attributor.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/Attributor.cpp +++ llvm/trunk/lib/Transforms/IPO/Attributor.cpp @@ -1762,11 +1762,18 @@ 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(); } Index: llvm/trunk/test/Transforms/FunctionAttrs/internal-noalias.ll =================================================================== --- llvm/trunk/test/Transforms/FunctionAttrs/internal-noalias.ll +++ llvm/trunk/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 @@ ; 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: Index: llvm/trunk/test/Transforms/FunctionAttrs/noalias_returned.ll =================================================================== --- llvm/trunk/test/Transforms/FunctionAttrs/noalias_returned.ll +++ llvm/trunk/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 @@ ; 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 @@ ; 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 @@ 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 @@ %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 }