Author: baldrick Date: Sun Jan 27 12:11:13 2008 New Revision: 46415 URL: http://llvm.org/viewvc/llvm-project?rev=46415&view=rev Log: Do not mark a function readnone or readonly if it has a byval parameter.
Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=46415&r1=46414&r2=46415&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Sun Jan 27 12:11:13 2008 @@ -1219,14 +1219,19 @@ DeclArgs = TREE_CHAIN(DeclArgs); } - // If we see a byval argument and if the function is 'readnone' we have to - // demote the function to being 'readonly' instead. Not doing so would allow - // optimizers to delete stores into the argument that is passed into the - // function. - if (HasByVal && Attrs[0].index == 0 && - (Attrs[0].attrs & ParamAttr::ReadNone)) { - Attrs[0].attrs &= ~ParamAttr::ReadNone; - Attrs[0].attrs |= ParamAttr::ReadOnly; + // If there is a byval argument then it is not safe to mark the function + // 'readnone' or 'readonly': gcc permits a 'const' or 'pure' function to + // write to struct arguments passed by value, but in LLVM this becomes a + // write through the byval pointer argument, which LLVM does not allow for + // readonly/readnone functions. + if (HasByVal && Attrs[0].index == 0) { + uint16_t &RAttrs = Attrs[0].attrs; + RAttrs &= ~(ParamAttr::ReadNone | ParamAttr::ReadOnly); + if (RAttrs == ParamAttr::None) { + for (unsigned i = 1, e = Attrs.size(); i < e ; ++i) + Attrs[i-1] = Attrs[i]; + Attrs.pop_back(); + } } // If the argument list ends with a void type node, it isn't vararg. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits