Skip to content

Commit 4bfd95b

Browse files
Serguei Katkovmemfrob
authored andcommitted
[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.
1 parent 98ff7ab commit 4bfd95b

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,5 +334,29 @@ entry:
334334
ret void
335335
}
336336

337+
define void @f_8(i32 %x, i32* %length_buf) {
338+
; Check that we clean nuw nsw flags
339+
; CHECK-LABEL: @f_8(
340+
; CHECK-NEXT: entry:
341+
; CHECK-NEXT: [[LENGTH:%.*]] = load i32, i32* [[LENGTH_BUF:%.*]], align 4, !range [[RNG0]]
342+
; CHECK-NEXT: [[CHK0:%.*]] = icmp ult i32 [[X:%.*]], [[LENGTH]]
343+
; CHECK-NEXT: [[X_INC1:%.*]] = add nuw nsw i32 [[X]], 1
344+
; CHECK-NEXT: [[CHK1:%.*]] = icmp ult i32 [[X_INC1]], [[LENGTH]]
345+
; CHECK-NEXT: [[WIDE_CHK:%.*]] = and i1 [[CHK0]], [[CHK1]]
346+
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[WIDE_CHK]]) [ "deopt"() ]
347+
; CHECK-NEXT: ret void
348+
;
349+
entry:
350+
%length = load i32, i32* %length_buf, !range !0
351+
%chk0 = icmp ult i32 %x, %length
352+
call void(i1, ...) @llvm.experimental.guard(i1 %chk0) [ "deopt"() ]
353+
354+
%x.inc1 = add nuw nsw i32 %x, 1
355+
%chk1 = icmp ult i32 %x.inc1, %length
356+
call void(i1, ...) @llvm.experimental.guard(i1 %chk1) [ "deopt"() ]
357+
ret void
358+
}
359+
360+
337361

338362
!0 = !{i32 0, i32 2147483648}

0 commit comments

Comments
 (0)