[LLVMdev] sign extensions, SCEVs, and wrap flags

Andrew Trick atrick at apple.com
Tue Sep 18 22:59:12 PDT 2012

On Sep 18, 2012, at 8:21 PM, Preston Briggs <preston.briggs at gmail.com> wrote:

> Given the following SCEV,
> (sext i32 {2,+,1}<nw><%for.body> to i64)
> from the following C source,
> void strong3(int *A, int *B, int n) {
>   for (int i = 0; i < n; i++) {
>     A[i + 2] = i;
>     ...
>   }
> }
> Since the No-Wrap flag is set on the addrec, can't I safely rewrite it as
> {2,+,1}<nw><%for.body>
> If I can, why isn't the SCEV package simplifying things for me?

The short answer is that SCEV is terrible at preserving NSW flags. I personally don't believe they belong in SCEV but the merits of making any design change here are dubious.

To understand one example of SCEV dropping NSW, see createSCEV for Instruction::Add. Synopsis: your add is not a "basic induction variable" so its NSW flag does not bound the number of loop iterations. We only know that the add's original IR users expect NSW. There could be other IR adds with the same expression, but without the NSW flag. SCEV doesn't know anything about acyclic control flow or IR users, so it must drop the flags.

I would try hard not to rely on NSW flags on arbitrary SCEVs. I would first find the phi or basic induction variable before checking the recurrence's NSW flag. Or, better yet, only rely on SCEVAddRec's NW (no self-wrap flag) rather than NSW. Notice that the NW is preserved in your add's recurrence!


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

More information about the llvm-dev mailing list