Hi, Could you please review my patch for predicated lim? Let me note some details about it: 1) Phi statements are still moved only if they have 1 or 2 arguments. However, phi statements could be move under conditions (as it’s done for the other statements). Probably, phi statement motion with 3 + arguments could be implemented in the next patch after predicated lim. 2) Patch has limitations/features like (it was ok to me to implement it such way, maybe I’m not correct. ): a) Loop1 { If (a) Loop2 { Stmt - Invariant for Loop1 } } In this case Stmt will be moved only out of Loop2, because of if (a). b) Or Loop1 { … If (cond1) If (cond2) If (cond3) Stmt; } Stmt will be moved out only if cond1 is always executed in Loop1. c) It took me a long time to write all of these code, so there might be other peculiarities which I forgot to mention. :) Let’s discuss these ones as you will review my patch. 3) Patch consists of 9 files: a) gcc/testsuite/gcc.dg/tree-ssa/loop-7.c, gcc/testsuite/gcc.dg/tree-ssa/recip-3.c – changed tests: - gcc/testsuite/gcc.dg/tree-ssa/loop-7.c changed as predicated lim moves 2 more statements out of the loop; - gcc/testsuite/gcc.dg/tree-ssa/recip-3.c – with conditional lim recip optimization in this test doesn’t work (the corresponding value is below threshold as I could see in the code for recip, 1<3). So to have recip working in this test I changed test a little bit. b) gcc/tree-ssa-loop-im.c – the patched lim per se c) gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-13.c, gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-14.c, gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-15.c, gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-16.c, gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-17.c, gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-18.c the tests for conditional lim. 4) Patch testing: a) make –k check (no difference in results for me for the clean build and the patched one, - Revision: 222849, - uname -a Linux Istanbul 3.16.0-23-generic #31-Ubuntu SMP Tue Oct 21 18:00:35 UTC 2014 i686 i686 i686 GNU/Linux b) Bootstrap. It goes well now, however to fix it I have made a temporary hack in the lim code. And with this fix patch definitely shouldn’t be committed. I did so, as I would like to discuss this issue first. The problem is: I got stage2-stage3 comparison failure on the single file (tree-vect-data-refs.o). After some investigation I understood that tree-vect-data-refs.o differs being compiled with and without ‘-g’ option (yes, more exactly on stage 2 this is ‘-g –O2 –gtoggle’, and for stage 3 this is ‘-g –O2’. But to simplify things I can reproduce this difference on the same build (even not bootstrapped), with option ‘ –g’ and without it). Of course, the file compiled with –g option will contain debug information and will differ from the corresponding file without debug information. I mean there is the difference reported by contrib/compare-debug (I mean we talk about stripped files). Then I compared assemblers and lim dump files and made a conclusion the difference is: There is statement _484=something, which is conditionally moved out of loop X. In non debug cases no usages of _484 are left inside the loop X. In debug case, there is the single use in debug statement. So for debug case my patch generates phi statement for _484 to make it available inside the loop X. For non debug case, no such phi statement generated as there is no uses of _484. There is one more statement with lhs=_493, with exactly this pattern of use. But this is not important for our discussion. So, in my opinion it’s ok to generate additional phi node for debug case. But I’m not a compiler expert and maybe there is some requirement that debug and non-debug versions should differ only by debug statements, I don’t know. My temporary hack fix is just removing of such debug statements (no debug statements, no problems J). The alternatives I see are: - Move debug statements outside the loop (not good in my opinion); - Somehow reset values in debug statements (not good in my opinion, if I could provide correct information for them); - Generate phi for debug statements and fix bootstrap (say, let’s have some list of files, which we have special check for. I mean for my case, the difference is not in stage2 and stage3, it’s in debug and non-debug). I like this variant. However, as I don’t see such list of special files in the whole gcc, I think I might be missing something. What do you think? Thanks, Evgeniya