Bug 35287 - Missing PRE for indirect load
Summary: Missing PRE for indirect load
Status: RESOLVED DUPLICATE of bug 23455
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.3.0
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: missed-optimization
Depends on:
Blocks:
 
Reported: 2008-02-22 06:30 UTC by davidxl
Modified: 2008-04-07 01:46 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2008-02-22 10:57:57


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description davidxl 2008-02-22 06:30:14 UTC
Daniel is aware of the problem.

In the followign example, *gp at return is partially redundant. Not eliminated.

int *gp;
int g, g2;
int foo(int p)
{
   int t = 0;
   if (p)
      t = *gp + 1;

   return (*gp + t);
}
Comment 1 Richard Biener 2008-02-22 10:57:57 UTC
Confirmed.  I think this is the same issue as PRE of globals.
Comment 2 Andrew Pinski 2008-04-07 01:46:50 UTC
(In reply to comment #1)
> Confirmed.  I think this is the same issue as PRE of globals.

It is as if you change the source to be:
int g, g2;
int foo(int p, int *gp)
{
   int t = 0;
   if (p)
      t = *gp + 1;

   return (*gp + t);
}
--- CUT ---
We get the correct optimization:
foo (p, gp)
{
  int prephitmp.9;
  int t;

<bb 2>:
  if (p != 0)
    goto <bb 4>;
  else
    goto <bb 3>;

<bb 3>:
  prephitmp.9 = *gp;
  t = 0;
  goto <bb 5>;

<bb 4>:
  prephitmp.9 = *gp;
  t = prephitmp.9 + 1;

<bb 5>:
  return prephitmp.9 + t;

}


*** This bug has been marked as a duplicate of 23455 ***
Comment 3 Daniel Berlin 2008-07-08 16:11:58 UTC
Subject: Bug 35287

Author: dberlin
Date: Tue Jul  8 16:11:06 2008
New Revision: 137631

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=137631
Log:
2008-07-05  Daniel Berlin  <dberlin@dberlin.org>
	
	Fix PR tree-optimization/23455
	Fix PR tree-optimization/35286
	Fix PR tree-optimization/35287
	* Makefile.in (OBJS-common): Remove tree-vn.o.
	tree-vn.o: Remove.
	* dbgcnt.def: Add treepre_insert debug counter.
	* gcc/tree-flow.h (add_to_value): Updated for other changes.
	(debug_value_expressions): Ditto.
	(print_value_expressions): Ditto.
	* tree-pretty-print.c (dump_generic_node): Updated for
	VALUE_HANDLE removal.
	* tree-ssa-dom.c (record_equality): Ditto.
	(cprop_operand): Ditto.
	(lookup_avail_expr): Ditto.
	* tree-ssa-threadedge.c
	(record_temporary_equivalences_from_stmts_at_dest): Ditto.
	(simplify_control_stmt_condition): Ditto.
	* tree.c (tree_code_size): Ditto.
	(tree_node_structure): Ditto.
	(iterative_hash_expr): Ditto.
	* tree.def: Ditto.
	* tree.h (VALUE_HANDLE_ID): Ditto.
	(VALUE_HANDLE_EXPR_SET): Ditto.
	(struct tree_value_handle): Ditto.
	(union tree_node): Ditto.
	* treestruct.def: Ditto.
	* tree-vn.c: Removed.
	* tree-ssa-pre.c: Rewritten entirely.
	* tree-ssa-sccvn.c (constant_to_value_id): New hashtable.
	(constant_value_ids): Ditto.
	(vn_nary_op_t): Moved to header.
	(vn_phi_t): Ditto.
	(vn_reference_op_t): Ditto
	(vn_reference_t): Ditto.
	(next_value_id): New variable.
	(VN_INFO): Add an assert.
	(vn_constant_eq): New function.
	(vn_constant_hash): Ditto.
	(get_or_alloc_constant_value_id): Ditto.
	(value_id_constant_p): Ditto.
	(vn_reference_compute_hash): De-staticify.
	(copy_reference_ops_from_ref): Don't use get_callee_fndecl.
	Disable some code with a FIXME.
	Remove VALUE_HANDLE use.
	(valueize_refs): Update opcode if it changes from ssa name to
	constant.
	(vn_reference_lookup_1): Add new argument.
	(vn_reference_lookup):  Ditto.
	(vn_reference_lookup_pieces): New function.
	(vn_reference_insert): Add return type. Modify to deal with value
	ids.
	(vn_reference_insert_pieces):  New function.
	(vn_nary_op_compute_hash): De-staticify.
	(vn_nary_op_eq): Ditto.
	(vn_nary_op_lookup_pieces): New function.
	(vn_nary_op_lookup): Add new argument.  
	(vn_nary_op_insert_pieces): New function.
	(vn_nary_op_insert): Add return type. Modify to deal with value
	ids.
	(vn_phi_insert): Ditto.
	(visit_unary_op): Update for callee changes.
	(visit_binary_op): Ditto.
	(visit_reference_op_load): Ditto.
	(visit_reference_op_store): Ditto.
	(init_scc_vn): Init next_value_id, constant_to_value_id and
	constant_value_ids. 
	(free_scc_vn): Free them.
	(set_hashtable_value_ids): New function.
	(run_scc_vn): Use it.
	(get_max_value_id): New function.
	(get_next_value_id): Ditto.
	(expressions_equal_p): Moved from tree-vn.c
	(sort_vuses): Ditto.
	(sort_vuses_heap): Ditto.
	* tree-ssa-sccvn.h: Structures moved from tree-ssa-sccvn.c (noted
	above).
	* tree.c (iterative_hash_hashval_t): Made non-static
	* tree.h (iterative_hash_hashval_t): Declare it.


Added:
    trunk/gcc/testsuite/gcc.c-torture/compile/20080704-1.c
    trunk/gcc/testsuite/gcc.dg/tree-ssa/pr23455.c
    trunk/gcc/testsuite/gcc.dg/tree-ssa/pr35286.c
    trunk/gcc/testsuite/gcc.dg/tree-ssa/pr35287.c
Removed:
    trunk/gcc/tree-vn.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/Makefile.in
    trunk/gcc/dbgcnt.def
    trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre24.c
    trunk/gcc/tree-flow.h
    trunk/gcc/tree-pretty-print.c
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-pre.c
    trunk/gcc/tree-ssa-sccvn.c
    trunk/gcc/tree-ssa-sccvn.h
    trunk/gcc/tree-ssa-threadedge.c
    trunk/gcc/tree.c
    trunk/gcc/tree.def
    trunk/gcc/tree.h
    trunk/gcc/treestruct.def