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]

[PATCH] Fix PR ada/19382 (Re: Aliasing violation generated by fold_builtin_memcmp?)


Richard Henderson wrote:

> Try
> 
>   cst_uchar_ptr_node
>     = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
> 
> which is apparently in use by the Ada front end, but only if a
> certain pragma is given.  Dunno how reliably that's likely to work.

Indeed, this fixes the problem (the tree issues you're still discussing
notwithstanding).  The patch below does this in fold_builtin_memcmp,
and at the equivalent places in fold_builtin_str[n]cmp.

Bootstrapped/regtested on s390-ibm-linux and s390x-ibm-linux for
mainline and 4_0 branch.  Fixes the two s390x Ada FAILs on 4_0
(mainline Ada doesn't bootstrap).

OK for mainline and 4_0?

Bye,
Ulrich

ChangeLog:

	PR ada/19382
	* builtins.c (fold_builtin_memcmp): When constructing the pointer
	type used to access data in the inlined length == 1 case, use
	build_pointer_type_for_mode with CAN_ALIAS_ALL set to true.
	(fold_builtin_strcmp, fold_builtin_strncmp): Likewise.

Index: gcc/builtins.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/builtins.c,v
retrieving revision 1.426.2.5
diff -c -p -r1.426.2.5 builtins.c
*** gcc/builtins.c	28 Aug 2005 11:08:55 -0000	1.426.2.5
--- gcc/builtins.c	30 Sep 2005 11:07:00 -0000
*************** fold_builtin_memcmp (tree arglist)
*** 7419,7425 ****
    if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
        tree ind1 = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,
--- 7419,7427 ----
    if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node
! 	= build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
! 
        tree ind1 = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,
*************** fold_builtin_strcmp (tree arglist)
*** 7471,7477 ****
    if (p2 && *p2 == '\0')
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
        return fold_convert (integer_type_node,
  			   build1 (INDIRECT_REF, cst_uchar_node,
  				   fold_convert (cst_uchar_ptr_node,
--- 7473,7481 ----
    if (p2 && *p2 == '\0')
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node
! 	= build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
! 
        return fold_convert (integer_type_node,
  			   build1 (INDIRECT_REF, cst_uchar_node,
  				   fold_convert (cst_uchar_ptr_node,
*************** fold_builtin_strcmp (tree arglist)
*** 7482,7488 ****
    if (p1 && *p1 == '\0')
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
        tree temp = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,
--- 7486,7494 ----
    if (p1 && *p1 == '\0')
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node
! 	= build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
! 
        tree temp = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,
*************** fold_builtin_strncmp (tree arglist)
*** 7540,7546 ****
        && tree_int_cst_sgn (len) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
        return fold_convert (integer_type_node,
  			   build1 (INDIRECT_REF, cst_uchar_node,
  				   fold_convert (cst_uchar_ptr_node,
--- 7546,7554 ----
        && tree_int_cst_sgn (len) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node
! 	= build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
! 
        return fold_convert (integer_type_node,
  			   build1 (INDIRECT_REF, cst_uchar_node,
  				   fold_convert (cst_uchar_ptr_node,
*************** fold_builtin_strncmp (tree arglist)
*** 7554,7560 ****
        && tree_int_cst_sgn (len) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
        tree temp = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,
--- 7562,7570 ----
        && tree_int_cst_sgn (len) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node
! 	= build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
! 
        tree temp = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,
*************** fold_builtin_strncmp (tree arglist)
*** 7567,7573 ****
    if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
        tree ind1 = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,
--- 7577,7585 ----
    if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
      {
        tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
!       tree cst_uchar_ptr_node
! 	= build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
! 
        tree ind1 = fold_convert (integer_type_node,
  				build1 (INDIRECT_REF, cst_uchar_node,
  					fold_convert (cst_uchar_ptr_node,

-- 
  Dr. Ulrich Weigand
  Linux on zSeries Development
  Ulrich.Weigand@de.ibm.com


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