@@ -29,3 +29,91 @@ bb1: ; preds = %bb1, %bb
29
29
common .ret: ; preds = %bb1
30
30
ret i2 %i2
31
31
}
32
+
33
+ define i4 @iv_hoist_nsw_poison2 (i4 %0 , i4 %end , i4 %start ) {
34
+ ; CHECK-LABEL: @iv_hoist_nsw_poison2(
35
+ ; CHECK-NEXT: entry:
36
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
37
+ ; CHECK: loop:
38
+ ; CHECK-NEXT: [[IV_0:%.*]] = phi i4 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_0_NEXT:%.*]], [[LOOP]] ]
39
+ ; CHECK-NEXT: [[IV_0_NEXT]] = add i4 [[IV_0]], 1
40
+ ; CHECK-NEXT: [[DOTNOT_NOT:%.*]] = icmp ult i4 [[IV_0]], [[END:%.*]]
41
+ ; CHECK-NEXT: br i1 [[DOTNOT_NOT]], label [[EXIT:%.*]], label [[LOOP]]
42
+ ; CHECK: exit:
43
+ ; CHECK-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i4 [ [[IV_0_NEXT]], [[LOOP]] ]
44
+ ; CHECK-NEXT: ret i4 [[IV_1_NEXT_LCSSA]]
45
+ ;
46
+ entry:
47
+ br label %loop
48
+
49
+ loop:
50
+ %iv.0 = phi i4 [ %start , %entry ], [ %iv.0.next , %loop ]
51
+ %iv.1 = phi i4 [ %start , %entry ], [ %iv.1.next , %loop ]
52
+ %iv.0.next = add i4 %iv.0 , 1
53
+ %iv.1.next = add nsw i4 %iv.1 , 1
54
+ %.not.not = icmp ult i4 %iv.0 , %end
55
+ br i1 %.not.not , label %exit , label %loop
56
+
57
+ exit:
58
+ ret i4 %iv.1.next
59
+ }
60
+
61
+ define i2 @iv_hoist_both_adds_nsw (i2 %arg ) {
62
+ ; CHECK-LABEL: @iv_hoist_both_adds_nsw(
63
+ ; CHECK-NEXT: bb:
64
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
65
+ ; CHECK: loop:
66
+ ; CHECK-NEXT: [[IV_0:%.*]] = phi i2 [ 1, [[BB:%.*]] ], [ [[IV_0_NEXT:%.*]], [[LOOP]] ]
67
+ ; CHECK-NEXT: [[IV_0_NEXT]] = add nuw i2 [[IV_0]], 1
68
+ ; CHECK-NEXT: [[DOTNOT_NOT:%.*]] = icmp ult i2 1, [[ARG:%.*]]
69
+ ; CHECK-NEXT: br i1 [[DOTNOT_NOT]], label [[EXIT:%.*]], label [[LOOP]]
70
+ ; CHECK: exit:
71
+ ; CHECK-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i2 [ [[IV_0_NEXT]], [[LOOP]] ]
72
+ ; CHECK-NEXT: ret i2 [[IV_1_NEXT_LCSSA]]
73
+ ;
74
+ bb:
75
+ br label %loop
76
+
77
+ loop:
78
+ %iv.0 = phi i2 [ 1 , %bb ], [ %iv.0.next , %loop ]
79
+ %iv.1 = phi i2 [ 1 , %bb ], [ %iv.1.next , %loop ]
80
+ %iv.0.next = add nsw i2 %iv.0 , 1
81
+ %iv.1.next = add nsw i2 %iv.1 , 1
82
+ %.not.not = icmp ult i2 %iv.0 , %arg
83
+ br i1 %.not.not , label %exit , label %loop
84
+
85
+ exit:
86
+ ret i2 %iv.1.next
87
+ }
88
+
89
+ define i4 @iv_hoist_nsw_poison_extra_use (i4 %0 , i4 %end , i4 %start ) {
90
+ ; CHECK-LABEL: @iv_hoist_nsw_poison_extra_use(
91
+ ; CHECK-NEXT: entry:
92
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
93
+ ; CHECK: loop:
94
+ ; CHECK-NEXT: [[IV_0:%.*]] = phi i4 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_0_NEXT:%.*]], [[LOOP]] ]
95
+ ; CHECK-NEXT: [[IV_0_NEXT]] = add i4 [[IV_0]], 1
96
+ ; CHECK-NEXT: call void @use(i4 [[IV_0_NEXT]])
97
+ ; CHECK-NEXT: [[DOTNOT_NOT:%.*]] = icmp ult i4 [[IV_0]], [[END:%.*]]
98
+ ; CHECK-NEXT: br i1 [[DOTNOT_NOT]], label [[EXIT:%.*]], label [[LOOP]]
99
+ ; CHECK: exit:
100
+ ; CHECK-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i4 [ [[IV_0_NEXT]], [[LOOP]] ]
101
+ ; CHECK-NEXT: ret i4 [[IV_1_NEXT_LCSSA]]
102
+ ;
103
+ entry:
104
+ br label %loop
105
+
106
+ loop:
107
+ %iv.0 = phi i4 [ %start , %entry ], [ %iv.0.next , %loop ]
108
+ %iv.1 = phi i4 [ %start , %entry ], [ %iv.1.next , %loop ]
109
+ %iv.0.next = add i4 %iv.0 , 1
110
+ call void @use (i4 %iv.0.next )
111
+ %iv.1.next = add nsw i4 %iv.1 , 1
112
+ %.not.not = icmp ult i4 %iv.0 , %end
113
+ br i1 %.not.not , label %exit , label %loop
114
+
115
+ exit:
116
+ ret i4 %iv.1.next
117
+ }
118
+
119
+ declare void @use (i4 )
0 commit comments