Commit 20770eb8 by Richard Biener Committed by Richard Biener

re PR tree-optimization/78218 (wrong code at -Os and above on x86_64-linux-gnu…

re PR tree-optimization/78218 (wrong code at -Os and above on x86_64-linux-gnu (in both 32-bit and 64-bit modes))

2016-11-07  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/78218
	* gimple-ssa-store-merging.c
	(pass_store_merging::terminate_all_aliasing_chains):
	Drop unused argument, fix alias check to also consider uses.
	(pass_store_merging::execute): Adjust.

	* gcc.dg/torture/pr78218.c: New testcase.

From-SVN: r241900
parent 32894793
2016-11-07 Richard Biener <rguenther@suse.de> 2016-11-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/78218
* gimple-ssa-store-merging.c
(pass_store_merging::terminate_all_aliasing_chains):
Drop unused argument, fix alias check to also consider uses.
(pass_store_merging::execute): Adjust.
2016-11-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/78228 PR tree-optimization/78228
* tree-ssa-phiopt.c (abs_replacement): Avoid introducing * tree-ssa-phiopt.c (abs_replacement): Avoid introducing
undefined behavior. undefined behavior.
...@@ -726,7 +726,7 @@ private: ...@@ -726,7 +726,7 @@ private:
hash_map<tree_operand_hash, struct imm_store_chain_info *> m_stores; hash_map<tree_operand_hash, struct imm_store_chain_info *> m_stores;
bool terminate_and_process_all_chains (); bool terminate_and_process_all_chains ();
bool terminate_all_aliasing_chains (tree, imm_store_chain_info **, bool terminate_all_aliasing_chains (imm_store_chain_info **,
bool, gimple *); bool, gimple *);
bool terminate_and_release_chain (imm_store_chain_info *); bool terminate_and_release_chain (imm_store_chain_info *);
}; // class pass_store_merging }; // class pass_store_merging
...@@ -755,8 +755,7 @@ pass_store_merging::terminate_and_process_all_chains () ...@@ -755,8 +755,7 @@ pass_store_merging::terminate_and_process_all_chains ()
If that is the case we have to terminate any chain anchored at BASE. */ If that is the case we have to terminate any chain anchored at BASE. */
bool bool
pass_store_merging::terminate_all_aliasing_chains (tree dest, pass_store_merging::terminate_all_aliasing_chains (imm_store_chain_info
imm_store_chain_info
**chain_info, **chain_info,
bool var_offset_p, bool var_offset_p,
gimple *stmt) gimple *stmt)
...@@ -788,7 +787,10 @@ pass_store_merging::terminate_all_aliasing_chains (tree dest, ...@@ -788,7 +787,10 @@ pass_store_merging::terminate_all_aliasing_chains (tree dest,
unsigned int i; unsigned int i;
FOR_EACH_VEC_ELT ((*chain_info)->m_store_info, i, info) FOR_EACH_VEC_ELT ((*chain_info)->m_store_info, i, info)
{ {
if (stmt_may_clobber_ref_p (info->stmt, dest)) if (ref_maybe_used_by_stmt_p (stmt,
gimple_assign_lhs (info->stmt))
|| stmt_may_clobber_ref_p (stmt,
gimple_assign_lhs (info->stmt)))
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
...@@ -1458,7 +1460,7 @@ pass_store_merging::execute (function *fun) ...@@ -1458,7 +1460,7 @@ pass_store_merging::execute (function *fun)
} }
/* Store aliases any existing chain? */ /* Store aliases any existing chain? */
terminate_all_aliasing_chains (lhs, chain_info, false, stmt); terminate_all_aliasing_chains (chain_info, false, stmt);
/* Start a new chain. */ /* Start a new chain. */
struct imm_store_chain_info *new_chain struct imm_store_chain_info *new_chain
= new imm_store_chain_info (base_addr); = new imm_store_chain_info (base_addr);
...@@ -1477,13 +1479,13 @@ pass_store_merging::execute (function *fun) ...@@ -1477,13 +1479,13 @@ pass_store_merging::execute (function *fun)
} }
} }
else else
terminate_all_aliasing_chains (lhs, chain_info, terminate_all_aliasing_chains (chain_info,
offset != NULL_TREE, stmt); offset != NULL_TREE, stmt);
continue; continue;
} }
terminate_all_aliasing_chains (NULL_TREE, NULL, false, stmt); terminate_all_aliasing_chains (NULL, false, stmt);
} }
terminate_and_process_all_chains (); terminate_and_process_all_chains ();
} }
......
2016-11-07 Richard Biener <rguenther@suse.de> 2016-11-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/78218
* gcc.dg/torture/pr78218.c: New testcase.
2016-11-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/78228 PR tree-optimization/78228
* gcc.dg/tree-ssa/phi-opt-15.c: New testcase. * gcc.dg/tree-ssa/phi-opt-15.c: New testcase.
......
/* { dg-do run } */
struct
{
int v;
} a[2];
int b;
void __attribute__((noinline,noclone))
check ()
{
if (a[0].v != 1)
__builtin_abort ();
}
int main ()
{
a[1].v = 1;
a[0] = a[1];
a[1].v = 0;
check (a);
return 0;
}
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