This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR ada/19382 (Re: Aliasing violation generated by fold_builtin_memcmp?)
- From: Ulrich Weigand <uweigand at de dot ibm dot com>
- To: rth at redhat dot com (Richard Henderson)
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 1 Oct 2005 19:02:05 +0200 (CEST)
- Subject: [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