[hjl@gnu-tools-1 tmp]$ /usr/gcc-4.8.0-x32/bin/gcc -S -O2 -w -S -mx32 /export/gnu/import/git/gcc/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-3.c -maddress-mode=long /export/gnu/import/git/gcc/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-3.c: In function ‘expr_vol_global’: /export/gnu/import/git/gcc/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-3.c:100:1: internal compiler error: in gen_add2_insn, at optabs.c:4694 } ^ 0x81fe4b gen_add2_insn(rtx_def*, rtx_def*) /export/gnu/import/git/gcc/gcc/optabs.c:4694 0x7e2dc7 lra_emit_add(rtx_def*, rtx_def*, rtx_def*) /export/gnu/import/git/gcc/gcc/lra.c:314 0x7eba63 process_addr_reg /export/gnu/import/git/gcc/gcc/lra-constraints.c:1092 0x7ebeed process_address /export/gnu/import/git/gcc/gcc/lra-constraints.c:2290 0x7ef52f curr_insn_transform /export/gnu/import/git/gcc/gcc/lra-constraints.c:2656 0x7f1984 lra_constraints(bool) /export/gnu/import/git/gcc/gcc/lra-constraints.c:3407 0x7e534e lra(_IO_FILE*) /export/gnu/import/git/gcc/gcc/lra.c:2281 0x7ad7f6 do_reload /export/gnu/import/git/gcc/gcc/ira.c:4614 0x7ad7f6 rest_of_handle_reload /export/gnu/import/git/gcc/gcc/ira.c:4720 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. [hjl@gnu-tools-1 tmp]$ Breakpoint 1, lra_emit_add (x=0x7ffff1adb440, y=0x7ffff1ae41b0, z=0x7ffff1ad7b00) at /export/gnu/import/git/gcc/gcc/lra.c:313 313 emit_move_insn (x, z); (gdb) call debug_rtx (x) (reg:SI 206) (gdb) call debug_rtx (y) (ashift:SI (reg:SI 96 [ glob_vol_int.22 ]) (const_int 2 [0x2])) (gdb)
ix86_decompose_address has case ASHIFT: if (index) return 0; index = XEXP (op, 0); tmp = XEXP (op, 1); if (!CONST_INT_P (tmp)) return 0; scale = INTVAL (tmp); if ((unsigned HOST_WIDE_INT) scale > 3) return 0; scale = 1 << scale; break;
Author: vmakarov Date: Mon Oct 29 16:36:57 2012 New Revision: 192949 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=192949 Log: 2012-10-29 Vladimir Makarov <vmakarov@redhat.com> PR middle-end/55116 * rtlanal.c (strip_address_mutation): Add SUBREG case. Modified: trunk/gcc/ChangeLog trunk/gcc/rtlanal.c
Author: hjl Date: Mon Oct 29 23:09:03 2012 New Revision: 192967 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=192967 Log: Add a testcase for PR middle-end/55116 PR middle-end/55116 * gcc.target/i386/pr55116.c: New file. Added: trunk/gcc/testsuite/gcc.target/i386/pr55116.c Modified: trunk/gcc/testsuite/ChangeLog
Fixed.
The fix is incomplete.
Created attachment 28566 [details] A testcase [hjl@gnu-tools-1 prev-gcc]$ ./xgcc -B./ -O2 -mx32 -S /tmp/x.ii /tmp/x.ii: In function ‘rtx_def* simplify_binary_operation(rtx_code, machine_mode, rtx, rtx)’: /tmp/x.ii:2141:3: internal compiler error: in set_address_base, at rtlanal.c:5511 } ^ 0xc08dbb set_address_base /export/gnu/import/git/gcc-misc/gcc/rtlanal.c:5509 0xc096c7 decompose_normal_address /export/gnu/import/git/gcc-misc/gcc/rtlanal.c:5706 0xc097e4 decompose_address(address_info*, rtx_def**, machine_mode, unsigned char, rtx_code) /export/gnu/import/git/gcc-misc/gcc/rtlanal.c:5744 0xc0981b decompose_lea_address(address_info*, rtx_def**) /export/gnu/import/git/gcc-misc/gcc/rtlanal.c:5754 0xb1a515 process_address /export/gnu/import/git/gcc-misc/gcc/lra-constraints.c:2274 0xb1b1d0 curr_insn_transform /export/gnu/import/git/gcc-misc/gcc/lra-constraints.c:2658 0xb1d65d lra_constraints(bool) /export/gnu/import/git/gcc-misc/gcc/lra-constraints.c:3409 0xb0d909 lra(_IO_FILE*) /export/gnu/import/git/gcc-misc/gcc/lra.c:2281 0xac0ed0 do_reload /export/gnu/import/git/gcc-misc/gcc/ira.c:4624 0xac10f4 rest_of_handle_reload /export/gnu/import/git/gcc-misc/gcc/ira.c:4736 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. [hjl@gnu-tools-1 prev-gcc]$
(In reply to comment #6) > Created attachment 28566 [details] > A testcase > > [hjl@gnu-tools-1 prev-gcc]$ ./xgcc -B./ -O2 -mx32 -S /tmp/x.ii You need to add -maddress-mode=long.
[hjl@gnu-tools-1 pr55116]$ cat x.cc typedef struct rtx_def *rtx; enum machine_mode { VOIDmode }; enum rtx_code { CONST_INT, NEG, CONST, PLUS, NOT, MINUS }; enum rtx_class { RTX_CONST_OBJ }; extern const enum rtx_class rtx_class[4]; union rtunion_def { rtx rt_rtx; }; typedef union rtunion_def rtunion; struct block_symbol { }; struct rtx_def { enum rtx_code code: 16; union u { rtunion fld[1]; } u; }; rtx simplify_binary_operation (enum rtx_code code, enum machine_mode mode, rtx op0, rtx op1); struct simplify_plus_minus_op_data { rtx op; short neg; }; rtx simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0, rtx op1) { struct simplify_plus_minus_op_data ops[8]; rtx result, tem; int n_ops = 2, input_ops = 2; int changed, n_constants = 0, canonicalized = 0; int i, j; do { changed = 0; for (i = 0; i < n_ops; i++) { rtx this_op = ops[i].op; int this_neg = ops[i].neg; enum rtx_code this_code = ((enum rtx_code) (this_op)->code); switch (this_code) { case MINUS: if (n_ops == 7) return (rtx) 0; n_ops++; input_ops++; changed = 1; canonicalized |= this_neg; break; } } } while (changed); do { for (i = n_ops - 1; j >= 0; j--) { rtx lhs = ops[j].op, rhs = ops[i].op; int lneg = ops[j].neg, rneg = ops[i].neg; if (lhs != 0 && rhs != 0) { enum rtx_code ncode = PLUS; if (((enum rtx_code) (lhs)->code) == CONST) tem = simplify_binary_operation (ncode, mode, lhs, rhs); if (tem && ! (((enum rtx_code) (tem)->code) == CONST && ((((((tem)->u.fld[0]).rt_rtx))->u.fld[0]).rt_rtx) == lhs && ((((((tem)->u.fld[0]).rt_rtx))->u.fld[1]).rt_rtx) == rhs)) { lneg &= rneg; ops[i].op = tem; ops[i].neg = lneg; ops[j].op = (rtx) 0; changed = 1; canonicalized = 1; } } } for (i = 0, j = 0; j < n_ops; j++) if (ops[j].op) { ops[i] = ops[j]; i++; } } while (changed); } [hjl@gnu-tools-1 pr55116]$ make /export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -O2 -mx32 -maddress-mode=long -S x.cc x.cc: In function ‘rtx_def* simplify_plus_minus(rtx_code, machine_mode, rtx, rtx)’: x.cc:88:1: internal compiler error: in set_address_base, at rtlanal.c:5514 } ^ 0xbaa171 set_address_base /export/gnu/import/git/gcc/gcc/rtlanal.c:5512 0xbaaa07 decompose_normal_address /export/gnu/import/git/gcc/gcc/rtlanal.c:5709 0xbaab13 decompose_address(address_info*, rtx_def**, machine_mode, unsigned char, rtx_code) /export/gnu/import/git/gcc/gcc/rtlanal.c:5747 0xbaab46 decompose_lea_address(address_info*, rtx_def**) /export/gnu/import/git/gcc/gcc/rtlanal.c:5757 0xac1fd8 process_address /export/gnu/import/git/gcc/gcc/lra-constraints.c:2274 0xac2c98 curr_insn_transform /export/gnu/import/git/gcc/gcc/lra-constraints.c:2658 0xac5099 lra_constraints(bool) /export/gnu/import/git/gcc/gcc/lra-constraints.c:3409 0xab587f lra(_IO_FILE*) /export/gnu/import/git/gcc/gcc/lra.c:2281 0xa6b2e6 do_reload /export/gnu/import/git/gcc/gcc/ira.c:4624 0xa6b4f4 rest_of_handle_reload /export/gnu/import/git/gcc/gcc/ira.c:4736 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. make: *** [x.s] Error 1 [hjl@gnu-tools-1 pr55116]$
This helps: diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 43d4cb8..d076ad6 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -5460,6 +5460,7 @@ strip_address_mutations (rtx *loc, enum rtx_code *outer_code) /* (and ... (const_int -X)) is used to align to X bytes. */ loc = &XEXP (*loc, 0); else if (code == SUBREG + && GET_MODE (*loc) == Pmode && !OBJECT_P (SUBREG_REG (*loc)) && subreg_lowpart_p (*loc)) /* (subreg (operator ...) ...) inside and is used for mode
Created attachment 28569 [details] A smaller testcase A small testcase can be compiled cleanly with -Wall.
Author: hjl Date: Tue Oct 30 21:35:35 2012 New Revision: 192996 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=192996 Log: Add another testcase for PR middle-end/55116 * gcc.target/i386/pr55116-2.c: New file. Added: trunk/gcc/testsuite/gcc.target/i386/pr55116-2.c Modified: trunk/gcc/testsuite/ChangeLog
Fixed by: http://gcc.gnu.org/ml/gcc-cvs/2012-10/msg01112.html