Loading llvm/lib/Transforms/IPO/IPConstantPropagation.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -130,7 +130,8 @@ bool IPCP::PropagateConstantsIntoArguments(Function &F) { Function::arg_iterator AI = F.arg_begin(); for (unsigned i = 0, e = ArgumentConstants.size(); i != e; ++i, ++AI) { // Do we have a constant argument? if (ArgumentConstants[i].second || AI->use_empty()) if (ArgumentConstants[i].second || AI->use_empty() || (AI->hasByValAttr() && isa<PointerType>(AI->getType()))) continue; Value *V = ArgumentConstants[i].first; Loading llvm/lib/Transforms/Scalar/SCCP.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -1263,6 +1263,10 @@ CallOverdefined: for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); AI != E; ++AI, ++CAI) { LatticeVal &IV = ValueState[AI]; if (AI->hasByValAttr() && isa<PointerType>(AI->getType())) { IV.markOverdefined(); continue; } if (!IV.isOverdefined()) mergeInValue(IV, AI, getValueState(*CAI)); } Loading llvm/test/Transforms/IPConstantProp/2009-09-24-byval-ptr.ll 0 → 100644 +24 −0 Original line number Diff line number Diff line ; RUN: llvm-as <%s | opt -ipsccp | llvm-dis | FileCheck %s ; Don't constant-propagate byval pointers, since they are not pointers! ; PR5038 %struct.MYstr = type { i8, i32 } @mystr = internal global %struct.MYstr zeroinitializer ; <%struct.MYstr*> [#uses=3] define internal void @vfu1(%struct.MYstr* byval align 4 %u) nounwind { entry: %0 = getelementptr %struct.MYstr* %u, i32 0, i32 1 ; <i32*> [#uses=1] store i32 99, i32* %0, align 4 ; CHECK: %struct.MYstr* %u %1 = getelementptr %struct.MYstr* %u, i32 0, i32 0 ; <i8*> [#uses=1] store i8 97, i8* %1, align 4 ; CHECK: %struct.MYstr* %u br label %return return: ; preds = %entry ret void } define void @unions() nounwind { entry: call void @vfu1(%struct.MYstr* byval align 4 @mystr) nounwind ret void } Loading
llvm/lib/Transforms/IPO/IPConstantPropagation.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -130,7 +130,8 @@ bool IPCP::PropagateConstantsIntoArguments(Function &F) { Function::arg_iterator AI = F.arg_begin(); for (unsigned i = 0, e = ArgumentConstants.size(); i != e; ++i, ++AI) { // Do we have a constant argument? if (ArgumentConstants[i].second || AI->use_empty()) if (ArgumentConstants[i].second || AI->use_empty() || (AI->hasByValAttr() && isa<PointerType>(AI->getType()))) continue; Value *V = ArgumentConstants[i].first; Loading
llvm/lib/Transforms/Scalar/SCCP.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -1263,6 +1263,10 @@ CallOverdefined: for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); AI != E; ++AI, ++CAI) { LatticeVal &IV = ValueState[AI]; if (AI->hasByValAttr() && isa<PointerType>(AI->getType())) { IV.markOverdefined(); continue; } if (!IV.isOverdefined()) mergeInValue(IV, AI, getValueState(*CAI)); } Loading
llvm/test/Transforms/IPConstantProp/2009-09-24-byval-ptr.ll 0 → 100644 +24 −0 Original line number Diff line number Diff line ; RUN: llvm-as <%s | opt -ipsccp | llvm-dis | FileCheck %s ; Don't constant-propagate byval pointers, since they are not pointers! ; PR5038 %struct.MYstr = type { i8, i32 } @mystr = internal global %struct.MYstr zeroinitializer ; <%struct.MYstr*> [#uses=3] define internal void @vfu1(%struct.MYstr* byval align 4 %u) nounwind { entry: %0 = getelementptr %struct.MYstr* %u, i32 0, i32 1 ; <i32*> [#uses=1] store i32 99, i32* %0, align 4 ; CHECK: %struct.MYstr* %u %1 = getelementptr %struct.MYstr* %u, i32 0, i32 0 ; <i8*> [#uses=1] store i8 97, i8* %1, align 4 ; CHECK: %struct.MYstr* %u br label %return return: ; preds = %entry ret void } define void @unions() nounwind { entry: call void @vfu1(%struct.MYstr* byval align 4 @mystr) nounwind ret void }