------- Comment #2 from danglin at gcc dot gnu dot org 2010-08-07 19:52 ------- With slightly modified test,
#include <complex> #include <iostream> void g(std::complex<double> x) { std::cout << x << std::endl; } void f(std::complex<double> x) { g (x); x = 1.0 / x; g (x); } int main() { f(2.0); } it appears RTL is wrong at expansion: ;; x.1 = std::operator/<double> (&D.24646, &x.1); [return slot optimization] (insn 18 17 19 (set (reg:SI 102) (plus:SI (reg/f:SI 90 virtual-stack-vars) (const_int 8 [0x8]))) test.cxx:12 -1 (nil)) (insn 19 18 20 (set (reg:SI 103) (plus:SI (reg/f:SI 90 virtual-stack-vars) (const_int 8 [0x8]))) test.cxx:12 -1 (nil)) (insn 20 19 21 (set (reg:SI 28 %r28) (reg:SI 103)) test.cxx:12 -1 (nil)) (insn 21 20 22 (set (reg:SI 26 %r26) (reg/f:SI 90 virtual-stack-vars)) test.cxx:12 -1 (nil)) (insn 22 21 23 (set (reg:SI 25 %r25) (reg:SI 102)) test.cxx:12 -1 (nil)) (call_insn 23 22 0 (parallel [ (call (mem:SI (symbol_ref/v/i:SI ("@_ZStdvIdESt7complexIT_ERKS1_RKS2_") [flags 0x1] <function_decl 0x40f5d600 operator/>) [0 S4 A32]) (const_int 16 [0x10])) (clobber (reg:SI 1 %r1)) (clobber (reg:SI 2 %r2)) (use (const_int 0 [0])) ]) test.cxx:12 -1 (nil) (expr_list:REG_DEP_TRUE (use (reg:SI 25 %r25)) (expr_list:REG_DEP_TRUE (use (reg:SI 26 %r26)) (expr_list:REG_DEP_TRUE (use (reg:SI 28 %r28)) (nil))))) -- danglin at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Component|target |tree-optimization http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44632