ICE with MEM_REF when Pmode is different from word_mode
Mohamed Shafi
shafitvm@gmail.com
Wed May 30 14:36:00 GMT 2012
On 29 May 2012 17:31, Richard Guenther <richard.guenther@gmail.com> wrote:
> On Tue, May 29, 2012 at 1:57 PM, Mohamed Shafi <shafitvm@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?
Shafi
More information about the Gcc
mailing list