Commit 27e484bc by Eric Botcazou Committed by Eric Botcazou

re PR target/7784 ([Sparc] ICE in extract_insn, at recog.c:2148)

	PR target/7784
	* reload.c (find_reloads_address): Handle
	(PLUS (PLUS (REG) (REG)) (CONST_INT)) form for
	all base registers.

From-SVN: r64887
parent 72eb6d42
2003-03-26 Eric Botcazou <ebotcazou@libertysurf.fr>
PR target/7784
* reload.c (find_reloads_address): Handle
(PLUS (PLUS (REG) (REG)) (CONST_INT)) form for
all base registers.
2003-03-25 Marcelo Abreu <mmabreu@inf.ufrgs.br> 2003-03-25 Marcelo Abreu <mmabreu@inf.ufrgs.br>
PR other/10203 PR other/10203
......
...@@ -4890,25 +4890,23 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn) ...@@ -4890,25 +4890,23 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn)
that the index needs a reload and find_reloads_address_1 will take care that the index needs a reload and find_reloads_address_1 will take care
of it. of it.
If we decide to do something here, it must be that Handle all base registers here, not just fp/ap/sp, because on some
`double_reg_address_ok' is true and that this address rtl was made by targets (namely Sparc) we can also get invalid addresses from preventive
eliminate_regs. We generate a reload of the fp/sp/ap + constant and subreg big-endian corrections made by find_reloads_toplev.
If we decide to do something, it must be that `double_reg_address_ok'
is true. We generate a reload of the base register + constant and
rework the sum so that the reload register will be added to the index. rework the sum so that the reload register will be added to the index.
This is safe because we know the address isn't shared. This is safe because we know the address isn't shared.
We check for fp/ap/sp as both the first and second operand of the We check for the base register as both the first and second operand of
innermost PLUS. */ the innermost PLUS. */
else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT
&& GET_CODE (XEXP (ad, 0)) == PLUS && GET_CODE (XEXP (ad, 0)) == PLUS
&& (XEXP (XEXP (ad, 0), 0) == frame_pointer_rtx && GET_CODE (XEXP (XEXP (ad, 0), 0)) == REG
#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM && REGNO (XEXP (XEXP (ad, 0), 0)) < FIRST_PSEUDO_REGISTER
|| XEXP (XEXP (ad, 0), 0) == hard_frame_pointer_rtx && REG_MODE_OK_FOR_BASE_P (XEXP (XEXP (ad, 0), 0), mode)
#endif
#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
|| XEXP (XEXP (ad, 0), 0) == arg_pointer_rtx
#endif
|| XEXP (XEXP (ad, 0), 0) == stack_pointer_rtx)
&& ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 1))) && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 1)))
{ {
*loc = ad = gen_rtx_PLUS (GET_MODE (ad), *loc = ad = gen_rtx_PLUS (GET_MODE (ad),
...@@ -4926,14 +4924,9 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn) ...@@ -4926,14 +4924,9 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn)
else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT
&& GET_CODE (XEXP (ad, 0)) == PLUS && GET_CODE (XEXP (ad, 0)) == PLUS
&& (XEXP (XEXP (ad, 0), 1) == frame_pointer_rtx && GET_CODE (XEXP (XEXP (ad, 0), 1)) == REG
#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM && REGNO (XEXP (XEXP (ad, 0), 1)) < FIRST_PSEUDO_REGISTER
|| XEXP (XEXP (ad, 0), 1) == hard_frame_pointer_rtx && REG_MODE_OK_FOR_BASE_P (XEXP (XEXP (ad, 0), 1), mode)
#endif
#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
|| XEXP (XEXP (ad, 0), 1) == arg_pointer_rtx
#endif
|| XEXP (XEXP (ad, 0), 1) == stack_pointer_rtx)
&& ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 0))) && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 0)))
{ {
*loc = ad = gen_rtx_PLUS (GET_MODE (ad), *loc = ad = gen_rtx_PLUS (GET_MODE (ad),
......
2003-03-26 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/ultrasp6.c: New test.
2003-03-25 Eric Botcazou <ebotcazou@libertysurf.fr> 2003-03-25 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/i386-signbit-1.c: New test. * gcc.dg/i386-signbit-1.c: New test.
......
/* PR target/7784 */
/* Originator: Peter van Hoof <p.van-hoof@qub.ac.uk> */
/* { dg-do compile { target sparc-*-* } } */
/* { dg-options "-O2 -mcpu=ultrasparc" } */
typedef struct
{
float EnergyErg;
float ots;
} EmLine;
extern const int ipH_LIKE ;
extern const int ipHYDROGEN ;
extern const int ipH1s;
extern const int ipH2s;
extern const int ipH2p;
extern EmLine ****EmisLines;
typedef struct
{
long n;
long s;
long l;
} Elevels;
extern struct t_iso
{
float ***Pop2Ion;
long int numLevels[2][30L];
} iso;
extern struct t_LineSave
{
long int nsum;
long int ndsum;
long int nComment;
long int npxdd;
long int ipass;
char chHoldComments[10][200];
} LineSave;
extern struct t_hydro
{
int lgHydEmiss;
float **pestrk ;
} hydro;
extern struct t_dense
{
double DensityLaw[10];
float frad[500];
float fhden[500];
float den0;
double eden;
} dense;
extern struct t_abund
{
float xIonFracs[30L +3][30L +1];
} abund;
extern struct t_CaseBHS
{
long int nDensity[2][8] , ntemp[2][8] , ncut[2][8] ;
int lgHCaseBOK[2][8];
} CaseBHS ;
extern struct t_smbeta
{
float SimHBeta,
cn4861,
cn1216,
sv4861,
sv1216;
} smbeta;
extern struct t_phycon
{
float te;
} phycon;
extern struct t_sphere
{
int lgSphere;
float covgeo;
} sphere;
void linadd(double xInten, float wavelength, char *chLab, char chInfo);
extern struct t_radiusVar
{
int lgDrNeg;
double dVeff;
} radius;
void lines_hydro(void)
{
long int i, nelem, ipHi, ipLo;
double hbetab, em , EmisFac, pump;
char chLabel[5];
linadd(abund.xIonFracs[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][3]*hydro.pestrk[3][2]*3.025e-12, 6563,"Strk",'i');
linadd(abund.xIonFracs[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][4]*hydro.pestrk[4][2]*4.084e-12, 4861,"Strk",'i');
linadd(abund.xIonFracs[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][4]*hydro.pestrk[4][3]*1.059e-12, 18751,"Strk",'i');
linadd(abund.xIonFracs[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][5]*hydro.pestrk[5][4]*4.900e-13, 40512,"Strk",'i');
((void)((LineSave.ipass <1 || EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].ots>= 0.) || (__assert("LineSave.ipass <1 || EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].ots>= 0.", "lines_hydro.c", 118), 0)));
linadd(EmisLines[ipH_LIKE][ipHYDROGEN][3][ipH2s].ots*EmisLines[ipH_LIKE][ipHYDROGEN][3][ipH2s].EnergyErg, 6563,"Dest",'i');
linadd(EmisLines[ipH_LIKE][ipHYDROGEN][5][4].ots*EmisLines[ipH_LIKE][ipHYDROGEN][5][4].EnergyErg,40516, "Dest",'i');
smbeta.SimHBeta = smbeta.SimHBeta/(float)radius.dVeff*sphere.covgeo;
linadd(smbeta.SimHBeta,4861,"Q(H)",'i');
smbeta.SimHBeta = smbeta.SimHBeta*(float)radius.dVeff/sphere.covgeo;
for( nelem=0; nelem < 30L; nelem++ )
{
int iCase;
for( iCase=0; iCase<2; ++iCase )
{
char chAB[2]={'A','B'};
char chLab[5]="Ca ";
for( ipLo=1+iCase; ipLo<(((6)<(iso.numLevels[ipH_LIKE][nelem])) ? (6) : (5)); ++ipLo )
{
for( ipHi=ipLo+1; ipHi< (((ipLo+5)<(iso.numLevels[ipH_LIKE][nelem])) ? (ipLo+5) : (iso.numLevels[ipH_LIKE][nelem])); ++ipHi )
{
float wl;
hbetab = HSRate( ipHi,ipLo , nelem+1, phycon.te , dense.eden, chAB[iCase] );
if( hbetab<=0. )
CaseBHS.lgHCaseBOK[iCase][nelem] = 0;
if( !hydro.lgHydEmiss )
hbetab *= abund.xIonFracs[nelem][nelem+1]*dense.eden;
linadd(hbetab,wl,chLab,'i' );
}
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment