[llvm] [IR] Add nowrap flags for trunc instruction (PR #85592)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 25 05:24:34 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
----------------
nikic wrote:
Are these tests actually folded through SimplifyDemandedBits? I think they are handled by a different transform. I'd expect the test to look something like this:
```
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
}
```
Here %and will be eliminated, but might be the part that enforces the nuw flag, so they flag should be dropped. %and2 exists so that the trunc doesn't get pushed through the and with constant.
https://github.com/llvm/llvm-project/pull/85592
More information about the llvm-commits
mailing list