From: Bob Wilson Date: Mon, 15 Aug 2011 23:22:56 +0000 (+0000) Subject: Avoid evaluating Neon macro arguments more than once by disabling type checks. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=e17a14e2debc9f900f8507e32496a77d55253753;p=oota-llvm.git Avoid evaluating Neon macro arguments more than once by disabling type checks. It turns out that the use of "__extension__" in these macros was disabling the expected "incompatible pointer" warnings, so these type checks were not doing anything anyway. They introduced a serious bug by evaluating some macro arguments twice, which is a big problem for arguments with side effects. I'll have to find another way to get the right type checking. Radar 9947657. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137680 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index ef9774438f7..1e96da7f64d 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -485,6 +485,7 @@ static bool UseMacro(const std::string &proto) { /// defined as a macro should be accessed directly instead of being first /// assigned to a local temporary. static bool MacroArgUsedDirectly(const std::string &proto, unsigned i) { + // True for constant ints (i), pointers (p) and const pointers (c). return (proto[i] == 'i' || proto[i] == 'p' || proto[i] == 'c'); } @@ -525,24 +526,16 @@ static std::string GenMacroLocals(const std::string &proto, StringRef typestr) { for (unsigned i = 1, e = proto.size(); i != e; ++i, ++arg) { // Do not create a temporary for an immediate argument. // That would defeat the whole point of using a macro! - if (proto[i] == 'i') + // FIXME: For other (non-immediate) arguments that are used directly, a + // local temporary (or some other method) is still needed to get the + // correct type checking, even if that temporary is not used for anything. + // This is omitted for now because it turns out the the use of + // "__extension__" in the macro disables any warnings from the pointer + // assignment. + if (MacroArgUsedDirectly(proto, i)) continue; generatedLocal = true; - // For other (non-immediate) arguments that are used directly, a local - // temporary is still needed to get the correct type checking, even though - // that temporary is not used for anything. - if (MacroArgUsedDirectly(proto, i)) { - s += TypeString(proto[i], typestr) + " __"; - s.push_back(arg); - s += "_ = (__"; - s.push_back(arg); - s += "); (void)__"; - s.push_back(arg); - s += "_; "; - continue; - } - s += TypeString(proto[i], typestr) + " __"; s.push_back(arg); s += " = (";