Skip to content

Commit e8e678c

Browse files
committed
[SCEV] Add additional test with guards for 3-op AddRec.
Add additional tests for using information from loop guards in SCEV.
1 parent 1ed1537 commit e8e678c

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed

llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info-apply-to-adds.ll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,37 @@ loop:
5656
exit:
5757
ret void
5858
}
59+
60+
declare void @use(ptr)
61+
62+
define i32 @test_3_op_add(i32 %x, i32 %y, ptr %A) {
63+
; CHECK-LABEL: 'test_3_op_add'
64+
; CHECK-NEXT: Determining loop execution counts for: @test_3_op_add
65+
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (zext i32 (1 + (-1 * %x) + %y) to i64))<nsw>
66+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2147483647
67+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (zext i32 (1 + (-1 * %x) + %y) to i64))<nsw>
68+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
69+
;
70+
entry:
71+
%pre.0 = icmp ugt i32 %x, 0
72+
br i1 %pre.0, label %then, label %exit
73+
74+
then:
75+
%y.sub.x = sub i32 %y, %x
76+
%pre.1 = icmp slt i32 %y.sub.x, 0
77+
%add.1 = add i32 %y.sub.x, 1
78+
%add.ext = zext i32 %add.1 to i64
79+
br i1 %pre.1, label %exit, label %loop
80+
81+
loop:
82+
%iv = phi i64 [ %iv.next, %loop ], [ 0, %then ]
83+
%and = and i64 %iv, 1
84+
%gep = getelementptr i8, ptr %A, i64 %and
85+
call void @use(ptr %gep)
86+
%iv.next = add i64 %iv, 1
87+
%ec = icmp eq i64 %iv.next, %add.ext
88+
br i1 %ec, label %exit, label %loop
89+
90+
exit:
91+
ret i32 0
92+
}

llvm/test/Transforms/LoopIdiom/add-nsw-zext-fold.ll

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
22
; RUN: opt -p loop-idiom -S %s | FileCheck %s
33

44
define void @fold_add_zext_to_sext(ptr %dst, i1 %start) {
@@ -40,3 +40,56 @@ loop:
4040
exit:
4141
ret void
4242
}
43+
44+
declare i16 @get()
45+
46+
define void @test_memset_size_can_use_info_from_guards(i32 %x, ptr %dst) {
47+
; CHECK-LABEL: define void @test_memset_size_can_use_info_from_guards(
48+
; CHECK-SAME: i32 [[X:%.*]], ptr [[DST:%.*]]) {
49+
; CHECK-NEXT: [[ENTRY:.*]]:
50+
; CHECK-NEXT: br label %[[LOOP1:.*]]
51+
; CHECK: [[LOOP1_LOOPEXIT:.*]]:
52+
; CHECK-NEXT: br label %[[LOOP1_BACKEDGE:.*]]
53+
; CHECK: [[LOOP1]]:
54+
; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[X]], %[[LOOP1_BACKEDGE]] ]
55+
; CHECK-NEXT: [[L:%.*]] = call i16 @get()
56+
; CHECK-NEXT: [[L_EXT:%.*]] = zext i16 [[L]] to i32
57+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[L_EXT]], [[P]]
58+
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[SUB]], 1
59+
; CHECK-NEXT: [[EC:%.*]] = icmp ult i32 [[SUB]], 2
60+
; CHECK-NEXT: br i1 [[EC]], label %[[LOOP1_BACKEDGE]], label %[[LOOP2_PREHEADER:.*]]
61+
; CHECK: [[LOOP1_BACKEDGE]]:
62+
; CHECK-NEXT: br label %[[LOOP1]]
63+
; CHECK: [[LOOP2_PREHEADER]]:
64+
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[SUB]] to i64
65+
; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 1
66+
; CHECK-NEXT: [[UMAX:%.*]] = call i64 @llvm.umax.i64(i64 [[TMP1]], i64 1)
67+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 [[UMAX]], i1 false)
68+
; CHECK-NEXT: br label %[[LOOP2:.*]]
69+
; CHECK: [[LOOP2]]:
70+
; CHECK-NEXT: [[IV_2:%.*]] = phi i32 [ [[IV_2_NEXT:%.*]], %[[LOOP2]] ], [ 0, %[[LOOP2_PREHEADER]] ]
71+
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr i8, ptr [[DST]], i32 [[IV_2]]
72+
; CHECK-NEXT: [[IV_2_NEXT]] = add i32 [[IV_2]], 1
73+
; CHECK-NEXT: [[EC_2:%.*]] = icmp ult i32 [[IV_2_NEXT]], [[SHR]]
74+
; CHECK-NEXT: br i1 [[EC_2]], label %[[LOOP2]], label %[[LOOP1_LOOPEXIT]]
75+
;
76+
entry:
77+
br label %loop1
78+
79+
loop1:
80+
%p = phi i32 [ 0, %entry ], [ %x, %loop1 ], [ %x, %loop2 ]
81+
%l = call i16 @get()
82+
%l.ext = zext i16 %l to i32
83+
%sub = sub i32 %l.ext, %p
84+
%shr = lshr i32 %sub, 1
85+
%ec = icmp ult i32 %sub, 2
86+
br i1 %ec, label %loop1, label %loop2
87+
88+
loop2:
89+
%iv.2 = phi i32 [ 0, %loop1 ], [ %iv.2.next, %loop2 ]
90+
%gep.dst = getelementptr i8, ptr %dst, i32 %iv.2
91+
store i8 0, ptr %gep.dst, align 1
92+
%iv.2.next = add i32 %iv.2, 1
93+
%ec.2 = icmp ult i32 %iv.2.next, %shr
94+
br i1 %ec.2, label %loop2, label %loop1
95+
}

0 commit comments

Comments
 (0)