[Bug rtl-optimization/59999] [4.9 Regression] Sign extension in loop regression blocks generation of zero overhead loop
paulo@matos-sorge.com
gcc-bugzilla@gcc.gnu.org
Wed Feb 5 12:14:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59999
--- Comment #8 from Paulo J. Matos <paulo@matos-sorge.com> ---
(In reply to Paulo J. Matos from comment #7)
> (In reply to Richard Biener from comment #5)
> > Apart from expand there is the redundant-extension-elimination, ree.c.
>
> In expand we get the following gimple for the loop:
> ;; basic block 4, loop depth 0
> ;; pred: 2
> ;; 4
> # i_15 = PHI <0(2), i_12(4)>
> # _18 = PHI <0(2), _4(4)>
> _6 = arr[_18];
> _7 = _6 + 1;
> arr[_18] = _7;
> _17 = (unsigned short) i_15;
> _13 = _17 + 1;
> i_12 = (short int) _13;
> _4 = (int) i_12;
> if (_4 < limit_5(D))
> goto <bb 4>;
> else
> goto <bb 3>;
> ;; succ: 4
> ;; 3
>
>
> Where _13 is an unsigned short and what we want to eliminate is this sign
> extend:
> _4 = (int) i_12;
>
> This doesn't seem trivial in the expand phase because to eliminate the sign
> expand, you promote i_12 to int and have then to promote a bunch of other
> variables, whose insn have been already emitted when you get here. Shouldn't
> this be ivopts noticing that if it generates an int IV, it saves a sign
> extend and therefore is better?
Made a mistake. With the attached test, the final gimple before expand for the
loop basic block is:
;; basic block 5, loop depth 0
;; pred: 5
;; 4
# i_26 = PHI <i_1(5), 0(4)>
# ivtmp.24_18 = PHI <ivtmp.24_12(5), ivtmp.24_29(4)>
_28 = (void *) ivtmp.24_18;
_13 = MEM[base: _28, offset: 0B];
x.4_14 = x;
_15 = _13 ^ x.4_14;
MEM[base: _28, offset: 0B] = _15;
ivtmp.24_12 = ivtmp.24_18 + 4;
temp_ptr.5_17 = (Sample *) ivtmp.24_12;
_11 = (unsigned short) i_26;
_2 = _11 + 1;
i_1 = (short int) _2;
_10 = (int) i_1;
if (_10 < _25)
goto <bb 5>;
else
goto <bb 6>;
;; succ: 5
;; 6
However, the point is the same. IVOPTS should probably generate an int IV
instead of a short int IV to avoid the sign extend since removing the sign
extend during RTL seems to be quite hard.
What do you think?
More information about the Gcc-bugs
mailing list