Created attachment 30158 [details] Test case I was experimenting with what values might be acceptable to gcc 4.8 __attribute__((target())) I expected that the compiler would flag the targets that weren't recognized and then quit, but it ran a very long time (5 minutes?). I stopped the job and process cc1plus was still running.
Using built-in specs. COLLECT_GCC=/rdrive/ref/gcc/4.8.0/rhel60/efi2/bin/g++ COLLECT_LTO_WRAPPER=/site/spt/rdrive/ref/gcc/4.8.0/rhel60/efi2/bin/../libexec/gcc/x86_64-unknown-linux-gnu/4.8.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: /rusers/sys_cron/grab_gcc/downloads_rel/4.8.0/gcc-4.8.0/configure --prefix=/rdrive/ref/gcc/4.8.0/rhel60/efi2 --enable-languages=c,c++,objc,fortran --disable-multilib --enable-bootstrap --target=x86_64-unknown-linux-gnu --disable-bootstrap --enable-decimal-float --with-gmp=/rusers/sys_cron/grab_gcc/downloads_rel/lib/efi2 --with-mpfr=/rusers/sys_cron/grab_gcc/downloads_rel/lib/efi2 --with-mpc=/rusers/sys_cron/grab_gcc/downloads_rel/lib/efi2 Thread model: posix gcc version 4.8.0 (GCC)
Works fine with the C compiler, for the C++ compiler we ICE: ... lots of errors ... t.c:18:5: error: No dispatcher found for align-stringops int foo(void) { return 1; } ^ t.c:187:20: internal compiler error: Segmentation fault result = foo(); ^ 0xc647e5 crash_signal /space/rguenther/src/svn/gcc-4_8-branch/gcc/toplev.c:332 0x53f4cb contains_struct_check(tree_node*, tree_node_structure_enum, char const*, int, char const*) /space/rguenther/src/svn/gcc-4_8-branch/gcc/tree.h:3797 0x9b6742 build_fold_addr_expr_loc(unsigned int, tree_node*) /space/rguenther/src/svn/gcc-4_8-branch/gcc/fold-const.c:7693 0xf498fa add_condition_to_bb /space/rguenther/src/svn/gcc-4_8-branch/gcc/config/i386/i386.c:28536 0xf4a6d0 dispatch_function_versions /space/rguenther/src/svn/gcc-4_8-branch/gcc/config/i386/i386.c:28951 0xf4c178 ix86_generate_version_dispatcher_body /space/rguenther/src/svn/gcc-4_8-branch/gcc/config/i386/i386.c:29517 you cannot query for acceptable values by re-annotating the same decl. GCC 4.7 happily says ... t.c:176:5: error: redefinition of 'int foo()' t.c:2:5: error: 'int foo()' previously defined here t.c: At global scope: t.c:178:13: error: attribute(target("avx256-split-unaligned-store")) is unknown t.c: In function 'int foo()': t.c:178:5: error: redefinition of 'int foo()' t.c:2:5: error: 'int foo()' previously defined here t.c: At global scope: t.c:180:13: error: attribute(target("rtm")) is unknown t.c: In function 'int foo()': t.c:180:5: error: redefinition of 'int foo()' t.c:2:5: error: 'int foo()' previously defined here and does not ICE. Google folks - please have a look.
Patch proposed to fix this problem, This happens when a subset of versions are invalid because of unrecognized target string name or if a dispatcher for that is not available. When constructing the versions array to dispatch, the index used here is wrong. PR 57362 * config/i386/i386.c (dispatch_function_versions): Use actual_versions to index into function_version_info. Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 199219) +++ config/i386/i386.c (working copy) @@ -29061,10 +29061,10 @@ dispatch_function_versions (tree dispatch_decl, if (predicate_chain == NULL_TREE) continue; + function_version_info [actual_versions].version_decl = version_decl; + function_version_info [actual_versions].predicate_chain = predicate_chain; + function_version_info [actual_versions].dispatch_priority = priority; actual_versions++; - function_version_info [ix - 1].version_decl = version_decl; - function_version_info [ix - 1].predicate_chain = predicate_chain; - function_version_info [ix - 1].dispatch_priority = priority; } /* Sort the versions according to descending order of dispatch priority. The
GCC 4.8.1 has been released.
Trunk rev. 200913 fixes this problem.
What about 4_8-branch? The bug is marked as 4.8 Regression. Either way, I suppose the bug should be closed, right?
Fixed for 4.8.2 (r201388) and 4.9.