public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
@ 2011-03-03 13:05 zsojka at seznam dot cz
  2011-03-03 13:07 ` [Bug rtl-optimization/47968] " zsojka at seznam dot cz
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: zsojka at seznam dot cz @ 2011-03-03 13:05 UTC (permalink / raw)
  To: gcc-bugs

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

           Summary: ICE: in gen_lowpart_general, at rtlhooks.c:51 when
                    converting vector of double to vector of float
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: zsojka@seznam.cz
              Host: x86_64-pc-linux-gnu
            Target: x86_64-pc-linux-gnu


Created attachment 23527
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=23527
reduced testcase

Compiler output:
$ gcc -O testcase.c
testcase.c: In function 'foo':
testcase.c:7:3: internal compiler error: in gen_lowpart_general, at
rtlhooks.c:51
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.


(gdb) bt
#0  fancy_abort (file=0x115e428 "/mnt/svn/gcc-trunk/gcc/rtlhooks.c", line=51,
function=0x115e490 "gen_lowpart_general")
    at /mnt/svn/gcc-trunk/gcc/diagnostic.c:892
#1  0x0000000000874ccb in gen_lowpart_general (mode=SFmode, x=<value optimized
out>) at /mnt/svn/gcc-trunk/gcc/rtlhooks.c:51
#2  0x000000000069bb04 in extract_bit_field (str_rtx=<value optimized out>,
bitsize=<value optimized out>, bitnum=<value optimized out>, 
    unsignedp=<value optimized out>, packedp=<value optimized out>,
target=<value optimized out>, mode=SFmode, tmode=SFmode)
    at /mnt/svn/gcc-trunk/gcc/expmed.c:1684
#3  0x00000000006a9562 in expand_expr_real_1 (exp=0x7ffff5ba5280, target=<value
optimized out>, tmode=SFmode, modifier=EXPAND_NORMAL, alt_rtl=0x0)
    at /mnt/svn/gcc-trunk/gcc/expr.c:9211
#4  0x00000000006af03d in expand_expr_real (exp=0x7ffff5ba5280, target=<value
optimized out>, tmode=<value optimized out>, 
    modifier=<value optimized out>, alt_rtl=<value optimized out>) at
/mnt/svn/gcc-trunk/gcc/expr.c:7206
#5  expand_expr_real (exp=0x7ffff5ba5280, target=<value optimized out>,
tmode=<value optimized out>, modifier=<value optimized out>, 
    alt_rtl=<value optimized out>) at /mnt/svn/gcc-trunk/gcc/expr.c:7174
#6  0x00000000006ab820 in expand_expr (exp=0x7ffff5ba41b8,
target=0x7ffff5b948e0, tmode=SFmode, modifier=EXPAND_NORMAL, alt_rtl=0x0)
    at /mnt/svn/gcc-trunk/gcc/expr.h:422
#7  expand_expr_real_1 (exp=0x7ffff5ba41b8, target=0x7ffff5b948e0,
tmode=SFmode, modifier=EXPAND_NORMAL, alt_rtl=0x0)
    at /mnt/svn/gcc-trunk/gcc/expr.c:8807
#8  0x00000000008d065b in expand_expr (retval=0x7ffff7ff91f8) at
/mnt/svn/gcc-trunk/gcc/expr.h:422
#9  expand_return (retval=0x7ffff7ff91f8) at /mnt/svn/gcc-trunk/gcc/stmt.c:1812
#10 0x00000000005e0e8b in expand_gimple_stmt_1 (stmt=0x7ffff5b89510) at
/mnt/svn/gcc-trunk/gcc/cfgexpand.c:1951
#11 expand_gimple_stmt (stmt=0x7ffff5b89510) at
/mnt/svn/gcc-trunk/gcc/cfgexpand.c:2080
#12 0x00000000005e2f29 in expand_gimple_basic_block (bb=0x7ffff5b851a0) at
/mnt/svn/gcc-trunk/gcc/cfgexpand.c:3609
#13 0x00000000005e81d9 in gimple_expand_cfg () at
/mnt/svn/gcc-trunk/gcc/cfgexpand.c:4092
#14 0x00000000007f7056 in execute_one_pass (pass=0x1638ac0) at
/mnt/svn/gcc-trunk/gcc/passes.c:1556
#15 0x00000000007f7355 in execute_pass_list (pass=0x1638ac0) at
/mnt/svn/gcc-trunk/gcc/passes.c:1611
#16 0x000000000093a2b6 in tree_rest_of_compilation (fndecl=0x7ffff5b86f00) at
/mnt/svn/gcc-trunk/gcc/tree-optimize.c:422
#17 0x0000000000b02312 in cgraph_expand_function (node=0x7ffff5ba6000) at
/mnt/svn/gcc-trunk/gcc/cgraphunit.c:1576
#18 0x0000000000b04a5a in cgraph_expand_all_functions () at
/mnt/svn/gcc-trunk/gcc/cgraphunit.c:1635
#19 cgraph_optimize () at /mnt/svn/gcc-trunk/gcc/cgraphunit.c:1899
#20 0x0000000000b04fda in cgraph_finalize_compilation_unit () at
/mnt/svn/gcc-trunk/gcc/cgraphunit.c:1096
#21 0x00000000005097bc in c_write_global_declarations () at
/mnt/svn/gcc-trunk/gcc/c-decl.c:9872
#22 0x00000000008e3248 in compile_file (argc=13, argv=0x7fffffffdbd8) at
/mnt/svn/gcc-trunk/gcc/toplev.c:591
#23 do_compile (argc=13, argv=0x7fffffffdbd8) at
/mnt/svn/gcc-trunk/gcc/toplev.c:1900
#24 toplev_main (argc=13, argv=0x7fffffffdbd8) at
/mnt/svn/gcc-trunk/gcc/toplev.c:1963
#25 0x00007ffff6446bbd in __libc_start_main () from /lib/libc.so.6
#26 0x00000000004f036d in _start ()

Tested revisions:
r170622 - crash
4.5 r170013 - crash
4.4 r170013 - crash
4.4.5 (release checking) - crash
4.3.5 (release checking) - OK

Maybe it's a regression from 4.3.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug rtl-optimization/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
@ 2011-03-03 13:07 ` zsojka at seznam dot cz
  2011-03-03 13:15 ` [Bug middle-end/47968] " rguenth at gcc dot gnu.org
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: zsojka at seznam dot cz @ 2011-03-03 13:07 UTC (permalink / raw)
  To: gcc-bugs

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

Zdenek Sojka <zsojka at seznam dot cz> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  Attachment #23527|0                           |1
        is obsolete|                            |

--- Comment #1 from Zdenek Sojka <zsojka at seznam dot cz> 2011-03-03 13:06:51 UTC ---
Created attachment 23528
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=23528
reduced testcase

http://gcc.gnu.org/bugzilla/attachment.cgi?id=23527&action=edit is for PR47967


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
  2011-03-03 13:07 ` [Bug rtl-optimization/47968] " zsojka at seznam dot cz
@ 2011-03-03 13:15 ` rguenth at gcc dot gnu.org
  2011-03-03 13:30 ` rguenth at gcc dot gnu.org
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-03-03 13:15 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2011.03.03 13:15:19
          Component|rtl-optimization            |middle-end
     Ever Confirmed|0                           |1

--- Comment #2 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-03-03 13:15:19 UTC ---
Confirmed.

#1  0x000000000098a3b8 in gen_lowpart_general (mode=SFmode, x=0x7ffff5b36900)
    at /space/rguenther/src/svn/trunk/gcc/rtlhooks.c:51
51          gcc_assert (result != 0);
(gdb) p x
$1 = (rtx) 0x7ffff5b36900
(gdb) call debug_rtx (x)
(reg:DF 64)

Happens during expanding of BIT_FIELD_REF <f4.0_2, 32, 0> from

;; Function foo (foo)

foo (double2 d2)
{
  float D.2687;
  vector(4) float f4.0;

  # BLOCK 2 freq:10000
  # PRED: ENTRY [100.0%]  (fallthru,exec)
  f4.0_2 = VIEW_CONVERT_EXPR<vector(4) float>(d2_1(D));
  D.2687_3 = BIT_FIELD_REF <f4.0_2, 32, 0>;
  return D.2687_3;


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
  2011-03-03 13:07 ` [Bug rtl-optimization/47968] " zsojka at seznam dot cz
  2011-03-03 13:15 ` [Bug middle-end/47968] " rguenth at gcc dot gnu.org
@ 2011-03-03 13:30 ` rguenth at gcc dot gnu.org
  2011-03-03 13:35 ` rguenth at gcc dot gnu.org
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-03-03 13:30 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
                 CC|                            |pinskia at gcc dot gnu.org
         AssignedTo|unassigned at gcc dot       |rguenth at gcc dot gnu.org
                   |gnu.org                     |

--- Comment #3 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-03-03 13:30:28 UTC ---
We call extract_bit_field SFmode [0, 32] on (subreg:V4SF (reg/v:V2DF 62 [ d2 ])
0) which then ends up using the vec_extract optabs, but those are obviously
not designed for a mode-changing extraction (and we stripped the subreg
before using it - whether that's a good idea is another question).

We try to find a "better" vector mode but end up with V2DF again because
we want to preserve NUNITS of the inner reg (for whatever reason again).

We can obviously guard the vec_extract optab use by GET_MODE_INNER (GET_MODE
(op0)) == tmode, but we can as well try to find a "better" mode that also
is going to work ...

Testing a patch, CCing Andrew who added this code.

Patch:

Index: gcc/expmed.c
===================================================================
--- gcc/expmed.c        (revision 170649)
+++ gcc/expmed.c        (working copy)
@@ -1205,7 +1205,6 @@ extract_bit_field_1 (rtx str_rtx, unsign
       && GET_MODE_INNER (GET_MODE (op0)) != tmode)
     {
       enum machine_mode new_mode;
-      int nunits = GET_MODE_NUNITS (GET_MODE (op0));

       if (GET_MODE_CLASS (tmode) == MODE_FLOAT)
        new_mode = MIN_MODE_VECTOR_FLOAT;
@@ -1221,8 +1220,7 @@ extract_bit_field_1 (rtx str_rtx, unsign
        new_mode = MIN_MODE_VECTOR_INT;

       for (; new_mode != VOIDmode ; new_mode = GET_MODE_WIDER_MODE (new_mode))
-       if (GET_MODE_NUNITS (new_mode) == nunits
-           && GET_MODE_SIZE (new_mode) == GET_MODE_SIZE (GET_MODE (op0))
+       if (GET_MODE_SIZE (new_mode) == GET_MODE_SIZE (GET_MODE (op0))
            && targetm.vector_mode_supported_p (new_mode))
          break;
       if (new_mode != VOIDmode)


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
                   ` (2 preceding siblings ...)
  2011-03-03 13:30 ` rguenth at gcc dot gnu.org
@ 2011-03-03 13:35 ` rguenth at gcc dot gnu.org
  2011-03-03 13:56 ` zsojka at seznam dot cz
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-03-03 13:35 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-03-03 13:34:50 UTC ---
Btw, I wonder since when (and why) we accept

  float4 f4 = (float4) d2;

as valid code.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
                   ` (3 preceding siblings ...)
  2011-03-03 13:35 ` rguenth at gcc dot gnu.org
@ 2011-03-03 13:56 ` zsojka at seznam dot cz
  2011-03-03 15:20 ` zsojka at seznam dot cz
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: zsojka at seznam dot cz @ 2011-03-03 13:56 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Zdenek Sojka <zsojka at seznam dot cz> 2011-03-03 13:56:06 UTC ---
The testcase is accepted (compiles fine) by 3.3.6, 3.4.6, 4.0.4, 4.1.2, 4.2.4,
4.3.5.

The are files in the testsuite that use that style, at least
gcc.c-torture/compile/vector-[123].c

Changing the code to
  float4 f4 = *(float4 *) &d2;
doesn't prevent the crash


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
                   ` (4 preceding siblings ...)
  2011-03-03 13:56 ` zsojka at seznam dot cz
@ 2011-03-03 15:20 ` zsojka at seznam dot cz
  2011-03-03 17:47 ` pinskia at gcc dot gnu.org
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: zsojka at seznam dot cz @ 2011-03-03 15:20 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from Zdenek Sojka <zsojka at seznam dot cz> 2011-03-03 15:19:55 UTC ---
Created attachment 23532
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=23532
testcase using long instead of double

This one fails the same way.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
                   ` (5 preceding siblings ...)
  2011-03-03 15:20 ` zsojka at seznam dot cz
@ 2011-03-03 17:47 ` pinskia at gcc dot gnu.org
  2011-03-03 17:50 ` pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2011-03-03 17:47 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> 2011-03-03 17:47:42 UTC ---
(In reply to comment #3)
> Patch:
> 
> Index: gcc/expmed.c

IIRC this is the patch which I had applied to the PS3 toolchain while at Sony. 
I don't have access to the sources any more so I cannot check.  But it looks
correct.

Thanks,
Andrew Pinski


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
                   ` (6 preceding siblings ...)
  2011-03-03 17:47 ` pinskia at gcc dot gnu.org
@ 2011-03-03 17:50 ` pinskia at gcc dot gnu.org
  2011-03-04 10:32 ` rguenth at gcc dot gnu.org
  2011-03-04 10:32 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2011-03-03 17:50 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> 2011-03-03 17:50:38 UTC ---
(In reply to comment #4)
> Btw, I wonder since when (and why) we accept
> 
>   float4 f4 = (float4) d2;
> 
> as valid code.

Because it is documented as being valid code that is you can cast between the
same size of the vectors (not to mention integers that are the same size as the
vector also).  It acts like a bitwise conversion rather than a promotion.  This
is needed for compatibility with the Altivec and SPU specs.

-- Andrew


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
                   ` (7 preceding siblings ...)
  2011-03-03 17:50 ` pinskia at gcc dot gnu.org
@ 2011-03-04 10:32 ` rguenth at gcc dot gnu.org
  2011-03-04 10:32 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-03-04 10:32 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #9 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-03-04 10:31:38 UTC ---
Author: rguenth
Date: Fri Mar  4 10:31:33 2011
New Revision: 170673

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=170673
Log:
2011-03-04  Richard Guenther  <rguenther@suse.de>

    PR middle-end/47968
    * expmed.c (extract_bit_field_1): Prefer vector modes that
    vec_extract patterns can handle.

    * gcc.dg/torture/pr47968.c: New testcase.

Added:
    trunk/gcc/testsuite/gcc.dg/torture/pr47968.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/expmed.c
    trunk/gcc/testsuite/ChangeLog


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug middle-end/47968] ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float
  2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
                   ` (8 preceding siblings ...)
  2011-03-04 10:32 ` rguenth at gcc dot gnu.org
@ 2011-03-04 10:32 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-03-04 10:32 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED
   Target Milestone|---                         |4.6.0

--- Comment #10 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-03-04 10:32:45 UTC ---
Fixed.


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2011-03-04 10:32 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-03 13:05 [Bug rtl-optimization/47968] New: ICE: in gen_lowpart_general, at rtlhooks.c:51 when converting vector of double to vector of float zsojka at seznam dot cz
2011-03-03 13:07 ` [Bug rtl-optimization/47968] " zsojka at seznam dot cz
2011-03-03 13:15 ` [Bug middle-end/47968] " rguenth at gcc dot gnu.org
2011-03-03 13:30 ` rguenth at gcc dot gnu.org
2011-03-03 13:35 ` rguenth at gcc dot gnu.org
2011-03-03 13:56 ` zsojka at seznam dot cz
2011-03-03 15:20 ` zsojka at seznam dot cz
2011-03-03 17:47 ` pinskia at gcc dot gnu.org
2011-03-03 17:50 ` pinskia at gcc dot gnu.org
2011-03-04 10:32 ` rguenth at gcc dot gnu.org
2011-03-04 10:32 ` rguenth at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).