Hello Richard, > -----Original Message----- > From: gcc-ow...@gcc.gnu.org [mailto:gcc-ow...@gcc.gnu.org] On Behalf Of > Richard Guenther > Sent: 31 May 2012 14:27 > To: Mohamed Shafi > Cc: GCC; d...@redhat.com; Ahmed Sherif > Subject: Re: ICE with MEM_REF when Pmode is different from word_mode > > On Wed, May 30, 2012 at 4:31 PM, Mohamed Shafi <shafi...@gmail.com> > wrote: > > On 29 May 2012 17:31, Richard Guenther <richard.guent...@gmail.com> > wrote: > >> On Tue, May 29, 2012 at 1:57 PM, Mohamed Shafi <shafi...@gmail.com> > wrote: > >>> Hi, > >>> > >>> I am porting a private target in GCC 4.6.3 version. For my target > >>> pointer size is 24bits and word size is 32bits. Moreover a byte is > >>> 32bit > >>> > >>> For the testcase gcc.c-torture/compile/921111-1.c i get the > >>> following ICE > >>> > >>> 921111-1.c: In function 'f': > >>> 921111-1.c:18:5: internal compiler error: in size_binop_loc, at > >>> fold-const.c:1436 > >>> Please submit a full bug report, > >>> with preprocessed source if appropriate. > >>> See <http://gcc.gnu.org/bugs.html> for instructions > >>> > >>> This is the reduced testcase of the same > >>> > >>> struct vp { > >>> int wa; > >>> }; > >>> > >>> typedef struct vp *vpt; > >>> > >>> typedef struct vc { > >>> int o; > >>> vpt py[8]; > >>> } *vct; > >>> > >>> typedef struct np *npt; > >>> struct np { > >>> vct d; > >>> int di; > >>> }; > >>> > >>> int f(npt dp) > >>> { > >>> vpt *py; > >>> > >>> py = &dp->d->py[dp->di]; > >>> return (int)(py[1])->wa; > >>> } > >>> > >>> The ICE happens in tree_slp_vectorizer pass. The following is the > >>> tree dump just before that > >>> > >>> ;; Function f (f) > >>> > >>> f (struct np * dp) > >>> { > >>> struct vp * D.1232; > >>> int D.1230; > >>> unsigned int D.1228; > >>> int D.1227; > >>> struct vc * D.1225; > >>> > >>> <bb 2>: > >>> D.1225_2 = dp_1(D)->d; > >>> D.1227_4 = dp_1(D)->di; > >>> D.1228_5 = (unsigned int) D.1227_4; > >>> D.1232_9 = MEM[(struct vp * *)D.1225_2 + 4B].py[D.1228_5]{lb: 0 > sz: > >>> 4}; > >>> D.1230_10 = D.1232_9->wa; > >>> return D.1230_10; > >>> } > >>> > >>> The ICE happens for > >>> > >>> D.1232_9 = MEM[(struct vp * *)D.1225_2 + 4B].py[D.1228_5]{lb: 0 > sz: > >>> 4}; > >>> > >>> This is due to the addition of the new code in tree-data-ref.c > (this > >>> is was not there in 4.5 series) > >>> > >>> if (TREE_CODE (base) == MEM_REF) > >>> { > >>> if (!integer_zerop (TREE_OPERAND (base, 1))) > >>> { > >>> if (!poffset) > >>> { > >>> double_int moff = mem_ref_offset (base); > >>> poffset = double_int_to_tree (sizetype, moff); > >>> } > >>> else > >>> poffset = size_binop (PLUS_EXPR, poffset, TREE_OPERAND > >>> (base, 1)); > >> > >> This should use mem_ref_offset, too. > >> > > > > This is present in the trunk also. Will you be submitting a patch for > this? > > I put it on my TODO list. Something like Is this issue fixed now for gcc 4.6.3? I am not able to find a bug entry for this. Could you please share the link?
Thanks. > Index: gcc/tree-data-ref.c > =================================================================== > --- gcc/tree-data-ref.c (revision 188008) > +++ gcc/tree-data-ref.c (working copy) > @@ -720,13 +720,12 @@ dr_analyze_innermost (struct data_refere > { > if (!integer_zerop (TREE_OPERAND (base, 1))) > { > + double_int moff = mem_ref_offset (base); > + tree mofft = double_int_to_tree (sizetype, moff); > if (!poffset) > - { > - double_int moff = mem_ref_offset (base); > - poffset = double_int_to_tree (sizetype, moff); > - } > + poffset = mofft; > else > - poffset = size_binop (PLUS_EXPR, poffset, TREE_OPERAND > (base, 1)); > + poffset = size_binop (PLUS_EXPR, poffset, mofft); > } > base = TREE_OPERAND (base, 0); > } > > > > Shafi