Bug 55116 - [4.8 Regression] LRA failed to decompose ASHIFT
Summary: [4.8 Regression] LRA failed to decompose ASHIFT
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.8.0
: P3 normal
Target Milestone: 4.8.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-10-29 12:33 UTC by H.J. Lu
Modified: 2012-10-30 22:08 UTC (History)
2 users (show)

See Also:
Host:
Target: x32-*-*
Build:
Known to work:
Known to fail:
Last reconfirmed: 2012-10-30 00:00:00


Attachments
A testcase (31.36 KB, application/octet-stream)
2012-10-30 00:08 UTC, H.J. Lu
Details
A smaller testcase (679 bytes, text/plain)
2012-10-30 01:52 UTC, H.J. Lu
Details

Note You need to log in before you can comment on or make changes to this bug.
Description H.J. Lu 2012-10-29 12:33:42 UTC
[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)
Comment 1 H.J. Lu 2012-10-29 13:14:03 UTC
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;
Comment 2 Vladimir Makarov 2012-10-29 16:37:08 UTC
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
Comment 3 hjl@gcc.gnu.org 2012-10-29 23:09:08 UTC
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
Comment 4 H.J. Lu 2012-10-29 23:11:11 UTC
Fixed.
Comment 5 H.J. Lu 2012-10-30 00:06:20 UTC
The fix is incomplete.
Comment 6 H.J. Lu 2012-10-30 00:08:28 UTC
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]$
Comment 7 H.J. Lu 2012-10-30 00:10:55 UTC
(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.
Comment 8 H.J. Lu 2012-10-30 01:24:09 UTC
[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]$
Comment 9 H.J. Lu 2012-10-30 01:36:26 UTC
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
Comment 10 H.J. Lu 2012-10-30 01:52:04 UTC
Created attachment 28569 [details]
A smaller testcase

A small testcase can be compiled cleanly with -Wall.
Comment 11 hjl@gcc.gnu.org 2012-10-30 21:35:42 UTC
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
Comment 12 H.J. Lu 2012-10-30 22:08:22 UTC
Fixed by:

http://gcc.gnu.org/ml/gcc-cvs/2012-10/msg01112.html