On 08/29/2014 02:47 AM, Ilya Enkovich wrote:
> Seems your patch doesn't cover all cases. Attached is a modified
> patch (with your changes included) and a test where double constant is
> wrongly rematerialized. I also see in ira dump that there is still a
> copy of PIC reg created:
>
> Initialization of original PIC reg:
> (insn 23 22 24 2 (set (reg:SI 127)
> (reg:SI 3 bx)) test.cc:42 90 {*movsi_internal}
> (expr_list:REG_DEAD (reg:SI 3 bx)
> (nil)))
> ...
> Copy is created:
> (insn 135 37 25 3 (set (reg:SI 138 [127])
> (reg:SI 127)) 90 {*movsi_internal}
> (expr_list:REG_DEAD (reg:SI 127)
> (nil)))
> ...
> Copy is used:
> (insn 119 25 122 3 (set (reg:DF 134)
> (mem/u/c:DF (plus:SI (reg:SI 138 [127])
> (const:SI (unspec:SI [
> (symbol_ref/u:SI ("*.LC0") [flags 0x2])
> ] UNSPEC_GOTOFF))) [5 S8 A64])) 128 {*movdf_internal}
> (expr_list:REG_EQUIV (const_double:DF
> 2.9999999999999997371893933895137251965934410691261292e-4
> [0x0.9d495182a99308p-11])
> (nil)))
>
> After reload we have new usage of r127 which is allocated to ecx which
> actually does not have any definition in this function at all.
>
> (insn 151 42 44 4 (set (reg:SI 0 ax [147])
> (plus:SI (reg:SI 2 cx [127])
> (const:SI (unspec:SI [
> (symbol_ref/u:SI ("*.LC0") [flags 0x2])
> ] UNSPEC_GOTOFF)))) test.cc:44 213 {*leasi}
> (expr_list:REG_EQUAL (symbol_ref/u:SI ("*.LC0") [flags 0x2])
> (nil)))
> (insn 44 151 45 4 (set (reg:DF 21 xmm0 [orig:129 D.2450 ] [129])
> (mult:DF (reg:DF 21 xmm0 [orig:128 D.2450 ] [128])
> (mem/u/c:DF (reg:SI 0 ax [147]) [5 S8 A64]))) test.cc:44
> 790 {*fop_df_comm_sse}
> (expr_list:REG_EQUAL (mult:DF (reg:DF 21 xmm0 [orig:128 D.2450 ] [128])
> (const_double:DF
> 2.9999999999999997371893933895137251965934410691261292e-4
> [0x0.9d495182a99308p-11]))
> (nil)))
>
> Compilation string: g++ -m32 -O2 -mfpmath=sse -fPIE -S test.cc
>
>
Ok, Ilya. I'll look at the problem this week.