[llvm] [IR] Add nowrap flags for trunc instruction (PR #85592)

via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 25 10:13:45 PDT 2024


================
@@ -1021,3 +1021,37 @@ define i16 @PR44545(i32 %t0, i32 %data) {
   %sub = add nsw i16 %cast, -1
   ret i16 %sub
 }
+
+; Make sure that SimplifyDemandedBits drops the nowrap flags
+define i16 @drop_nsw_trunc(i32 %x) {
+; CHECK-LABEL: @drop_nsw_trunc(
+; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i16
+; CHECK-NEXT:    [[B:%.*]] = and i16 [[TMP1]], -2
+; CHECK-NEXT:    ret i16 [[B]]
+;
+  %t = and i32 %x, -2
+  %b = trunc nsw i32 %t to i16
----------------
elhewaty wrote:

What I understand from your example, is that SimplifyDemandedBits will drop the flag because it may be caused by the %and instruction as it preserves the least 8 bits it assumes that the flag exists because of this %and. given that the %and got eliminated then it's okay now to drop the flag.

For the NSW test. Should the NSW test be similar to this?
```
define i8 @test_nsw(i16 %x, i16 %y) {
    %and = and i16 %x, -1 
    %and2 = and i16 %x, %y
    %res = trunc nsw i16 %and2 to i8
    ret i8 %res
}
```

> ```
> define i8 @test(i16 %x, i16 %y) {
>     %and = and i16 %x, 255
>     %and2 = and i16 %x, %y
>     %res = trunc nuw i16 %and2 to i8
>     ret i8 %res
> }
> ```

I tried this test, but it doesn't drop the nuw flag, and of course mine too.

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


More information about the llvm-commits mailing list