1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1
2
; PR23538
2
3
; RUN: opt < %s -indvars -loop-deletion -S | FileCheck %s
3
4
@@ -10,7 +11,40 @@ declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
10
11
11
12
define i32 @_Z3fooPKcjj (i8* nocapture readonly %s , i32 %len , i32 %c ) {
12
13
; CHECK-LABEL: @_Z3fooPKcjj(
13
- ; CHECK-NOT: udiv
14
+ ; CHECK-NEXT: entry:
15
+ ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
16
+ ; CHECK-NEXT: [[TMP:%.*]] = bitcast i32* [[A]] to i8*
17
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP]])
18
+ ; CHECK-NEXT: store i32 -1640531527, i32* [[A]], align 4
19
+ ; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt i32 [[LEN:%.*]], 11
20
+ ; CHECK-NEXT: br i1 [[CMP8]], label [[WHILE_BODY_LR_PH:%.*]], label [[WHILE_END:%.*]]
21
+ ; CHECK: while.body.lr.ph:
22
+ ; CHECK-NEXT: br label [[WHILE_BODY:%.*]]
23
+ ; CHECK: while.body:
24
+ ; CHECK-NEXT: [[KEYLEN_010:%.*]] = phi i32 [ [[LEN]], [[WHILE_BODY_LR_PH]] ], [ [[SUB:%.*]], [[WHILE_BODY]] ]
25
+ ; CHECK-NEXT: [[S_ADDR_09:%.*]] = phi i8* [ [[S:%.*]], [[WHILE_BODY_LR_PH]] ], [ [[ADD_PTR:%.*]], [[WHILE_BODY]] ]
26
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[S_ADDR_09]] to i32*
27
+ ; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
28
+ ; CHECK-NEXT: [[SHL_I:%.*]] = shl i32 [[TMP2]], 1
29
+ ; CHECK-NEXT: [[AND_I:%.*]] = and i32 [[SHL_I]], 16843008
30
+ ; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[A]], align 4
31
+ ; CHECK-NEXT: [[SUB_I:%.*]] = add i32 [[TMP3]], [[TMP2]]
32
+ ; CHECK-NEXT: [[ADD:%.*]] = sub i32 [[SUB_I]], [[AND_I]]
33
+ ; CHECK-NEXT: store i32 [[ADD]], i32* [[A]], align 4
34
+ ; CHECK-NEXT: [[ADD_PTR]] = getelementptr inbounds i8, i8* [[S_ADDR_09]], i64 12
35
+ ; CHECK-NEXT: [[SUB]] = add i32 [[KEYLEN_010]], -12
36
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[SUB]], 11
37
+ ; CHECK-NEXT: br i1 [[CMP]], label [[WHILE_BODY]], label [[WHILE_COND_WHILE_END_CRIT_EDGE:%.*]]
38
+ ; CHECK: while.cond.while.end_crit_edge:
39
+ ; CHECK-NEXT: [[SUB_LCSSA:%.*]] = phi i32 [ [[SUB]], [[WHILE_BODY]] ]
40
+ ; CHECK-NEXT: br label [[WHILE_END]]
41
+ ; CHECK: while.end:
42
+ ; CHECK-NEXT: [[KEYLEN_0_LCSSA:%.*]] = phi i32 [ [[SUB_LCSSA]], [[WHILE_COND_WHILE_END_CRIT_EDGE]] ], [ [[LEN]], [[ENTRY:%.*]] ]
43
+ ; CHECK-NEXT: call void @_Z3mixRjj(i32* dereferenceable(4) [[A]], i32 [[KEYLEN_0_LCSSA]])
44
+ ; CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[A]], align 4
45
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP]])
46
+ ; CHECK-NEXT: ret i32 [[TMP4]]
47
+ ;
14
48
entry:
15
49
%a = alloca i32 , align 4
16
50
%tmp = bitcast i32* %a to i8*
@@ -52,6 +86,14 @@ while.end: ; preds = %while.cond.while.en
52
86
53
87
define i32 @zero_backedge_count_test (i32 %unknown_init , i32* %unknown_mem ) {
54
88
; CHECK-LABEL: @zero_backedge_count_test(
89
+ ; CHECK-NEXT: entry:
90
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
91
+ ; CHECK: loop:
92
+ ; CHECK-NEXT: [[UNKNOWN_NEXT:%.*]] = load volatile i32, i32* [[UNKNOWN_MEM:%.*]]
93
+ ; CHECK-NEXT: br i1 false, label [[LOOP]], label [[LEAVE:%.*]]
94
+ ; CHECK: leave:
95
+ ; CHECK-NEXT: ret i32 [[UNKNOWN_INIT:%.*]]
96
+ ;
55
97
entry:
56
98
br label %loop
57
99
@@ -67,8 +109,6 @@ leave:
67
109
; We can fold %unknown_phi even though the backedge value for it is completely
68
110
; unknown, since we can prove that the loop's backedge taken count is 0.
69
111
70
- ; CHECK: leave:
71
- ; CHECK: ret i32 %unknown_init
72
112
%exit_val = phi i32 [ %unknown_phi , %loop ]
73
113
ret i32 %exit_val
74
114
}
0 commit comments