Commit 7e64ef0d by Richard Biener

tree-optimization/95308 - really avoid forward propagating of &TMR

This fixes a hole that still allowed forwarding of TARGET_MEM_REF
addresses.

2020-05-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/95308
	* tree-ssa-forwprop.c (pass_forwprop::execute): Generalize
	test for TARGET_MEM_REFs.

	* g++.dg/torture/pr95308.C: New testcase.
parent cc08609b
// { dg-do compile }
// { dg-additional-options "-march=skylake-avx512" { target x86_64-*-* i?86-*-* } }
extern int a[][18];
extern short b[], c[];
extern char d[][18];
int e;
void i(char f, long g[][100][100][100])
{
for (int h = 0;; h += 2)
for (char j = 0; j < 17; j++) {
if (e ? f : 0) {
a[h][j] = 5;
for (int k = 0; k < 12; k += 4)
for (short l = 0; l < 015; l += 2)
b[k * 3 + l] = bool(g[2][j][k][l]);
} else
d[h][j] = 0;
c[j] = 3;
}
}
......@@ -2771,18 +2771,18 @@ pass_forwprop::execute (function *fun)
/* If this statement sets an SSA_NAME to an address,
try to propagate the address into the uses of the SSA_NAME. */
if (code == ADDR_EXPR
if ((code == ADDR_EXPR
/* Handle pointer conversions on invariant addresses
as well, as this is valid gimple. */
|| (CONVERT_EXPR_CODE_P (code)
&& TREE_CODE (rhs) == ADDR_EXPR
&& POINTER_TYPE_P (TREE_TYPE (lhs))))
&& TREE_CODE (TREE_OPERAND (rhs, 0)) != TARGET_MEM_REF)
{
tree base = get_base_address (TREE_OPERAND (rhs, 0));
if ((!base
|| !DECL_P (base)
|| decl_address_invariant_p (base))
&& TREE_CODE (base) != TARGET_MEM_REF
&& !stmt_references_abnormal_ssa_name (stmt)
&& forward_propagate_addr_expr (lhs, rhs, true))
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment