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

Reply via email to