https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116454
--- Comment #12 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The releases/gcc-14 branch has been updated by Richard Biener <rgue...@gcc.gnu.org>: https://gcc.gnu.org/g:12c00048d9f3598e57b98ec7723f7356bd255d04 commit r14-10683-g12c00048d9f3598e57b98ec7723f7356bd255d04 Author: Andrew Pinski <quic_apin...@quicinc.com> Date: Wed Aug 21 17:41:38 2024 -0700 fold: Fix `a * 1j` if a has side effects [PR116454] The problem here was a missing save_expr around arg0 since it is used twice, once in REALPART_EXPR and once in IMAGPART_EXPR. Thia adds the save_expr and reformats the code slightly so it is a little easier to understand. It excludes the case when arg0 is a COMPLEX_EXPR since in that case we'll end up with the distinct real and imaginary parts. This is important to retain early optimization in some testcases. Bootstapped and tested on x86_64-linux-gnu with no regressions. PR middle-end/116454 gcc/ChangeLog: * fold-const.cc (fold_binary_loc): Fix `a * +-1i` by wrapping arg0 with save_expr when it is not COMPLEX_EXPR. gcc/testsuite/ChangeLog: * gcc.dg/torture/pr116454-1.c: New test. * gcc.dg/torture/pr116454-2.c: New test. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> Co-Authored-By: Richard Biener <rguent...@suse.de> (cherry picked from commit b07f8a301158e53717b8688cc8ea430b6f02574c)