------- 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