Bug 57362 - [4.8/4.9 Regression] unsupported __attribute__((target())) values appear to cause loop and/or pathological behavior
Summary: [4.8/4.9 Regression] unsupported __attribute__((target())) values appear to c...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.8.1
: P3 normal
Target Milestone: 4.8.2
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-on-invalid-code
Depends on:
Blocks:
 
Reported: 2013-05-21 19:16 UTC by mib.bugzilla
Modified: 2013-07-31 20:12 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work: 4.7.3
Known to fail:
Last reconfirmed: 2013-05-22 00:00:00


Attachments
Test case (699 bytes, text/plain)
2013-05-21 19:16 UTC, mib.bugzilla
Details

Note You need to log in before you can comment on or make changes to this bug.
Description mib.bugzilla 2013-05-21 19:16:40 UTC
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.
Comment 1 mib.bugzilla 2013-05-21 19:18:31 UTC
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)
Comment 2 Richard Biener 2013-05-22 08:17:44 UTC
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.
Comment 3 Sriraman Tallam 2013-05-22 23:46:00 UTC
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
Comment 4 Jakub Jelinek 2013-05-31 10:58:11 UTC
GCC 4.8.1 has been released.
Comment 5 Sriraman Tallam 2013-07-11 23:07:20 UTC
Trunk rev. 200913 fixes this problem.
Comment 6 Paolo Carlini 2013-07-11 23:31:00 UTC
What about 4_8-branch? The bug is marked as 4.8 Regression. Either way, I suppose the bug should be closed, right?
Comment 7 Jason Merrill 2013-07-31 20:12:37 UTC
Fixed for 4.8.2 (r201388) and 4.9.