new file mode 100644
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+/* IPA PTA disables local PTA recompute after IPA. */
+/* { dg-additional-options "-fipa-pta" } */
+
+int a, c, d;
+static int b;
+int main()
+{
+ int *e = &a, **f = &e;
+ while (1) {
+ int **g, ***h = &f;
+ if (c)
+ *g = e;
+ else if (!b)
+ break;
+ *e = **g;
+ e = &d;
+ }
+ if (e != &a)
+ __builtin_abort();
+ return 0;
+}
@@ -775,25 +775,19 @@ duplicate_ssa_name_range_info (tree name, tree src)
void
maybe_duplicate_ssa_info_at_copy (tree dest, tree src)
{
+ /* While points-to info is flow-insensitive we have to avoid copying
+ info from not executed regions invoking UB to dominating defs. */
+ if (gimple_bb (SSA_NAME_DEF_STMT (src))
+ != gimple_bb (SSA_NAME_DEF_STMT (dest)))
+ return;
+
if (POINTER_TYPE_P (TREE_TYPE (dest))
&& SSA_NAME_PTR_INFO (dest)
&& ! SSA_NAME_PTR_INFO (src))
- {
- duplicate_ssa_name_ptr_info (src, SSA_NAME_PTR_INFO (dest));
- /* Points-to information is cfg insensitive,
- but VRP might record context sensitive alignment
- info, non-nullness, etc. So reset context sensitive
- info if the two SSA_NAMEs aren't defined in the same
- basic block. */
- if (gimple_bb (SSA_NAME_DEF_STMT (src))
- != gimple_bb (SSA_NAME_DEF_STMT (dest)))
- reset_flow_sensitive_info (src);
- }
+ duplicate_ssa_name_ptr_info (src, SSA_NAME_PTR_INFO (dest));
else if (INTEGRAL_TYPE_P (TREE_TYPE (dest))
&& SSA_NAME_RANGE_INFO (dest)
- && ! SSA_NAME_RANGE_INFO (src)
- && (gimple_bb (SSA_NAME_DEF_STMT (src))
- == gimple_bb (SSA_NAME_DEF_STMT (dest))))
+ && ! SSA_NAME_RANGE_INFO (src))
duplicate_ssa_name_range_info (src, dest);
}