On August 15, 2018 12:28:55 PM GMT+02:00, James Greenhalgh <james.greenha...@arm.com> wrote: >On Tue, Aug 14, 2018 at 09:34:08PM -0500, Martin Sebor wrote: >> On 08/14/2018 09:24 AM, Martin Sebor wrote: >> > On 08/14/2018 09:08 AM, Martin Sebor wrote: >> >> On 08/14/2018 07:27 AM, James Greenhalgh wrote: >> >>> On Wed, Aug 08, 2018 at 07:17:07PM -0500, Martin Sebor wrote: >> >>>> On 08/08/2018 05:08 AM, Jason Merrill wrote: >> >>>>> On Wed, Aug 8, 2018 at 9:04 AM, Martin Sebor <mse...@gmail.com> >wrote: >> >>>>>> On 08/07/2018 02:57 AM, Jason Merrill wrote: >> >>>>>>> >> >>>>>>> On Wed, Aug 1, 2018 at 12:49 AM, Martin Sebor ><mse...@gmail.com> >> >>>>>>> wrote: >> >>>>>>>> >> >>>>>>>> On 07/31/2018 07:38 AM, Jason Merrill wrote: >> >>> >> >>> <snip> >> >>> >> >>>> Done in the attached patch. I've also avoided dealing with >> >>>> zero-length arrays and added tests to make sure their size >> >>>> stays is regardless of the form of their initializer and >> >>>> the appropriate warnings are issued. >> >>>> >> >>>> Using build_string() rather than build_string_literal() needed >> >>>> a tweak in digest_init_r(). It didn't break anything but since >> >>>> the array type may not have a domain yet, neither will the >> >>>> string. It looks like that may get adjusted later on but I've >> >>>> temporarily guarded the code with #if 1. If the change is >> >>>> fine I'll remove the #if before committing. >> >>>> >> >>>> This initial patch only handles narrow character initializers >> >>>> (i.e., those with TYPE_STRING_FLAG set). Once this gets some >> >>>> exposure I'd like to extend it to other character types, >> >>>> including wchar_t. >> >>> >> >>> Hi Martin, >> >>> >> >>> This causes issues for the AArch64 tests (full list below). >> >>> >> >>> I see an error message on the following construct: >> >>> >> >>> void foo (void) >> >>> { >> >>> __Poly8_t x[4] = { 1, 2, 3, 4 }; >> >>> } >> >>> >> >>> init.c:3:20: error: array of inappropriate type initialized >from >> >>> string constant >> >>> 3 | __Poly8_t x[4] = { 1, 2, 3, 4 }; >> >>> | >> >>> >> >>> __Poly8_t is a type we define in our backend, through a >convoluted >> >>> set of >> >>> functions, which operates a lot like an unsigned, QI mode type. >> >> >> >> I see the error with my aarch64 cross-compiler . The new code >> >> that does the conversion of array initializers to STRING_CSTs >> >> looks for the TYPE_STRING_FLAG() to be set on the type of >> >> the array elements. Perhaps __Poly8_t should not have the flag >> >> set? (If it needs it then I think we'd have to only consider >> >> named character types.) >> > >> > The change below gets rid of the compilation error. I don't >> > know if it's appropriate for the aarch64 back end: >> > >> > Index: gcc/config/aarch64/aarch64-builtins.c >> > =================================================================== >> > --- gcc/config/aarch64/aarch64-builtins.c (revision 263537) >> > +++ gcc/config/aarch64/aarch64-builtins.c (working copy) >> > @@ -643,6 +643,7 @@ aarch64_init_simd_builtin_types (void) >> > /* Poly types are a world of their own. */ >> > aarch64_simd_types[Poly8_t].eltype = >aarch64_simd_types[Poly8_t].itype = >> > build_distinct_type_copy (unsigned_intQI_type_node); >> > + TYPE_STRING_FLAG (aarch64_simd_types[Poly8_t].eltype) = false; >> > aarch64_simd_types[Poly16_t].eltype = >> > aarch64_simd_types[Poly16_t].itype = >> > build_distinct_type_copy (unsigned_intHI_type_node); >> > aarch64_simd_types[Poly64_t].eltype = >> > aarch64_simd_types[Poly64_t].itype = > >This fix seems correct to me, the poly types are not strings. Looking >at >other uses of TYPE_STRING_FLAG this change doesn't seem like it would >have >impact on parsing or code generation. > >OK for trunk. > >> >>> A second set of tests fail due to changed inlining behaviour for >> >>> functions >> >>> with char array initialization: >> >>> >> >>> gcc.target/aarch64/vset_lane_1.c >> >>> gcc.target/aarch64/vneg_s.c >> >>> gcc.target/aarch64/vclz.c >> >> >> >> I'm not sure what's going on here. The tests are very big and >> >> take forever to compile with an aarch64 cross-compiler, and I'm >> >> not sure what to look for. Can you provide a smaller test case >> >> that shows the issue? >> >> I wonder if these changes might be due to the same problem: >> the tests define and initialize arrays of the Int8x16_t type >> which is initialized to intQI_type_node, i.e., the signed >> form of Poly8_t. Does the conversion to STRING_CST cause >> a performance degradation or is it just that the tests end >> up with equivalent but slightly different assembly? > >These tests aren't looking at performance, just expecting to see >certain >instructions emitted. The only change is that now the int8x16_t forms >are >inlined (so the scan-assembler-times fails with two matches, one >expected, >one in the inlined function body copy). > >The difference seems to be in the initialization cost of the input data >set. > >Before your patch: > > int8_tD.3359 test_set0D.21541[8]; > int8_tD.3359 answ_set0D.21542[8]; > > test_set0D.21541[0] = 0; > test_set0D.21541[1] = 1; > test_set0D.21541[2] = -1; > test_set0D.21541[3] = 10; > test_set0D.21541[4] = -10; > test_set0D.21541[5] = 0; > test_set0D.21541[6] = 127; > test_set0D.21541[7] = -128; > answ_set0D.21542[0] = 0; > answ_set0D.21542[1] = -1; > answ_set0D.21542[2] = 1; > answ_set0D.21542[3] = -10; > answ_set0D.21542[4] = 10; > answ_set0D.21542[5] = 0; > answ_set0D.21542[6] = -127; > answ_set0D.21542[7] = -128; > >After your patch: > > int8_tD.3357 test_set0D.21539[8]; > int8_tD.3357 answ_set0D.21540[8]; > > test_set0D.21539 = ""; > answ_set0D.21540 = "";
Can we fix printing of string literals to include non-printable chars please? The above looks like wrong-code though it probably isn't. When Martin L. proposed a similar patch I was suggesting to restrict conversion to initializes with only printable characters. >I think that is probably what you expected to happen; but the impact on >inlining might not have been. It's more the effect of changed gimplification that shows, the inlining is a 2nd order effect. Richard. Probably, we want to just change these >tests >to explicitly disable inlining. The tests appear to execute correctly. > >The print in the dump file is a bit unusual; presumably the impact of >having >non-printing characters in my initializer list - but less helpful >output for >it. > >Off topic; these tests are quick to copmpile on my cross and native >compilers. Do you have additional checking enabled? > >Thanks, >James > >> >> The tests also use int8_t and uint8_t for the expected results. >> Those are typedefs for signed and unsigned char, respectively. >> Is the conversion to strings for those fine? >> >> Martin