[llvm-dev] Infinite loops with no side effects

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Fri Oct 27 12:37:41 PDT 2017


On 10/27/2017 12:08 AM, Dan Gohman via llvm-dev wrote:
> Hello,
>
> This email picks up the thread that to my knowledge was last discussed 
> here:
>
> http://lists.llvm.org/pipermail/llvm-dev/2015-July/088103.html 
> <http://lists.llvm.org/pipermail/llvm-dev/2015-July/088103.html>
>
> In brief, infinite loops containing no side effects produce undefined 
> behavior in C++ (and C in some cases), however in other languages, 
> they have fully defined behavior. LLVM's optimizer currently assumes 
> that infinite loops eventually terminate in a few places, and will 
> sometimes delete them in practice. There is currently no clean way to 
> opt out of this behavior from languages where it's not valid.
>
> This is the subject of a long-standing LLVM bug:
>
> https://bugs.llvm.org/show_bug.cgi?id=965 
> <https://bugs.llvm.org/show_bug.cgi?id=965>
>
> I wrote a patch implementing Chandler's idea from the above thread, 
> @llvm.sideeffect, a new intrinsic which is a no-op except that it 
> tells the optimizer to behave as if there were side effects present:
>
> https://reviews.llvm.org/D38336 <https://reviews.llvm.org/D38336>
>
> Similar results can be achieved with empty inline asms, however they 
> tend to pessimize optimizations. The patch above allows all of the 
> major optimizations to work in the presence of @llvm.sideeffect.

I think that we should move forward with this approach (as may be 
obvious given that I've okay'd the patch). It's a lightweight solution, 
at least on LLVM's side of things, and does not prevent other solutions 
later.

>
> One of the concerns raised is that front-ends would have to emit a lot 
> of these intrinsics, potentially one in every loop, one in every 
> function (due to opportunistic tail-call optimization), and one in 
> front of every label reachable by goto or similar, if a front-end 
> can't determine when they aren't needed.

This is a valid concern, however, I expect that most programs from 
higher-level languages will have well-structured loops, and it will be 
straightforward to emit the intrinsics.

> This is indeed a downside. It's mitigated in this patch by making sure 
> that the major optimization passes aren't pessimized.
>
> From the alternatives I've read, the most promising alternative is 
> Reid's proposal here:
>
> https://bugs.llvm.org/show_bug.cgi?id=965#c25
>
> to make infinite loops defined by default, and add a "known to be 
> productive" attribute to functions. It would be a more complex change, 
> and could potentially require changes in out-of-tree codebases. And it 
> would be suboptimal in some cases when cross-language inlining. 
> However, it would solve the problem in a much less cluttered way. I'm 
> willing to implement the LLVM portion of this if there's consensus 
> that it's a better approach.

The problem is that it is not a function-level property, it is a 
per-loop property. This is even true in C. In C, we would need to mark 
loops that have source-level-constant controlling conditions, and only 
those loops, and allowed to be infinite. And, so, maybe we could use 
loop-level metadata, but that seems hard to place/preserve for 
unstructured loops (and, arguably, that's more important in C/C++ than 
in other languages).

  -Hal

>
> Thoughts?
>
> Dan
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171027/761d6a42/attachment.html>


More information about the llvm-dev mailing list