ICE with MEM_REF when Pmode is different from word_mode
Mohamed Shafi
shafitvm@gmail.com
Tue May 29 11:58:00 GMT 2012
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));
}
base = TREE_OPERAND (base, 0);
}
else
base = build_fold_addr_expr (base);
the assert check in size_binop fails
gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
TREE_TYPE (arg1)));
This is because the mode of arg0 and arg1 are different, one is Pmode
and other is word_mode.
This is present in m32c target which also has different Pmode and word_mode.
Is this a know failure? I cannot find a bug entry for this issue.
Should i report this?
Regards,
Shafi
More information about the Gcc
mailing list