Summary: | [4.3 Regression] Wrong code with struct return | ||
---|---|---|---|
Product: | gcc | Reporter: | Richard Biener <rguenth> |
Component: | tree-optimization | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | cnstar9988, fang, gcc-bugs, icera-sdkteam-gnu, ramana.r |
Priority: | P2 | Keywords: | alias, wrong-code |
Version: | 4.3.1 | ||
Target Milestone: | 4.4.0 | ||
Host: | Target: | ||
Build: | Known to work: | 4.1.2 4.4.0 | |
Known to fail: | 4.3.4 | Last reconfirmed: | 2008-05-29 15:07:30 |
Description
Richard Biener
2008-05-29 15:06:06 UTC
Mine. First we miss the constraint f = &ANYTHING from f = bar (&b); but then we also do not handle at all the case of escaping pointers through by-value passed structures foo (f); and thus we end up not clobbering b for that call. The first part is easy to fix. I have to think about the second one ... I have a patch. Umm. It's worse. With -O2 -fno-tree-sra: extern void abort (void); struct Foo { int *p; } x; struct Foo __attribute__((noinline)) bar(int *p) { struct Foo f; f.p = p; return f; } void __attribute__((noinline)) foo() { *x.p = 0; } int main() { int b; b = 1; struct Foo g = bar (&b); x = g; foo(); if (b != 0) abort (); return 0; } the escape through the global x doesn't work either. SRA "fixes" this by # g_7 = VDEF <g_6(D)> g = bar (&b); # VUSE <g_7> g$p_2 = g.p; # x_9 = VDEF <x_8(D)> x.p = g$p_2; where we (after partial fixes) compute the points-to set of g$p_2 correctly and thus mark that pointer as escaping to a global in the next stmt. ping... Subject: Bug 36373 Author: rguenth Date: Fri Jun 27 18:53:43 2008 New Revision: 137197 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=137197 Log: 2008-06-27 Richard Guenther <rguenther@suse.de> PR tree-optimization/36400 PR tree-optimization/36373 PR tree-optimization/36344 * tree-ssa-structalias.c (var_escaped, escaped_tree, escaped_id, var_nonlocal, nonlocal_tree, nonlocal_id): New globals (update_alias_info): Remove call clobbering code. (make_constraint_to): New helper function. (make_escape_constraint): Likewise. (handle_rhs_call): Use it on all pointer containing arguments. Also mark the static chain escaped. (handle_lhs_call): Make constraints from NONLOCAL and ESCAPED instead of ANYTHING. (make_constraint_from): New helper split out from ... (make_constraint_from_anything): ... here. (find_func_aliases): Add constraints for escape sites. (intra_create_variable_infos): Make constraints from NONLOCAL for parameters. (find_what_p_points_to): Interpret NONLOCAL and ESCAPED the same as ANYTHING. (clobber_what_p_points_to): Remove. (clobber_what_escaped): New function. (init_base_vars): Init NONLOCAL and ESCAPED. (do_sd_constraint): Do not propagate the solution from ESCAPED but use ESCAPED as a placeholder. (solve_graph): Likewise. * tree-flow.h (clobber_what_p_points_to): Remove. (clobber_what_escaped): Declare. * tree-ssa-alias.c (set_initial_properties): Call it. Remove code clobbering escaped pointers. * gcc.dg/torture/pr36373-1.c: New testcase. * gcc.dg/torture/pr36373-2.c: Likewise. * gcc.dg/torture/pr36373-3.c: Likewise. * gcc.dg/torture/pr36373-4.c: Likewise. * gcc.dg/torture/pr36373-5.c: Likewise. * gcc.dg/torture/pr36373-6.c: Likewise. * gcc.dg/torture/pr36373-7.c: Likewise. * gcc.dg/torture/pr36373-8.c: Likewise. * gcc.dg/torture/pr36373-9.c: Likewise. * gcc.dg/torture/pr36373-10.c: Likewise. * gcc.dg/torture/pr36400.c: Likewise. * gcc.c-torture/execute/pta-field-1.c: Likewise. * gcc.c-torture/execute/pta-field-2.c: Likewise. * gcc.dg/tree-ssa/loadpre8.c: Remove XFAIL. * gcc.dg/tree-ssa/pr24287.c: XFAIL. Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pr24287.c trunk/gcc/tree-flow.h trunk/gcc/tree-ssa-alias.c trunk/gcc/tree-ssa-structalias.c Subject: Bug 36373 Author: rguenth Date: Fri Jun 27 21:54:42 2008 New Revision: 137204 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=137204 Log: 2008-06-27 Richard Guenther <rguenther@suse.de> PR tree-optimization/36400 PR tree-optimization/36373 PR tree-optimization/36344 * tree-ssa-structalias.c (var_escaped, escaped_tree, escaped_id, var_nonlocal, nonlocal_tree, nonlocal_id): New globals (update_alias_info): Remove call clobbering code. (make_constraint_to): New helper function. (make_escape_constraint): Likewise. (handle_rhs_call): Use it on all pointer containing arguments. Also mark the static chain escaped. (handle_lhs_call): Make constraints from NONLOCAL and ESCAPED instead of ANYTHING. (make_constraint_from): New helper split out from ... (make_constraint_from_anything): ... here. (find_func_aliases): Add constraints for escape sites. (intra_create_variable_infos): Make constraints from NONLOCAL for parameters. (find_what_p_points_to): Interpret NONLOCAL and ESCAPED the same as ANYTHING. (clobber_what_p_points_to): Remove. (clobber_what_escaped): New function. (init_base_vars): Init NONLOCAL and ESCAPED. (do_sd_constraint): Do not propagate the solution from ESCAPED but use ESCAPED as a placeholder. (solve_graph): Likewise. * tree-flow.h (clobber_what_p_points_to): Remove. (clobber_what_escaped): Declare. * tree-ssa-alias.c (set_initial_properties): Call it. Remove code clobbering escaped pointers. * gcc.dg/torture/pr36373-1.c: New testcase. * gcc.dg/torture/pr36373-2.c: Likewise. * gcc.dg/torture/pr36373-3.c: Likewise. * gcc.dg/torture/pr36373-4.c: Likewise. * gcc.dg/torture/pr36373-5.c: Likewise. * gcc.dg/torture/pr36373-6.c: Likewise. * gcc.dg/torture/pr36373-7.c: Likewise. * gcc.dg/torture/pr36373-8.c: Likewise. * gcc.dg/torture/pr36373-9.c: Likewise. * gcc.dg/torture/pr36373-10.c: Likewise. * gcc.dg/torture/pr36400.c: Likewise. * gcc.c-torture/execute/pta-field-1.c: Likewise. * gcc.c-torture/execute/pta-field-2.c: Likewise. * gcc.dg/tree-ssa/loadpre8.c: Remove XFAIL. * gcc.dg/tree-ssa/pr24287.c: XFAIL. Added: trunk/gcc/testsuite/gcc.c-torture/execute/pta-field-1.c trunk/gcc/testsuite/gcc.c-torture/execute/pta-field-2.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-1.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-10.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-2.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-3.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-4.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-5.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-6.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-7.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-8.c trunk/gcc/testsuite/gcc.dg/torture/pr36373-9.c trunk/gcc/testsuite/gcc.dg/torture/pr36400.c Fixed for 4.4.0. Downgrading to P2, as the required changes are probably too big and risky for the branches. Change CC addresses I have no plans to fix this on the branches. Closing 4.2 branch. WONTFIX for 4.3. Alias fixes are considered too risky at this stage. |