http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53908
Bug #: 53908 Summary: [4.7 Regression] csa removes needed memory load Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: h...@gcc.gnu.org Host: x86_64-linux Target: x86_64-linux-gnu, cris-axis-elf, crisv32-axis-linux-gnu Created attachment 27768 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=27768 Repeat with e.g. cc1 -O2 ba2.c Observed with gcc-4_7-branch revision 189394. The attached test-case calls is_basic(user_name) < 0 && is_digest(user_name) < 0 with *user_name = NULL. The call to is_basic "fails"; returns < 0 without writing to *user_name. The call to is_digest is successful and furthermore writes *user_name (a char **). Next, *user_item = find_user(*user_name) is called, but the load of *user_name after the is_digest call is lost; wrongly eliminated in favor of the load after the call to is_basic. A dump shows wrong code first in the ".207r.csa" pass (for crisv32-axis-linux-gnu, likely for x86_64 as well). The test-case does not expose the bug on trunk r189401. Not observed with a gcc-4.3-based toolchain (cris-*), not observed with (host) "Debian 4.4.5-8". Unknown 4.5, 4.6.