[PATCH] Fix PR48134
Richard Guenther
rguenther@suse.de
Thu Mar 17 14:56:00 GMT 2011
This fixes PR48134, when propagating into debug-stmts we should fold
them, like we do elsewhere.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2011-03-17 Richard Guenther <rguenther@suse.de>
PR middle-end/48134
* tree-ssa.c (insert_debug_temp_for_var_def): If we propagated
a value make sure to fold the statement.
* gcc.dg/pr48134.c: New testcase.
Index: gcc/tree-ssa.c
===================================================================
*** gcc/tree-ssa.c (revision 171086)
--- gcc/tree-ssa.c (working copy)
*************** insert_debug_temp_for_var_def (gimple_st
*** 455,467 ****
continue;
if (value)
! FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
! /* unshare_expr is not needed here. vexpr is either a
! SINGLE_RHS, that can be safely shared, some other RHS
! that was unshared when we found it had a single debug
! use, or a DEBUG_EXPR_DECL, that can be safely
! shared. */
! SET_USE (use_p, value);
else
gimple_debug_bind_reset_value (stmt);
--- 455,473 ----
continue;
if (value)
! {
! FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
! /* unshare_expr is not needed here. vexpr is either a
! SINGLE_RHS, that can be safely shared, some other RHS
! that was unshared when we found it had a single debug
! use, or a DEBUG_EXPR_DECL, that can be safely
! shared. */
! SET_USE (use_p, value);
! /* If we didn't replace uses with a debug decl fold the
! resulting expression. Otherwise we end up with invalid IL. */
! if (TREE_CODE (value) != DEBUG_EXPR_DECL)
! fold_stmt_inplace (stmt);
! }
else
gimple_debug_bind_reset_value (stmt);
Index: gcc/testsuite/gcc.dg/pr48134.c
===================================================================
*** gcc/testsuite/gcc.dg/pr48134.c (revision 0)
--- gcc/testsuite/gcc.dg/pr48134.c (revision 0)
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fstack-check=specific -fno-tree-dse -fno-tree-fre -fno-tree-loop-optimize -g" } */
+
+ struct S
+ {
+ int w, z;
+ };
+ struct T
+ {
+ struct S s;
+ };
+
+ int i;
+
+ static inline struct S
+ bar (struct S x)
+ {
+ i++;
+ return x;
+ }
+
+ int
+ foo (struct T t, struct S s)
+ {
+ struct S *c = &s;
+ if (i)
+ c = &t.s;
+ t.s.w = 3;
+ s = bar (*c);
+ return t.s.w;
+ }
More information about the Gcc-patches
mailing list