Index: llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp =================================================================== --- llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -253,15 +253,29 @@ FSAttr.getValueAsString(); } +static ImmutablePass *createAMDGPUExternalAAWrapperPass() { + return createExternalAAWrapperPass([](Pass &P, Function &, AAResults &AAR) { + if (auto *WrapperPass = P.getAnalysisIfAvailable()) + AAR.addAAResult(WrapperPass->getResult()); + }); +} + void AMDGPUTargetMachine::adjustPassManager(PassManagerBuilder &Builder) { Builder.DivergentTarget = true; bool Internalize = InternalizeSymbols && (getOptLevel() > CodeGenOpt::None) && (getTargetTriple().getArch() == Triple::amdgcn); + bool AMDGPUAA = EnableAMDGPUAliasAnalysis && getOptLevel() > CodeGenOpt::None; + Builder.addExtension( PassManagerBuilder::EP_ModuleOptimizerEarly, - [Internalize](const PassManagerBuilder &, legacy::PassManagerBase &PM) { + [Internalize, AMDGPUAA](const PassManagerBuilder &, + legacy::PassManagerBase &PM) { + if (AMDGPUAA) { + PM.add(createAMDGPUAAWrapperPass()); + PM.add(createAMDGPUExternalAAWrapperPass()); + } PM.add(createAMDGPUUnifyMetadataPass()); if (Internalize) { PM.add(createInternalizePass([=](const GlobalValue &GV) -> bool { @@ -286,6 +300,15 @@ PM.add(createAMDGPUAlwaysInlinePass()); } }); + + Builder.addExtension( + PassManagerBuilder::EP_EarlyAsPossible, + [AMDGPUAA](const PassManagerBuilder &, legacy::PassManagerBase &PM) { + if (AMDGPUAA) { + PM.add(createAMDGPUAAWrapperPass()); + PM.add(createAMDGPUExternalAAWrapperPass()); + } + }); } //===----------------------------------------------------------------------===// Index: llvm/trunk/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll =================================================================== --- llvm/trunk/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll +++ llvm/trunk/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll @@ -0,0 +1,8 @@ +; RUN: opt -mtriple=amdgcn-- -O3 -aa-eval -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s + +; CHECK: NoAlias: i8 addrspace(1)* %p1, i8* %p + +define void @test(i8* %p, i8 addrspace(1)* %p1) { + ret void +} +