[Bug target/57756] New: Function target attribute is retaining state of previously seen function

tmsriram at google dot com gcc-bugzilla@gcc.gnu.org
Sat Jun 29 01:58:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57756

            Bug ID: 57756
           Summary: Function target attribute is retaining  state of
                    previously seen function
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tmsriram at google dot com

Simple repro:

foo.cc:
-------
__attribute__((always_inline,target("sse4.2")))
inline int callee ()
{
  return 0;
}

__attribute__((target("sse4.1")))
inline int caller ()
{
  return callee();
}

int main ()
{
  return caller();
}

$ g++ foo.cc

callee is inlined into caller.  This is incorrect, the callee's target ISA is
higher and GCC must complain.  Digging deeper, the x_ix86_isa_flags of both
caller and callee are the same.  The problem is in ix86_set_current_function in
i386.c where 

     else if (new_tree)
    {
      cl_target_option_restore (&global_options,
                    TREE_TARGET_OPTION (new_tree));
      target_reinit ();
    }

where the restore, restores the previous decl's target options to global.

It is not clear to me how to fix this.

Replace the target attributes in the above source with the equivalent #pragma
GCC push_options .... and the program will fail as expected.



More information about the Gcc-bugs mailing list