This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Optimize nested SIGN_EXTENDs/ZERO_EXTENDs (PR target/45336)


On Fri, Aug 20, 2010 at 6:50 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Fri, Aug 20, 2010 at 11:46:48AM +0200, Paolo Bonzini wrote:
>> On 08/19/2010 06:33 PM, Jakub Jelinek wrote:
>> >+ ? ? ?/* (sign_extend:M (sign_extend:N<X>)) is (sign_extend:M<X>). ?*/
>> >+ ? ? ?if (GET_CODE (op) == SIGN_EXTEND)
>> >+ ? ?return simplify_gen_unary (SIGN_EXTEND, mode, XEXP (op, 0),
>> >+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GET_MODE (XEXP (op, 0)));
>>
>> Maybe
>>
>> /* (sign_extend:M (sign_extend:N<X>)) is (sign_extend:M<X>).
>> ? ?(sign_extend:M (zero_extend:N<X>)) is (zero_extend:M<X>). ?*/
>> if (GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == ZERO_EXTEND)
>> ? {
>> ? ? gcc_assert (GET_MODE (op) != mode);
>> ? ? return simplify_gen_unary (GET_CODE (op), mode, XEXP (op, 0),
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GET_MODE (XEXP (op, 0)));
>> ? }
>>
>> ?
>
> Good idea.
>
> On Thu, Aug 19, 2010 at 07:58:24PM +0200, Bernd Schmidt wrote:
>> > ZERO_EXTEND is expanded into AND instead of LSHIFTRT/ASHIFT by combine,
>> > and
>> > two nested ANDs should be easily optimized. ?If you really want, I can
>> > handle the ZERO_EXTEND (AND <X> mask) case as a follow-up.
>>
>> Oh, in expand_compound_operation? ?I was thinking about finding such
>> shifts in a pair of insns (happens on Thumb). ?Also, what about callers
>> other than combine?
>
> Ok. ?The following patch thus adds optimization of sign_extend of zero_extend,
> sign_extend of lshiftrt/ashift and zero_extend of lshiftrt/ashift.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux (yes,rtl checking)
> with additional patchlet to gather statistics and in both
> bootstraps/regtests together this optimization happened (the fact that
> simplify-rtx.c simplified it doesn't still mean the result was usable in
> whatever pass asked for it) ? ? times:
> (sign_extend (sign_extend)) ? ? ?2059
> (sign_extend (zero_extend)) ? ? 87019
> (sign_extend (ashiftrt)) ? ? ? ? 1485
> (zero_extend (zero_extend)) ? ? 15648
> lshiftrt wasn't seen, but it is very well possible it shows up on other
> targets. ?Ok for trunk?
>
> 2010-08-20 ?Jakub Jelinek ?<jakub@redhat.com>
> ? ? ? ? ? ?Paolo Bonzini ?<bonzini@gnu.org>
>
> ? ? ? ?* simplify-rtx.c (simplify_unary_operation_1): Optimize
> ? ? ? ?(sign_extend (zero_extend ()) and
> ? ? ? ?({sign,zero}_extend (lshiftrt (ashift X (const_int I)) (const_int I))).
>

Can we optimize out sign_extend in:

(insn:TI 9 7 10 (set (reg:SI 0 ax [orig:68 D.6819 ] [68])
        (zero_extend:SI (vec_select:QI (reg:V16QI 21 xmm0 [orig:64 x ] [64])
                (parallel [
                        (const_int 4 [0x4])
                    ]))))
/export/build/gnu/gcc/build-x86_64-linux/gcc/include/smmintrin.h:442 1681
{*sse4_1_pextrb}
     (expr_list:REG_DEAD (reg:V16QI 21 xmm0 [orig:64 x ] [64])
        (nil)))

(insn:TI 10 9 18 (set (reg:DI 0 ax [orig:67 D.6819 ] [67])
        (sign_extend:DI (reg:SI 0 ax [orig:68 D.6819 ] [68]))) foo.c:3 126
{extendsidi2_rex64}
     (nil))

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]