aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.cc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-12-12 08:56:41 +0100
committerRichard Biener <rguenther@suse.de>2022-12-12 09:50:29 +0100
commit49bf49bb6174734879adcba7fb340c1c8f5dd253 (patch)
tree190d2ed74771c42335ffcadd58ede29f64f030ea /gcc/fold-const.cc
parent2dc5d6b1e7ec8822f5bd78761962ca2c85d4a2b4 (diff)
downloadgcc-49bf49bb6174734879adcba7fb340c1c8f5dd253.zip
gcc-49bf49bb6174734879adcba7fb340c1c8f5dd253.tar.gz
gcc-49bf49bb6174734879adcba7fb340c1c8f5dd253.tar.bz2
Revert parts of ADDR_EXPR/CONSTRUCTOR treatment change in match.pd
This reverts the part that substitutes from the definition of an SSA name to the capture, thus ADDR_EXPR@0 eventually yielding &y_1->a[i_2] instead of _3. That's because I didn't think of how to deal with substituting @0 in the result pattern. So the following re-instantiates the SSA def CONSTRUCTOR handling and in the ADDR_EXPR helpers used by match.pd handles SSA names defined to ADDR_EXPRs transparently. * genmatch.cc (dt_simplify::gen): Revert last change. * match.pd: Revert simplification of CONSTUCTOR leaf handling. (&x cmp SSA_NAME): Handle ADDR_EXPR in SSA defs. * fold-const.cc (split_address_to_core_and_offset): Handle ADDR_EXPRs in SSA defs. (address_compare): Likewise.
Diffstat (limited to 'gcc/fold-const.cc')
-rw-r--r--gcc/fold-const.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index e80be80..e4c43fb 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -16344,6 +16344,11 @@ split_address_to_core_and_offset (tree exp,
poly_int64 bitsize;
location_t loc = EXPR_LOCATION (exp);
+ if (TREE_CODE (exp) == SSA_NAME)
+ if (gassign *def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (exp)))
+ if (gimple_assign_rhs_code (def) == ADDR_EXPR)
+ exp = gimple_assign_rhs1 (def);
+
if (TREE_CODE (exp) == ADDR_EXPR)
{
core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
@@ -16628,6 +16633,10 @@ address_compare (tree_code code, tree type, tree op0, tree op1,
tree &base0, tree &base1, poly_int64 &off0, poly_int64 &off1,
bool generic)
{
+ if (TREE_CODE (op0) == SSA_NAME)
+ op0 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op0));
+ if (TREE_CODE (op1) == SSA_NAME)
+ op1 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op1));
gcc_checking_assert (TREE_CODE (op0) == ADDR_EXPR);
gcc_checking_assert (TREE_CODE (op1) == ADDR_EXPR);
base0 = get_addr_base_and_unit_offset (TREE_OPERAND (op0, 0), &off0);