This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] convert braced initializers to strings (PR 71625)


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 <msebor@gmail.com> wrote:
On 08/07/2018 02:57 AM, Jason Merrill wrote:

On Wed, Aug 1, 2018 at 12:49 AM, Martin Sebor <msebor@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.)

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?

Martin


Thanks,
James

-----

New failures in:


gcc.target/aarch64/advsimd-intrinsics/vmax.c
gcc.target/aarch64/simd/vzipqp8_1.c
gcc.target/aarch64/vldN_dup_1.c
gcc.target/aarch64/advsimd-intrinsics/vcle.c
gcc.target/aarch64/advsimd-intrinsics/vadd.c
gcc.target/aarch64/advsimd-intrinsics/vhadd.c
gcc.target/aarch64/advsimd-intrinsics/vmull_n.c
gcc.target/aarch64/advsimd-intrinsics/vrndn.c
gcc.target/aarch64/simd/vtrnqp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vpadal.c
gcc.target/aarch64/advsimd-intrinsics/vtrn_half.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlal_n.c
gcc.target/aarch64/advsimd-intrinsics/vqdmulh.c
gcc.target/aarch64/advsimd-intrinsics/vqsub.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlal_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlsl_n.c
gcc.target/aarch64/advsimd-intrinsics/vuzp_half.c
gcc.target/aarch64/advsimd-intrinsics/vst1_lane.c
gcc.target/aarch64/advsimd-intrinsics/vmla_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmulh_lane.c
gcc.target/aarch64/advsimd-intrinsics/vrsqrte.c
gcc.target/aarch64/advsimd-intrinsics/vneg.c
gcc.target/aarch64/simd/vuzpqp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vcale.c
gcc.target/aarch64/advsimd-intrinsics/vmla_n.c
gcc.target/aarch64/advsimd-intrinsics/vsub.c
gcc.target/aarch64/advsimd-intrinsics/vrev.c
gcc.target/aarch64/advsimd-intrinsics/vmul.c
gcc.target/aarch64/advsimd-intrinsics/vldX.c
gcc.target/aarch64/advsimd-intrinsics/vsubl.c
gcc.target/aarch64/advsimd-intrinsics/vfms.c
gcc.target/aarch64/advsimd-intrinsics/vmlsl.c
gcc.target/aarch64/advsimd-intrinsics/vsli_n.c
gcc.target/aarch64/advsimd-intrinsics/vcombine.c
gcc.target/aarch64/advsimd-intrinsics/vmul_n.c
gcc.target/aarch64/advsimd-intrinsics/vldX_dup.c
gcc.target/aarch64/advsimd-intrinsics/vpaddl.c
gcc.target/aarch64/advsimd-intrinsics/vqshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vstX_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqtbX.c
gcc.target/aarch64/advsimd-intrinsics/vext.c
gcc.target/aarch64/advsimd-intrinsics/vtrn.c
gcc.target/aarch64/advsimd-intrinsics/vtst.c
gcc.target/aarch64/advsimd-intrinsics/vbic.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlsl.c
gcc.target/aarch64/advsimd-intrinsics/vqshl.c
gcc.target/aarch64/advsimd-intrinsics/vrsqrts.c
gcc.target/aarch64/advsimd-intrinsics/vqdmull_n.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlsl_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmulh_n.c
gcc.target/aarch64/advsimd-intrinsics/vsubw.c
gcc.target/aarch64/advsimd-intrinsics/vdup_lane.c
gcc.target/aarch64/advsimd-intrinsics/vget_high.c
gcc.target/aarch64/advsimd-intrinsics/vuzp.c
gcc.target/aarch64/advsimd-intrinsics/vqshl_n.c
gcc.target/aarch64/advsimd-intrinsics/vrsra_n.c
gcc.target/aarch64/advsimd-intrinsics/vcgt.c
gcc.target/aarch64/advsimd-intrinsics/vld1_dup.c
gcc.target/aarch64/advsimd-intrinsics/vaddhn.c
gcc.target/aarch64/advsimd-intrinsics/vqshlu_n.c
gcc.target/aarch64/advsimd-intrinsics/vabs.c
gcc.target/aarch64/advsimd-intrinsics/vshll_n.c
gcc.target/aarch64/advsimd-intrinsics/vsubhn.c
gcc.target/aarch64/advsimd-intrinsics/vmlal.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlal.c
gcc.target/aarch64/advsimd-intrinsics/vrecpe.c
gcc.target/aarch64/advsimd-intrinsics/vqneg.c
gcc.target/aarch64/advsimd-intrinsics/veor.c
gcc.target/aarch64/simd/extq_p8_1.c
gcc.target/aarch64/advsimd-intrinsics/vclz.c
gcc.target/aarch64/simd/ext_p8_1.c
gcc.target/aarch64/advsimd-intrinsics/vqrdmulh_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqrshl.c
gcc.target/aarch64/advsimd-intrinsics/vqrshrun_n.c
gcc.target/aarch64/advsimd-intrinsics/vqrshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vceq.c
gcc.target/aarch64/advsimd-intrinsics/vrndm.c
gcc.target/aarch64/advsimd-intrinsics/vmlsl_n.c
gcc.target/aarch64/advsimd-intrinsics/vmlal_n.c
gcc.target/aarch64/advsimd-intrinsics/vqmovun.c
gcc.target/aarch64/advsimd-intrinsics/vrshr_n.c
gcc.target/aarch64/advsimd-intrinsics/vmls_n.c
gcc.target/aarch64/advsimd-intrinsics/vmlsl_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmull_lane.c
gcc.target/aarch64/advsimd-intrinsics/vfms_vfma_n.c
gcc.target/aarch64/advsimd-intrinsics/vorr.c
gcc.target/aarch64/advsimd-intrinsics/vaddl.c
gcc.target/aarch64/advsimd-intrinsics/vmovl.c
gcc.target/aarch64/advsimd-intrinsics/vbsl.c
gcc.target/aarch64/advsimd-intrinsics/vld1_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqmovn.c
gcc.target/aarch64/advsimd-intrinsics/vcalt.c
gcc.target/aarch64/advsimd-intrinsics/vmul_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqshrun_n.c
gcc.target/aarch64/advsimd-intrinsics/vset_lane.c
gcc.target/aarch64/advsimd-intrinsics/vrsubhn.c
gcc.target/aarch64/advsimd-intrinsics/vshl_n.c
gcc.target/aarch64/advsimd-intrinsics/vmovn.c
gcc.target/aarch64/advsimd-intrinsics/vcls.c
gcc.target/aarch64/advsimd-intrinsics/vcage.c
gcc.target/aarch64/advsimd-intrinsics/vcnt.c
gcc.target/aarch64/advsimd-intrinsics/vmull.c
gcc.target/aarch64/simd/vuzpp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vreinterpret_p64.c
gcc.target/aarch64/advsimd-intrinsics/vfma.c
gcc.target/aarch64/advsimd-intrinsics/vld1.c
gcc.target/aarch64/advsimd-intrinsics/vhsub.c
gcc.target/aarch64/advsimd-intrinsics/vget_low.c
gcc.target/aarch64/advsimd-intrinsics/p64_p128.c
gcc.target/aarch64/advsimd-intrinsics/vcvt.c
gcc.target/aarch64/advsimd-intrinsics/vqdmull.c
gcc.target/aarch64/advsimd-intrinsics/vmvn.c
gcc.target/aarch64/advsimd-intrinsics/vmin.c
gcc.target/aarch64/advsimd-intrinsics/vaba.c
gcc.target/aarch64/advsimd-intrinsics/vqrdmulh_n.c
gcc.target/aarch64/simd/vtrnp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vcagt.c
gcc.target/aarch64/advsimd-intrinsics/vdup-vmov.c
gcc.target/aarch64/advsimd-intrinsics/vrhadd.c
gcc.target/aarch64/advsimd-intrinsics/vabal.c
gcc.target/aarch64/advsimd-intrinsics/vrshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vpmax.c
gcc.target/aarch64/advsimd-intrinsics/vmls.c
gcc.target/aarch64/advsimd-intrinsics/vshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vrnd.c
gcc.target/aarch64/advsimd-intrinsics/vabd.c
gcc.target/aarch64/simd/vzipp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vduph_lane.c
gcc.target/aarch64/advsimd-intrinsics/vreinterpret_p128.c
gcc.target/aarch64/advsimd-intrinsics/vrshl.c
gcc.target/aarch64/advsimd-intrinsics/vcreate.c
gcc.target/aarch64/advsimd-intrinsics/vqabs.c
gcc.target/aarch64/advsimd-intrinsics/vmull_lane.c
gcc.target/aarch64/advsimd-intrinsics/vreinterpret.c
gcc.target/aarch64/advsimd-intrinsics/vmlal_lane.c
gcc.target/aarch64/advsimd-intrinsics/vshr_n.c
gcc.target/aarch64/advsimd-intrinsics/vzip.c
gcc.target/aarch64/vldN_lane_1.c
gcc.target/aarch64/advsimd-intrinsics/vabdl.c
gcc.target/aarch64/advsimd-intrinsics/vpmin.c
gcc.target/aarch64/advsimd-intrinsics/vqadd.c
gcc.target/aarch64/advsimd-intrinsics/vzip_half.c
gcc.target/aarch64/advsimd-intrinsics/vand.c
gcc.target/aarch64/advsimd-intrinsics/vpadd.c
gcc.target/aarch64/advsimd-intrinsics/vrndx.c
gcc.target/aarch64/advsimd-intrinsics/vmla.c
gcc.target/aarch64/advsimd-intrinsics/vsra_n.c
gcc.target/aarch64/advsimd-intrinsics/vget_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqrdmulh.c
gcc.target/aarch64/advsimd-intrinsics/vrndp.c
gcc.target/aarch64/advsimd-intrinsics/vmls_lane.c
gcc.target/aarch64/advsimd-intrinsics/vclt.c
gcc.target/aarch64/advsimd-intrinsics/vfma_n.c
gcc.target/aarch64/advsimd-intrinsics/vaddw.c
gcc.target/aarch64/advsimd-intrinsics/vsri_n.c
gcc.target/aarch64/advsimd-intrinsics/vorn.c
gcc.target/aarch64/advsimd-intrinsics/vcvt_f16.c
gcc.target/aarch64/advsimd-intrinsics/vldX_lane.c
gcc.target/aarch64/advsimd-intrinsics/vcge.c
gcc.target/aarch64/advsimd-intrinsics/vshl.c
gcc.target/aarch64/advsimd-intrinsics/vtbX.c
gcc.target/aarch64/advsimd-intrinsics/vraddhn.c
gcc.target/aarch64/advsimd-intrinsics/vrnda.c
gcc.target/aarch64/advsimd-intrinsics/vrecps.c






Martin

PR tree-optimization/71625 - missing strlen optimization on different array initialization style

gcc/c/ChangeLog:

	PR tree-optimization/71625
	* c-parser.c (c_parser_declaration_or_fndef): Call
	braced_list_to_string.

gcc/c-family/ChangeLog:

	PR tree-optimization/71625
	* c-common.c (braced_list_to_string): New function.
	* c-common.h (braced_list_to_string): Declare it.

gcc/cp/ChangeLog:

	PR tree-optimization/71625
	* decl.c (check_initializer):  Call braced_list_to_string.
	(eval_check_narrowing): New function.
	* gcc/cp/typeck2.c (digest_init_r): Accept strings literals
	as initilizers for all narrow character types.

gcc/testsuite/ChangeLog:

	PR tree-optimization/71625
	* g++.dg/init/string2.C: New test.
	* g++.dg/init/string3.C: New test.
	* g++.dg/init/string4.C: New test.
	* gcc.dg/init-string-3.c: New test.
	* gcc.dg/strlenopt-55.c: New test.
	* gcc.dg/strlenopt-56.c: New test.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]