157 lines
5.4 KiB
Diff
157 lines
5.4 KiB
Diff
|
|
From 3b109376d057342a31267ea4c9bd422d940874cb Mon Sep 17 00:00:00 2001
|
||
|
|
From: Jakub Jelinek <jakub@redhat.com>
|
||
|
|
Date: Thu, 31 Oct 2024 16:09:43 +0800
|
||
|
|
Subject: [PATCH 2/6] [Backport]Disallow pointer operands for |,^ and partly
|
||
|
|
&[PR106878]
|
||
|
|
|
||
|
|
Signed-off-by: Jakub Jelinek <jakub@redhat.com>
|
||
|
|
---
|
||
|
|
gcc/match.pd | 6 ++++-
|
||
|
|
.../gcc.c-torture/compile/pr106878.c | 15 +++++++++++++
|
||
|
|
gcc/tree-cfg.cc | 22 ++++++++++++++++---
|
||
|
|
gcc/tree-ssa-reassoc.cc | 16 +++++++++++++-
|
||
|
|
4 files changed, 54 insertions(+), 5 deletions(-)
|
||
|
|
create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr106878.c
|
||
|
|
|
||
|
|
diff --git a/gcc/match.pd b/gcc/match.pd
|
||
|
|
index 8f41c292f..822e065e8 100644
|
||
|
|
--- a/gcc/match.pd
|
||
|
|
+++ b/gcc/match.pd
|
||
|
|
@@ -1655,6 +1655,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
|
||
|
|
@@ -1691,7 +1693,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 000000000..c84571894
|
||
|
|
--- /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 48b52f785..d33aaec8c 100644
|
||
|
|
--- a/gcc/tree-cfg.cc
|
||
|
|
+++ b/gcc/tree-cfg.cc
|
||
|
|
@@ -4163,7 +4163,9 @@ verify_gimple_assign_binary (gassign *stmt)
|
||
|
|
case ROUND_MOD_EXPR:
|
||
|
|
case RDIV_EXPR:
|
||
|
|
case EXACT_DIV_EXPR:
|
||
|
|
- /* Disallow pointer and offset types for many of the binary gimple. */
|
||
|
|
+ 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)
|
||
|
|
{
|
||
|
|
@@ -4178,9 +4180,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 e3d521e32..6baef4764 100644
|
||
|
|
--- a/gcc/tree-ssa-reassoc.cc
|
||
|
|
+++ b/gcc/tree-ssa-reassoc.cc
|
||
|
|
@@ -3617,10 +3617,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
|
||
|
|
@@ -3651,6 +3655,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))
|
||
|
|
@@ -3680,7 +3686,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);
|
||
|
|
@@ -3704,6 +3710,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,
|
||
|
|
--
|
||
|
|
2.33.0
|
||
|
|
|