------- Comment #9 from rguenth at gcc dot gnu dot org  2006-08-20 16:44 -------
Caused by

 2006-04-02  Sebastian Pop  <[EMAIL PROTECTED]>

...
+       * tree-chrec.h (build_polynomial_chrec): Insert an assert to check
+       the types of the operands.
...

for the testcase in comment #6 we have the two types

 type <pointer_type 0xa7cebf18 dw_fde_ref
        type <record_type 0xa7cebe04 dw_fde_struct sizes-gimplified type_0 SI
            size <integer_cst 0xa7c5f3f0 constant invariant 32>
            unit size <integer_cst 0xa7c5f180 constant invariant 4>
            align 32 symtab 0 alias set 4 fields <field_decl 0xa7cebe60 decl>
context <translation_unit_decl 0xa7c77f08 D.1540>
            pointer_to_this <pointer_type 0xa7cebebc> chain <type_decl
0xa7c77dd0 D.1520>>
        sizes-gimplified public unsigned SI size <integer_cst 0xa7c5f3f0 32>
unit size <integer_cst 0xa7c5f180 4>
        align 32 symtab 0 alias set -1>

and

 <pointer_type 0xa7cebebc
    type <record_type 0xa7cebe04 dw_fde_struct sizes-gimplified type_0 SI
        size <integer_cst 0xa7c5f3f0 constant invariant 32>
        unit size <integer_cst 0xa7c5f180 constant invariant 4>
        align 32 symtab 0 alias set 4
        fields <field_decl 0xa7cebe60 decl type <integer_type 0xa7c71284 int>
            SI file t.i line 3 size <integer_cst 0xa7c5f3f0 32> unit size
<integer_cst 0xa7c5f180 4>
            align 32 offset_align 128
            offset <integer_cst 0xa7c5f198 constant invariant 0>
            bit offset <integer_cst 0xa7c5f978 constant invariant 0> context
<record_type 0xa7cebe04 dw_fde_struct>> context <translation_unit_decl
0xa7c77f08 D.1540>
        pointer_to_this <pointer_type 0xa7cebebc> chain <type_decl 0xa7c77dd0
D.1520>>
    sizes-gimplified public unsigned SI size <integer_cst 0xa7c5f3f0 32> unit
size <integer_cst 0xa7c5f180 4>
    align 32 symtab 0 alias set 2>

note the identical TREE_TYPE (type).  And note that we have a NOP_EXPR
wrapping the correct type.

We arrive there by fold_used_pointer, which is simplifying casts but not
re-folding the arguments to the plus/minus in

      if (code == PLUS_EXPR)
        expr = chrec_fold_plus (TREE_TYPE (expr), new0, new1);
      else
        expr = chrec_fold_minus (TREE_TYPE (expr), new0, new1);

The following fixes it:

Index: tree-scalar-evolution.c
===================================================================
*** tree-scalar-evolution.c     (revision 116257)
--- tree-scalar-evolution.c     (working copy)
*************** fold_used_pointer (tree expr)
*** 1847,1852 ****
--- 1847,1854 ----
        if (new0 == op0 && new1 == op1)
        return expr;

+       new0 = chrec_convert (TREE_TYPE (expr), new0, NULL_TREE);
+       new1 = chrec_convert (TREE_TYPE (expr), new1, NULL_TREE);
        if (code == PLUS_EXPR)
        expr = chrec_fold_plus (TREE_TYPE (expr), new0, new1);
        else


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28776

Reply via email to