[llvm-dev] Dataflow analysis regression in 3.7

Davide Italiano via llvm-dev
Thu, 06 Jul 2017 05:00:35 -0000

On Wed, Jul 5, 2017 at 3:59 PM, Johan Engelen via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
> Hi all,
>   I just found an optimization regression regarding simple
> dataflow/constprop analysis:
> https://godbolt.org/g/Uz8P7t
>
> This code
> ```
> int dataflow(int b) {
>   int a;
>
>   if (b==4)
>     a = 3*b; // fully optimized when changed to a = 3;
>   else
>     a = 5;
>
>   if (a == 4)
>     return 0;
>   else
>     return 1;
> }
> ```
> is no longer optimized to just a "return 1". The regression
happened in LLVM
> 3.6 --> 3.7.
>
> Is this a known regression? I couldn't find it in the bug tracker (but
don't
> really know which keywords to look for...)
>
> Kind regards,
>   Johan
>

This regressed when SimplifyCFG changed the threshold for PHI nodes
folding from 1 to 2.

(see lib/Transforms/Utils/SimplifyCFG.cpp)

+PHINodeFoldingThreshold("phi-node-folding-threshold", cl::Hidden,
cl::init(2),
+   cl::desc("Control the amount of phi node folding to perform
(default = 2)"));

This could be re-evaluated, maybe, or some other transformation could
catch this case.
(e.g. a more powerful range solver could realize that a is always in
the range [5;12]).

FWIW, GCC does this.

I don't think this very case has been reported, so feel free to do it.

--
Davide