Subject: Re: bug#39573: [3.0.0] Compiler fails to optimize out side-effect-free expression
From: Ludovic Courtès <[email-masked]>
To: Andy Wingo <[email-masked]>
Cc: [email-masked]
Date: Thu, 13 Feb 2020 12:35:59 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi Andy,

Andy Wingo <[email-masked]> skribis:

>> However, 3.0.0 keeps the computation of ‘i’:
>>
> [...]
>> L3:
>>   53    (instrument-loop 139)           
>>   55    (handle-interrupts)             
>>   56    (call-scm<-scm-uimm 5 5 1 3)                          at (unknown file):388:11
>>   58    (call-scm<-scm-uimm 3 3 1 34)                         at (unknown file):389:21
>>   60    (call-scm<-scm-scm 3 4 3 10)                          at (unknown file):389:11
>>   62    (=? 5 4)                                              at (unknown file):385:11
>>   63    (jne -10)                       ;; -> L3
>
> Hoo, we need to fix the disassembler to output something more sensible
> than this :P  IP 56 appears to be the 1-, 58 is the lsh/immediate, and
> 60 is the logior.

Oh, I hadn’t read that much into these lines.  :-)

>> I’m not sure where the optimization should be taking place.  Perhaps
>> it’s just a matter of amount-of-work threshold somewhere?
>
> It's not an amount-of-work, that's only in peval which does nothing to
> either of these (though it certainly could).
>
> I took a look.  I just pushed something to make (logior 0 INT) reduce to
> INT, but it doesn't remove the loop variable.

OK.

> Then I thought it was surely dead code elimination that just wasn't
> doing its thing.  The value is unused, so it must be that it thought
> that the `ash' was effectful.  That `ash' gets compiled to
> `lsh/immediate', which does indeed raise an exception if the operand
> isn't an int; but here we prove that it is.  The problem was a missing
> "type checker" implementation for lsh/immediate, a problem introduced in
> the refactored compilation of `ash'.  So, fixed in git now:
>
> L3:
>   45    (instrument-loop 135)           
>   47    (handle-interrupts)             
>   48    (call-scm<-scm-uimm 5 5 1 3)                          at (unknown file):4:12
>   50    (=? 5 4)                                              at (unknown file):3:12
>   51    (jne -6)                        ;; -> L3

Yay!  It’s nice to see how 7dc90a17e03045c7cd8894b14b027b845b68aa4f is
short and clear.

Thanks,
Ludo’.