Commit 43012b0b authored by Tanya Lattner's avatar Tanya Lattner
Browse files

Merge from mainline (reg).

Don't constant propagate byval pointers, since they are not really pointers, but
rather structs passed by value.
This fixes PR5038.

llvm-svn: 83200
parent 6f46e545
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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;
+4 −0
Original line number Diff line number Diff line
@@ -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));
  }
+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
}