This avoids adding a copy from an abnormal picked up from PHI
translation much like we'd avoid inserting the translated
expression on pred edges.
2021-07-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/101394
* tree-ssa-pre.c (do_pre_regular_insertion): Avoid inserting
copies from abnormals for a full redundancy.
* gcc.dg/torture/pr101394.c: New testcase.
--- /dev/null
+/* { dg-do compile } */
+
+int a, b, c, d;
+void h();
+int e() __attribute__((returns_twice));
+void f() {
+ int *g = (int *)(__INTPTR_TYPE__)c;
+ if (b) {
+ h();
+ g--;
+ if (a)
+ if (d)
+ h();
+ }
+ if (g++)
+ e();
+ c = (__INTPTR_TYPE__)g;
+}
/* If all edges produce the same value and that value is
an invariant, then the PHI has the same value on all
edges. Note this. */
- else if (!cant_insert && all_same)
+ else if (!cant_insert
+ && all_same
+ && (edoubleprime->kind != NAME
+ || !SSA_NAME_OCCURS_IN_ABNORMAL_PHI
+ (PRE_EXPR_NAME (edoubleprime))))
{
gcc_assert (edoubleprime->kind == CONSTANT
|| edoubleprime->kind == NAME);