[llvm] 0a838ad - [GuardWidening] Add test showing incorrect behavior with nuw/nsw flags

Serguei Katkov via llvm-commits llvm-commits at lists.llvm.org
Wed May 25 23:05:37 PDT 2022


Author: Serguei Katkov
Date: 2022-05-26T12:54:42+07:00
New Revision: 0a838ad517073e0c866a91661a0c2eb0ad0f77a8

URL: https://github.com/llvm/llvm-project/commit/0a838ad517073e0c866a91661a0c2eb0ad0f77a8
DIFF: https://github.com/llvm/llvm-project/commit/0a838ad517073e0c866a91661a0c2eb0ad0f77a8.diff

LOG: [GuardWidening] Add test showing incorrect behavior with nuw/nsw flags

when we move instruction over the guard we must clear nuw/nsw flags
but we do not.

Added: 
    

Modified: 
    llvm/test/Transforms/GuardWidening/range-check-merging.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/GuardWidening/range-check-merging.ll b/llvm/test/Transforms/GuardWidening/range-check-merging.ll
index a6756ed38c2c..b4ab9b32ff48 100644
--- a/llvm/test/Transforms/GuardWidening/range-check-merging.ll
+++ b/llvm/test/Transforms/GuardWidening/range-check-merging.ll
@@ -334,5 +334,29 @@ entry:
   ret void
 }
 
+define void @f_8(i32 %x, i32* %length_buf) {
+; Check that we clean nuw nsw flags
+; CHECK-LABEL: @f_8(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[LENGTH:%.*]] = load i32, i32* [[LENGTH_BUF:%.*]], align 4, !range [[RNG0]]
+; CHECK-NEXT:    [[CHK0:%.*]] = icmp ult i32 [[X:%.*]], [[LENGTH]]
+; CHECK-NEXT:    [[X_INC1:%.*]] = add nuw nsw i32 [[X]], 1
+; CHECK-NEXT:    [[CHK1:%.*]] = icmp ult i32 [[X_INC1]], [[LENGTH]]
+; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[CHK0]], [[CHK1]]
+; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[WIDE_CHK]]) [ "deopt"() ]
+; CHECK-NEXT:    ret void
+;
+entry:
+  %length = load i32, i32* %length_buf, !range !0
+  %chk0 = icmp ult i32 %x, %length
+  call void(i1, ...) @llvm.experimental.guard(i1 %chk0) [ "deopt"() ]
+
+  %x.inc1 = add nuw nsw i32 %x, 1
+  %chk1 = icmp ult i32 %x.inc1, %length
+  call void(i1, ...) @llvm.experimental.guard(i1 %chk1) [ "deopt"() ]
+  ret void
+}
+
+
 
 !0 = !{i32 0, i32 2147483648}


        


More information about the llvm-commits mailing list