fix ICE out of SRA try_instantiate_multiple_fields
Richard Guenther
richard.guenther@gmail.com
Tue May 6 11:52:00 GMT 2008
On Tue, May 6, 2008 at 12:58 PM, Olivier Hainque <hainque@adacore.com> wrote:
> Hello
>
> Compiling the Ada testcase below on mips-irix/n32 ICEs out of an invalid
> operation produced by the SRA try_instantiate_multiple_fields circuitry. The
> case is extracted from the a-except runtime library unit, so the ICE presented
> here actually breaks bootstrap for Ada on the target.
>
> package P is
> function Letter return String;
> end;
>
> package body P is
> function X return String is
> begin
> return "X";
> end;
>
> function Letter return String is
> begin
> return X;
> end;
> end;
>
> The compiler eventually complains about an invalid BIT_FIELD_REF conversion
> operand, like so:
>
> $ ../prev-gcc/gnat1 -gnatp -O1 [...] p.adb
> ...
> p.adb:14: error: invalid operand to unary operator
> BIT_FIELD_REF <SR.2_4, 32, 32>;
> p.adb:14: note: in statement
> SR.5_6 = (unsigned int) BIT_FIELD_REF <SR.2_4, 32, 32>;
>
> Indeed, post-gimplification NOP_EXPRs are expected to apply to "is_gimple_val"
> operands only, and SRA turns
>
> P.Letter ()
> {
> ...
> <bb 2>:
> D.1314 ={v} p__x ();
> D.1313 ={v} D.1314;
> R5b ={v} D.1313;
> D.1315 ={v} R5b;
> return D.1315;
>
> }
>
> into
>
> P.Letter ()
> {
> ...
> <bb 2>:
> SR.1_1 = 0;
> SR.2_2 = 0;
> D.1314 ={v} p__x ();
> SR.3_3 = VIEW_CONVERT_EXPR<UNSIGNED_64>(D.1314);
> SR.2_4 = SR.3_3;
> SR.4_5 = SR.1_1 & 0x0ffffffff00000000;
> SR.5_6 = (unsigned int) BIT_FIELD_REF <SR.2_4, 32, 32>;
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> SR.6_7 = (UNSIGNED_64) SR.5_6;
> SR.1_8 = SR.4_5 | SR.6_7;
> SR.7_9 = SR.1_8 & 4294967295;
> SR.8_10 = (unsigned int) BIT_FIELD_REF <SR.2_4, 32, 0>;
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> SR.9_11 = (UNSIGNED_64) SR.8_10;
> SR.10_12 = SR.9_11 << 32;
> SR.1_13 = SR.7_9 | SR.10_12;
> SR.1_14 = SR.2_4;
> SR.11_15 = SR.1_14;
> D.1315 ={v} VIEW_CONVERT_EXPR<struct >(SR.11_15);
> return D.1315;
>
> The transformed assignments initially involved Ada "fat" pointers to
> unconstrained objects (strings), represented as a record with two regular
> pointer fields, one to the bounds and one to the data.
>
> IIUC, try_instantiate_multiple_fields is meant to simplify the code generated
> for accesses to groups of bitfields. Pointer fields are usually not good
> candidates for such coalescing, and the unexpected code expansion above I
> think illustrates this pretty well.
>
> Pointer fields are most of the time not coalesced by virtue of their size
> typically being equal to that of a word, which is not the case on mips-irix
> with the n32 ABI where the crash showed up.
>
> The attached simple patch is a suggestion to address that by early returning
> from try_instantiate_multiple_fields when the candidate field has
> POINTER_TYPE.
>
> Tested first on mips-irix/n32 by checking that the testcase doesn't ICE
> anymore and that bootstrap proceeds past the previous failure point, then with
> a regular bootstrap and regression test cycle on x86_64-suse-linux.
>
> Thanks in advance,
This is ok.
Thanks,
Richard.
> Olivier
>
> 2008-05-06 Olivier Hainque <hainque@adacore.com>
>
> * tree-sra.c (try_instantiate_multiple_fields): Early return
> if field has POINTER_TYPE.
>
> testsuite/
> * gnat.dg/fatp_sra.adb: New test.
>
>
More information about the Gcc-patches
mailing list