diff options
author | Richard Biener <rguenther@suse.de> | 2022-12-12 08:56:41 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-12-12 09:50:29 +0100 |
commit | 49bf49bb6174734879adcba7fb340c1c8f5dd253 (patch) | |
tree | 190d2ed74771c42335ffcadd58ede29f64f030ea /gcc/fold-const.cc | |
parent | 2dc5d6b1e7ec8822f5bd78761962ca2c85d4a2b4 (diff) | |
download | gcc-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.cc | 9 |
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); |