Index: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp =================================================================== --- llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -207,7 +207,9 @@ } NewCB->setCallingConv(CB->getCallingConv()); NewCB->setAttributes(PAL); - NewCB->copyMetadata(*CB, {LLVMContext::MD_prof, LLVMContext::MD_dbg}); + NewCB->copyMetadata(*CB, + {LLVMContext::MD_prof, LLVMContext::MD_dbg, + LLVMContext::MD_noalias, LLVMContext::MD_alias_scope}); Args.clear(); @@ -935,7 +937,9 @@ } NewCB->setCallingConv(CB.getCallingConv()); NewCB->setAttributes(NewCallPAL); - NewCB->copyMetadata(CB, {LLVMContext::MD_prof, LLVMContext::MD_dbg}); + NewCB->copyMetadata(CB, + {LLVMContext::MD_prof, LLVMContext::MD_dbg, + LLVMContext::MD_noalias, LLVMContext::MD_alias_scope}); Args.clear(); ArgAttrVec.clear(); Index: llvm/test/Transforms/DeadArgElim/noalias.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/DeadArgElim/noalias.ll @@ -0,0 +1,25 @@ +; RUN: opt -deadargelim -S < %s | FileCheck %s + +; Checks if !noalias metadata is corret in deadargelim. + +define void @caller() #0 { +; CHECK: call void @test_vararg(), !noalias ![[NA:[0-9]]] +; CHECK: call void @test(), !noalias ![[NA]] + call void (i32, ...) @test_vararg(i32 1), !noalias !0 + call void @test(i32 1), !noalias !0 + ret void +} + +define internal void @test_vararg(i32, ...) #1 { + ret void +} + +define internal void @test(i32 %a) #1 { + ret void +} + +; CHECK:![[NA]] = !{![[NA2:[0-9]]]} +; CHECK:![[NA2]] = distinct !{![[NA2]], !"the var"} +!0 = !{!1} +!1 = distinct !{!1, !"the var"} +