Index: lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp +++ lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp @@ -35,8 +35,20 @@ char AMDGPUAlwaysInline::ID = 0; bool AMDGPUAlwaysInline::runOnModule(Module &M) { + std::vector AliasesToRemove; std::vector FuncsToClone; + for (GlobalAlias &A : M.aliases()) { + if (Function* F = dyn_cast(A.getAliasee())) { + A.replaceAllUsesWith(F); + AliasesToRemove.push_back(&A); + } + } + + for (GlobalAlias* A : AliasesToRemove) { + A->eraseFromParent(); + } + for (Function &F : M) { if (!F.hasLocalLinkage() && !F.isDeclaration() && !F.use_empty() && !F.hasFnAttribute(Attribute::NoInline)) Index: test/CodeGen/AMDGPU/inline-calls.ll =================================================================== --- test/CodeGen/AMDGPU/inline-calls.ll +++ test/CodeGen/AMDGPU/inline-calls.ll @@ -10,6 +10,7 @@ } ; CHECK: {{^}}kernel: +; CHECK-NOT: call define void @kernel(i32 addrspace(1)* %out) { entry: %tmp0 = call i32 @func(i32 1) @@ -18,8 +19,32 @@ } ; CHECK: {{^}}kernel2: +; CHECK-NOT: call define void @kernel2(i32 addrspace(1)* %out) { entry: call void @kernel(i32 addrspace(1)* %out) ret void } + +; CHECK-NOT: func_alias +@func_alias = alias i32 (i32), i32 (i32)* @func + +; CHECK: {{^}}kernel3: +; CHECK-NOT: call +define void @kernel3(i32 addrspace(1)* %out) { +entry: + %tmp0 = call i32 @func_alias(i32 1) + store i32 %tmp0, i32 addrspace(1)* %out + ret void +} + +; CHECK-NOT: kernel_alias +@kernel_alias = alias void (i32 addrspace(1)*), void (i32 addrspace(1)*)* @kernel + +; CHECK: {{^}}kernel4: +; CHECK-NOT: call +define void @kernel4(i32 addrspace(1)* %out) { +entry: + call void @kernel_alias(i32 addrspace(1)* %out) + ret void +}