On Aug 10, 2005, at 2:35 PM, Dale Johannesen wrote:
On Aug 10, 2005, at 12:43 PM, Fariborz Jahanian wrote:
Following patch has exposed an optimization shortcoming:
2005-07-12 Dale Johannesen <[EMAIL PROTECTED]>
* expr.c (compress_float_constant): Add cost check.
* config/rs6000.c (rs6000_rtx_cost): Adjust FLOAT_EXTEND cost.
This patch results in generating worse code for the following test case:
1) Test case:
struct S {
float d1, d2, d3;
I believe you mean double not float; the RTL snippets you give indicate this.
Yes, it is double. Copied the wrong test.
(insn 12 7 13 0 (set (reg:SF 59)
(mem/u/i:SF (symbol_ref/u:SI ("*LC0") [flags 0x2]) [0 S4 A32])) -1 (nil)
(nil))
(insn 13 12 14 0 (set (mem/s/j:DF (reg/f:SI 58 [ D.1929 ]) [0 <result>.d1+0 S8 A32])
(float_extend:DF (reg:SF 59))) -1 (nil)
(nil))
However, if you try your example with float as given, you see it does not do a
direct store of constant 0 with or without the compress_float patch. IMO the
compress_float patch does not really have anything to do with this problem;
Yes. Title says Regression 'exposed' by .... But as my email pointed out, float_extend is substituted in cse. So, this is another case of change in rtl pattern breaks an optimization down the road. I don't know if this is a regression or exposition of a lurking bug.
before this patch the double case was working well by accident, my patch
exposed a problem farther downstream, which was always there for the float
case.
Yes. I mentioned that in my email.
- fariborz
When I put that patch in, rth remarked:
<x-tad-bigger>While I certainly wouldn't expect fold_rtx to find out about this
all by itself, I'd have thought that there would have been a
REG_EQUIV or REG_EQUAL note that indicates that the end result is
the constant (const_double:DF 1.0), and use that in any simplification.
</x-tad-bigger>Indeed there is no such note, and I suspect adding it somewhere (expand?) would fix this.