Fix subreg in memory addresses regression

Jan Hubicka jh@suse.cz
Thu Jan 22 20:42:00 GMT 2004


Hi,
this fix the original problem that made us to apply the subreg allowing patch.
There is instruction (plus:SI (subreg:SI rsp) (const_int)) that gets converted
by postreload clobber ellimination into (plus:SI (esp) (const_int) and when we
are producing the lea back, we forget subreg in a way.

Bootstrapped/regtested x86-64-linux, OK for mainline/branch?
Honza

2004-01-22  Jan Hubicka  <jh@suse.cz>
	* i386.md (lea_general*, addsi to lea splitters):
	Be sure that we don't produce subregs of hardregs.

Index: config/i386/i386.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.md,v
retrieving revision 1.505
diff -c -3 -p -r1.505 i386.md
*** config/i386/i386.md	22 Jan 2004 03:32:20 -0000	1.505
--- config/i386/i386.md	22 Jan 2004 16:59:19 -0000
***************
*** 5129,5134 ****
--- 5129,5140 ----
    operands[1] = gen_lowpart (Pmode, operands[1]);
    operands[2] = gen_lowpart (Pmode, operands[2]);
    operands[3] = gen_lowpart (Pmode, operands[3]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
+   if (GET_CODE (operands[2]) == SUBREG)
+     alter_subreg (&operands[2]);
+   if (GET_CODE (operands[3]) == SUBREG)
+     alter_subreg (&operands[3]);
    pat = gen_rtx_PLUS (Pmode, gen_rtx_PLUS (Pmode, operands[1], operands[2]),
    		      operands[3]);
    if (Pmode != SImode)
***************
*** 5156,5161 ****
--- 5162,5173 ----
    operands[1] = gen_lowpart (Pmode, operands[1]);
    operands[2] = gen_lowpart (Pmode, operands[2]);
    operands[3] = gen_lowpart (Pmode, operands[3]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
+   if (GET_CODE (operands[2]) == SUBREG)
+     alter_subreg (&operands[2]);
+   if (GET_CODE (operands[3]) == SUBREG)
+     alter_subreg (&operands[3]);
  }
    [(set_attr "type" "lea")
     (set_attr "mode" "SI")])
***************
*** 5179,5184 ****
--- 5191,5200 ----
    operands[0] = gen_lowpart (SImode, operands[0]);
    operands[1] = gen_lowpart (Pmode, operands[1]);
    operands[3] = gen_lowpart (Pmode, operands[3]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
+   if (GET_CODE (operands[3]) == SUBREG)
+     alter_subreg (&operands[3]);
    pat = gen_rtx_PLUS (Pmode, gen_rtx_MULT (Pmode, operands[1], operands[2]),
    		      operands[3]);
    if (Pmode != SImode)
***************
*** 5205,5210 ****
--- 5221,5230 ----
  {
    operands[1] = gen_lowpart (Pmode, operands[1]);
    operands[3] = gen_lowpart (Pmode, operands[3]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
+   if (GET_CODE (operands[3]) == SUBREG)
+     alter_subreg (&operands[3]);
  }
    [(set_attr "type" "lea")
     (set_attr "mode" "SI")])
***************
*** 5229,5234 ****
--- 5249,5260 ----
    operands[1] = gen_lowpart (Pmode, operands[1]);
    operands[3] = gen_lowpart (Pmode, operands[3]);
    operands[4] = gen_lowpart (Pmode, operands[4]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
+   if (GET_CODE (operands[3]) == SUBREG)
+     alter_subreg (&operands[3]);
+   if (GET_CODE (operands[4]) == SUBREG)
+     alter_subreg (&operands[4]);
    pat = gen_rtx_PLUS (Pmode,
    		      gen_rtx_PLUS (Pmode, gen_rtx_MULT (Pmode, operands[1],
  		      					 operands[2]),
***************
*** 5261,5266 ****
--- 5287,5298 ----
    operands[1] = gen_lowpart (Pmode, operands[1]);
    operands[3] = gen_lowpart (Pmode, operands[3]);
    operands[4] = gen_lowpart (Pmode, operands[4]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
+   if (GET_CODE (operands[3]) == SUBREG)
+     alter_subreg (&operands[3]);
+   if (GET_CODE (operands[4]) == SUBREG)
+     alter_subreg (&operands[4]);
  }
    [(set_attr "type" "lea")
     (set_attr "mode" "SI")])
***************
*** 5603,5608 ****
--- 5635,5644 ----
      {
        operands[1] = gen_lowpart (Pmode, operands[1]);
        operands[2] = gen_lowpart (Pmode, operands[2]);
+       if (GET_CODE (operands[1]) == SUBREG)
+ 	alter_subreg (&operands[1]);
+       if (GET_CODE (operands[2]) == SUBREG)
+ 	alter_subreg (&operands[2]);
      }
    operands[0] = gen_lowpart (SImode, operands[0]);
    pat = gen_rtx_PLUS (Pmode, operands[1], operands[2]);
***************
*** 5680,5685 ****
--- 5716,5725 ----
  {
    operands[1] = gen_lowpart (Pmode, operands[1]);
    operands[2] = gen_lowpart (Pmode, operands[2]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
+   if (GET_CODE (operands[2]) == SUBREG)
+     alter_subreg (&operands[2]);
  })
  
  (define_insn "*addsi_2"
***************
*** 10873,10878 ****
--- 10913,10920 ----
    rtx pat;
    operands[0] = gen_lowpart (SImode, operands[0]);
    operands[1] = gen_lowpart (Pmode, operands[1]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
    operands[2] = gen_int_mode (1 << INTVAL (operands[2]), Pmode);
    pat = gen_rtx_MULT (Pmode, operands[1], operands[2]);
    if (Pmode != SImode)
***************
*** 10952,10957 ****
--- 10994,11001 ----
  					    (match_dup 2)) 0)))]
  {
    operands[1] = gen_lowpart (Pmode, operands[1]);
+   if (GET_CODE (operands[1]) == SUBREG)
+     alter_subreg (&operands[1]);
    operands[2] = gen_int_mode (1 << INTVAL (operands[2]), Pmode);
  })
  



More information about the Gcc-patches mailing list