This avoids using build_ref_for_offset and build_fold_addr_expr
where type mixup easily results in something not IP invariant.

Bootstrap and regtest on x86_64-unknown-linux-gnu in progress.

Richard.

2020-03-19  Richard Biener  <rguent...@suse.de>

        PR ipa/94217
        * ipa-cp.c (ipa_get_jf_ancestor_result): Avoid build_fold_addr_expr
        and build_ref_for_offset.
---
 gcc/ipa-cp.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 27c020b8199..1c17010e369 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -1352,11 +1352,13 @@ ipa_get_jf_ancestor_result (struct ipa_jump_func 
*jfunc, tree input)
   gcc_checking_assert (TREE_CODE (input) != TREE_BINFO);
   if (TREE_CODE (input) == ADDR_EXPR)
     {
-      tree t = TREE_OPERAND (input, 0);
-      t = build_ref_for_offset (EXPR_LOCATION (t), t,
-                               ipa_get_jf_ancestor_offset (jfunc), false,
-                               ptr_type_node, NULL, false);
-      return build_fold_addr_expr (t);
+      gcc_checking_assert (is_gimple_ip_invariant_address (input));
+      poly_int64 off = ipa_get_jf_ancestor_offset (jfunc);
+      if (known_eq (off, 0))
+       return input;
+      return build1 (ADDR_EXPR, TREE_TYPE (input),
+                    fold_build2 (MEM_REF, TREE_TYPE (TREE_TYPE (input)),
+                                 input, build_int_cst (ptr_type_node, off)));
     }
   else
     return NULL_TREE;
-- 
2.16.4

Reply via email to