[llvm] [SCEV] Fix NSW flag propagation in getAddExpr (PR #155267)

Igor Kirillov via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 12 07:31:29 PDT 2025


igogo-x86 wrote:

Is it really correct? In this example, `%iv1` and `%iv2` do not overlow, but their sum does:

```
  define void @nuw_sum_wraps() {
  entry:
    br label %loop

  loop:
    ; k = 0..20
    %k = phi i32 [ 0, %entry ], [ %k.next, %loop ]

    %iv1 = phi i8 [ 200, %entry ], [ %iv1.next, %loop ]
    %iv2 = phi i8 [ 40, %entry ], [ %iv2.next, %loop ]

    %sum = add i8 %iv1, %iv2  ; SCEV: {240,+,2} on i8

    ; Individually marked NUW
    %iv1.next = add nuw i8 %iv1, 1
    %iv2.next = add nuw i8 %iv2, 1

    %k.next = add nuw nsw i32 %k, 1
    %cond = icmp ult i32 %k.next, 21
    br i1 %cond, label %loop, label %exit

  exit:
    ret void
  }
```

But `opt -passes="print<scalar-evolution>" -S test.ll` adds this flags:

```
%sum = add i8 %iv1, %iv2
  -->  {-16,+,2}<nuw><nsw><%loop> U: [-16,-1) S: [-16,0)                Exits: 24               LoopDispositions: { %loop: Computable }
```


https://github.com/llvm/llvm-project/pull/155267


More information about the llvm-commits mailing list