+2020-04-25 Jakub Jelinek <jakub@redhat.com>
+ Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/94734
+ PR tree-optimization/89430
+ * tree-ssa-phiopt.c: Include tree-eh.h.
+ (cond_store_replacement): Return false if an automatic variable
+ access could trap. If -fstore-data-races, don't return false
+ just because an automatic variable is addressable.
+
2020-04-24 Andrew Stubbs <ams@codesourcery.com>
* config/gcn/gcn-valu.md (add<mode>_zext_dup2_exec): Fix merge
+2020-04-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/94734
+ PR tree-optimization/89430
+ * gcc.dg/tree-ssa/pr89430-1.c: Add xfail.
+ * gcc.dg/tree-ssa/pr89430-2.c: Add xfail.
+ * gcc.dg/tree-ssa/pr89430-5.c: Add xfail.
+ * gcc.dg/tree-ssa/pr89430-6.c: Add xfail.
+ * gcc.c-torture/execute/pr94734.c: New test.
+
2020-04-24 Jakub Jelinek <jakub@redhat.com>
PR c++/94383
--- /dev/null
+/* PR tree-optimization/94734 */
+
+__attribute__((noipa)) int
+foo (int n)
+{
+ int arr[16], s = 0;
+ for (int i = 0; i < n; i++)
+ {
+ if (i < 16)
+ arr[i] = i;
+ }
+ for (int i = 0; i < 16; i++)
+ s += arr[i];
+ return s;
+}
+
+__attribute__((noipa)) int
+bar (int n, int x, unsigned long y, unsigned long z)
+{
+ int arr[16], s = 0;
+ arr[4] = 42;
+ for (int i = 0; i < n; i++)
+ {
+ if (x == (i & 0x25))
+ arr[y] = i;
+ }
+ return arr[z];
+}
+
+__attribute__((noipa)) int
+baz (int n, int x, unsigned long z)
+{
+ int arr[16], s = 0;
+ arr[12] = 42;
+ for (int i = 0; i < n; i++)
+ {
+ if (x == (i & 0x25))
+ arr[7] = i;
+ }
+ return arr[z];
+}
+
+int
+main ()
+{
+ if (foo (10374) != 15 * 16 / 2)
+ __builtin_abort ();
+ if (bar (25, 0x25, (unsigned long) 0xdeadbeefbeefdeadULL, 4) != 42)
+ __builtin_abort ();
+ if (bar (25, 4, 15, 15) != 22)
+ __builtin_abort ();
+ if (baz (25, 0x25, 12) != 42)
+ __builtin_abort ();
+ if (baz (25, 4, 7) != 22)
+ __builtin_abort ();
+ if (baz (25, 4, 12) != 42)
+ __builtin_abort ();
+ return 0;
+}
return a[0]+a[1];
}
-/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */
+/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" { xfail *-*-* } } } */
return a[0]+a[1];
}
-/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */
+/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" { xfail *-*-* } } } */
return a.data[0] + a.data[1];
}
-/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */
+/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" { xfail *-*-* } } } */
return a.data[0].x + a.data[1].x;
}
-/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */
+/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" { xfail *-*-* } } } */
#include "tree-scalar-evolution.h"
#include "tree-inline.h"
#include "case-cfn-macros.h"
+#include "tree-eh.h"
static unsigned int tree_ssa_phiopt_worker (bool, bool, bool);
static bool two_value_replacement (basic_block, basic_block, edge, gphi *,
whose value is not available readily, which we want to avoid. */
if (!nontrap->contains (lhs))
{
- /* If LHS is a local variable without address-taken, we could
+ /* If LHS is an access to a local variable without address-taken
+ (or when we allow data races) and known not to trap, we could
always safely move down the store. */
tree base = get_base_address (lhs);
- if (!auto_var_p (base) || TREE_ADDRESSABLE (base))
+ if (!auto_var_p (base)
+ || (TREE_ADDRESSABLE (base) && !flag_store_data_races)
+ || tree_could_trap_p (lhs))
return false;
}