public inbox for gcc-regression@sourceware.org
help / color / mirror / Atom feed
* [TCWG CI] Failure after basepoints/gcc-13-2658-g645ef01a463: Disallow pointer operands for |, ^ and partly & [PR106878]
@ 2022-09-14 21:04 ci_notify
  0 siblings, 0 replies; only message in thread
From: ci_notify @ 2022-09-14 21:04 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-regression

[-- Attachment #1: Type: text/plain, Size: 11592 bytes --]

Failure after basepoints/gcc-13-2658-g645ef01a463: Disallow pointer operands for |, ^ and partly & [PR106878]:

Results changed to
-10
# true:
0
# build_abe binutils:
1
# build_abe gcc:
2
# build_abe linux:
4
# build_abe glibc:
# FAILED
# First few build errors in logs:
# 00:00:27 fmtmsg.c:100:1: error: type mismatch in binary expression
# 00:00:27 fmtmsg.c:100:1: error: type mismatch in binary expression
# 00:00:27 fmtmsg.c:100:1: internal compiler error: verify_gimple failed
# 00:00:28 make[2]: *** [../o-iterator.mk:9: /home/tcwg-buildslave/workspace/tcwg_gnu_10/abe/builds/armv8l-unknown-linux-gnueabihf/armv8l-unknown-linux-gnueabihf/glibc-glibc.git~master/stdlib/fmtmsg.o] Error 1
# 00:00:28 fmtmsg.c:100:1: error: type mismatch in binary expression
# 00:00:28 fmtmsg.c:100:1: error: type mismatch in binary expression
# 00:00:28 fmtmsg.c:100:1: internal compiler error: verify_gimple failed
# 00:00:28 make[2]: *** [../o-iterator.mk:9: /home/tcwg-buildslave/workspace/tcwg_gnu_10/abe/builds/armv8l-unknown-linux-gnueabihf/armv8l-unknown-linux-gnueabihf/glibc-glibc.git~master/stdlib/fmtmsg.os] Error 1
# 00:00:29 make[1]: *** [Makefile:484: stdlib/subdir_lib] Error 2
# 00:00:29 make: *** [Makefile:9: all] Error 2

from
-10
# true:
0
# build_abe binutils:
1
# build_abe gcc:
2
# build_abe linux:
4
# build_abe glibc:
5
# build_abe gdb:
6

THIS IS THE END OF INTERESTING STUFF.  BELOW ARE LINKS TO BUILDS, REPRODUCTION INSTRUCTIONS, AND THE RAW COMMIT.

For latest status see comments in https://linaro.atlassian.net/browse/GNU-692 .
Status of basepoints/gcc-13-2658-g645ef01a463 commit for tcwg_gnu_native_build:
commit 645ef01a463f15fc230e2155719c7a12cec89acf
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Wed Sep 14 12:36:36 2022 +0200

    Disallow pointer operands for |, ^ and partly & [PR106878]
    
    My change to match.pd (that added the two simplifications this patch
    touches) results in more |/^/& assignments with pointer arguments,
    but since r12-1608 we reject pointer operands for BIT_NOT_EXPR.
    
    Disallowing them for BIT_NOT_EXPR and allowing for BIT_{IOR,XOR,AND}_EXPR
    leads to a match.pd maintainance nightmare (see one of the patches in the
    PR), so either we want to allow pointer operand on BIT_NOT_EXPR (but then
    we run into issues e.g. with the ranger which expects it can emulate
    BIT_NOT_EXPR ~X as - 1 - X which doesn't work for pointers which don't
    support MINUS_EXPR), or the following patch disallows pointer arguments
    for all of BIT_{IOR,XOR,AND}_EXPR with the exception of BIT_AND_EXPR
    with INTEGER_CST last operand (for simpler pointer realignment).
    I had to tweak one reassoc optimization and the two match.pd
    simplifications.
    
    2022-09-14  Jakub Jelinek  <jakub@redhat.com>
    
            PR tree-optimization/106878
            * tree-cfg.cc (verify_gimple_assign_binary): Disallow pointer,
            reference or OFFSET_TYPE BIT_IOR_EXPR, BIT_XOR_EXPR or, unless
            the second argument is INTEGER_CST, BIT_AND_EXPR.
            * match.pd ((type) X op CST -> (type) (X op ((type-x) CST)),
            (type) (((type2) X) op Y) -> (X op (type) Y)): Punt for
            POINTER_TYPE_P or OFFSET_TYPE.
            * tree-ssa-reassoc.cc (optimize_range_tests_cmp_bitwise): For
            pointers cast them to pointer sized integers first.
    
            * gcc.c-torture/compile/pr106878.c: New test.
* master-arm
** Failure after basepoints/gcc-13-2658-g645ef01a463: Disallow pointer operands for |, ^ and partly & [PR106878]:
** https://ci.linaro.org/job/tcwg_gnu_native_build-build-master-arm/445/

Bad  build: https://ci.linaro.org/job/tcwg_gnu_native_build-build-master-arm/445/artifact/artifacts
Good build: https://ci.linaro.org/job/tcwg_gnu_native_build-build-master-arm/444/artifact/artifacts

Reproduce current build:
<cut>
mkdir -p investigate-gcc-645ef01a463f15fc230e2155719c7a12cec89acf
cd investigate-gcc-645ef01a463f15fc230e2155719c7a12cec89acf

# Fetch scripts
git clone https://git.linaro.org/toolchain/jenkins-scripts

# Fetch manifests for bad and good builds
mkdir -p bad/artifacts good/artifacts
curl -o bad/artifacts/manifest.sh https://ci.linaro.org/job/tcwg_gnu_native_build-build-master-arm/445/artifact/artifacts/manifest.sh --fail
curl -o good/artifacts/manifest.sh https://ci.linaro.org/job/tcwg_gnu_native_build-build-master-arm/444/artifact/artifacts/manifest.sh --fail

# Reproduce bad build
(cd bad; ../jenkins-scripts/tcwg_gnu-build.sh ^^ true %%rr[top_artifacts] artifacts)
# Reproduce good build
(cd good; ../jenkins-scripts/tcwg_gnu-build.sh ^^ true %%rr[top_artifacts] artifacts)
</cut>

Full commit (up to 1000 lines):
<cut>
commit 645ef01a463f15fc230e2155719c7a12cec89acf
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Wed Sep 14 12:36:36 2022 +0200

    Disallow pointer operands for |, ^ and partly & [PR106878]
    
    My change to match.pd (that added the two simplifications this patch
    touches) results in more |/^/& assignments with pointer arguments,
    but since r12-1608 we reject pointer operands for BIT_NOT_EXPR.
    
    Disallowing them for BIT_NOT_EXPR and allowing for BIT_{IOR,XOR,AND}_EXPR
    leads to a match.pd maintainance nightmare (see one of the patches in the
    PR), so either we want to allow pointer operand on BIT_NOT_EXPR (but then
    we run into issues e.g. with the ranger which expects it can emulate
    BIT_NOT_EXPR ~X as - 1 - X which doesn't work for pointers which don't
    support MINUS_EXPR), or the following patch disallows pointer arguments
    for all of BIT_{IOR,XOR,AND}_EXPR with the exception of BIT_AND_EXPR
    with INTEGER_CST last operand (for simpler pointer realignment).
    I had to tweak one reassoc optimization and the two match.pd
    simplifications.
    
    2022-09-14  Jakub Jelinek  <jakub@redhat.com>
    
            PR tree-optimization/106878
            * tree-cfg.cc (verify_gimple_assign_binary): Disallow pointer,
            reference or OFFSET_TYPE BIT_IOR_EXPR, BIT_XOR_EXPR or, unless
            the second argument is INTEGER_CST, BIT_AND_EXPR.
            * match.pd ((type) X op CST -> (type) (X op ((type-x) CST)),
            (type) (((type2) X) op Y) -> (X op (type) Y)): Punt for
            POINTER_TYPE_P or OFFSET_TYPE.
            * tree-ssa-reassoc.cc (optimize_range_tests_cmp_bitwise): For
            pointers cast them to pointer sized integers first.
    
            * gcc.c-torture/compile/pr106878.c: New test.
---
 gcc/match.pd                                   |  6 +++++-
 gcc/testsuite/gcc.c-torture/compile/pr106878.c | 15 +++++++++++++++
 gcc/tree-cfg.cc                                | 20 ++++++++++++++++++--
 gcc/tree-ssa-reassoc.cc                        | 16 +++++++++++++++-
 4 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index 17318f523fb..345bcb701a5 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1763,6 +1763,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 	 && (int_fits_type_p (@1, TREE_TYPE (@0))
 	     || tree_nop_conversion_p (TREE_TYPE (@0), type)))
 	|| types_match (@0, @1))
+       && !POINTER_TYPE_P (TREE_TYPE (@0))
+       && TREE_CODE (TREE_TYPE (@0)) != OFFSET_TYPE
        /* ???  This transform conflicts with fold-const.cc doing
 	  Convert (T)(x & c) into (T)x & (T)c, if c is an integer
 	  constants (if x has signed type, the sign bit cannot be set
@@ -1799,7 +1801,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (if (GIMPLE
        && TREE_CODE (@1) != INTEGER_CST
        && tree_nop_conversion_p (type, TREE_TYPE (@2))
-       && types_match (type, @0))
+       && types_match (type, @0)
+       && !POINTER_TYPE_P (TREE_TYPE (@0))
+       && TREE_CODE (TREE_TYPE (@0)) != OFFSET_TYPE)
    (bitop @0 (convert @1)))))
 
 (for bitop (bit_and bit_ior)
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr106878.c b/gcc/testsuite/gcc.c-torture/compile/pr106878.c
new file mode 100644
index 00000000000..c8457189437
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr106878.c
@@ -0,0 +1,15 @@
+/* PR tree-optimization/106878 */
+
+typedef __INTPTR_TYPE__ intptr_t;
+typedef __UINTPTR_TYPE__ uintptr_t;
+int a;
+
+int
+foo (const int *c)
+{
+  uintptr_t d = ((intptr_t) c | (intptr_t) &a) & 65535 << 16;
+  intptr_t e = (intptr_t) c;
+  if (d != (e & 65535 << 16))
+    return 1;
+  return 0;
+}
diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
index e39d9471220..41ce1b29d17 100644
--- a/gcc/tree-cfg.cc
+++ b/gcc/tree-cfg.cc
@@ -4167,6 +4167,8 @@ verify_gimple_assign_binary (gassign *stmt)
     case ROUND_MOD_EXPR:
     case RDIV_EXPR:
     case EXACT_DIV_EXPR:
+    case BIT_IOR_EXPR:
+    case BIT_XOR_EXPR:
       /* Disallow pointer and offset types for many of the binary gimple. */
       if (POINTER_TYPE_P (lhs_type)
 	  || TREE_CODE (lhs_type) == OFFSET_TYPE)
@@ -4182,9 +4184,23 @@ verify_gimple_assign_binary (gassign *stmt)
 
     case MIN_EXPR:
     case MAX_EXPR:
-    case BIT_IOR_EXPR:
-    case BIT_XOR_EXPR:
+      /* Continue with generic binary expression handling.  */
+      break;
+
     case BIT_AND_EXPR:
+      if (POINTER_TYPE_P (lhs_type)
+	  && TREE_CODE (rhs2) == INTEGER_CST)
+	break;
+      /* Disallow pointer and offset types for many of the binary gimple. */
+      if (POINTER_TYPE_P (lhs_type)
+	  || TREE_CODE (lhs_type) == OFFSET_TYPE)
+	{
+	  error ("invalid types for %qs", code_name);
+	  debug_generic_expr (lhs_type);
+	  debug_generic_expr (rhs1_type);
+	  debug_generic_expr (rhs2_type);
+	  return true;
+	}
       /* Continue with generic binary expression handling.  */
       break;
 
diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
index e13e2cb308d..f45e552a8cc 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -3608,10 +3608,14 @@ optimize_range_tests_cmp_bitwise (enum tree_code opcode, int first, int length,
 	tree type2 = NULL_TREE;
 	bool strict_overflow_p = false;
 	candidates.truncate (0);
+	if (POINTER_TYPE_P (type1))
+	  type1 = pointer_sized_int_node;
 	for (j = i; j; j = chains[j - 1])
 	  {
 	    tree type = TREE_TYPE (ranges[j - 1].exp);
 	    strict_overflow_p |= ranges[j - 1].strict_overflow_p;
+	    if (POINTER_TYPE_P (type))
+	      type = pointer_sized_int_node;
 	    if ((b % 4) == 3)
 	      {
 		/* For the signed < 0 cases, the types should be
@@ -3642,6 +3646,8 @@ optimize_range_tests_cmp_bitwise (enum tree_code opcode, int first, int length,
 	    tree type = TREE_TYPE (ranges[j - 1].exp);
 	    if (j == k)
 	      continue;
+	    if (POINTER_TYPE_P (type))
+	      type = pointer_sized_int_node;
 	    if ((b % 4) == 3)
 	      {
 		if (!useless_type_conversion_p (type1, type))
@@ -3671,7 +3677,7 @@ optimize_range_tests_cmp_bitwise (enum tree_code opcode, int first, int length,
 		op = r->exp;
 		continue;
 	      }
-	    if (id == l)
+	    if (id == l || POINTER_TYPE_P (TREE_TYPE (op)))
 	      {
 		code = (b % 4) == 3 ? BIT_NOT_EXPR : NOP_EXPR;
 		g = gimple_build_assign (make_ssa_name (type1), code, op);
@@ -3695,6 +3701,14 @@ optimize_range_tests_cmp_bitwise (enum tree_code opcode, int first, int length,
 	    gimple_seq_add_stmt_without_update (&seq, g);
 	    op = gimple_assign_lhs (g);
 	  }
+	type1 = TREE_TYPE (ranges[k - 1].exp);
+	if (POINTER_TYPE_P (type1))
+	  {
+	    gimple *g
+	      = gimple_build_assign (make_ssa_name (type1), NOP_EXPR, op);
+	    gimple_seq_add_stmt_without_update (&seq, g);
+	    op = gimple_assign_lhs (g);
+	  }
 	candidates.pop ();
 	if (update_range_test (&ranges[k - 1], NULL, candidates.address (),
 			       candidates.length (), opcode, ops, op,
</cut>

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-09-14 21:04 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-14 21:04 [TCWG CI] Failure after basepoints/gcc-13-2658-g645ef01a463: Disallow pointer operands for |, ^ and partly & [PR106878] ci_notify

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).