@@ -11,8 +11,7 @@ define i1 @cmp_sext(i32 %a, i32 %b){
11
11
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
12
12
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
13
13
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
14
- ; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
15
- ; CHECK-NEXT: ret i1 [[CMP2]]
14
+ ; CHECK-NEXT: ret i1 true
16
15
; CHECK: else:
17
16
; CHECK-NEXT: ret i1 false
18
17
;
@@ -31,64 +30,66 @@ else:
31
30
ret i1 false
32
31
}
33
32
34
- define i1 @cmp_sext_positive_increment (i32 %a , i32 %b , i64 %c ){
35
- ; CHECK-LABEL: define i1 @cmp_sext_positive_increment (
36
- ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]] ) {
33
+ define i1 @cmp_sext_add (i32 %a , i32 %b ){
34
+ ; CHECK-LABEL: define i1 @cmp_sext_add (
35
+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
37
36
; CHECK-NEXT: entry:
38
- ; CHECK-NEXT: [[POS:%.*]] = icmp sgt i64 [[C]], 0
39
- ; CHECK-NEXT: call void @llvm.assume(i1 [[POS]])
40
37
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
41
38
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
42
39
; CHECK: then:
43
- ; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
44
- ; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
45
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], [[C]]
46
- ; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
47
- ; CHECK-NEXT: ret i1 [[CMP2]]
40
+ ; CHECK-NEXT: [[A1:%.*]] = add nsw i32 [[A]], 1
41
+ ; CHECK-NEXT: [[B1:%.*]] = add nsw i32 [[B]], 1
42
+ ; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A1]] to i64
43
+ ; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B1]] to i64
44
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
45
+ ; CHECK-NEXT: ret i1 true
48
46
; CHECK: else:
49
47
; CHECK-NEXT: ret i1 false
50
48
;
51
49
entry:
52
- %pos = icmp sgt i64 %c , 0
53
- call void @llvm.assume (i1 %pos )
54
50
%cmp = icmp slt i32 %a , %b
55
51
br i1 %cmp , label %then , label %else
56
52
57
53
then:
58
- %sa = sext i32 %a to i64
59
- %sb = sext i32 %b to i64
60
- %add = add nsw i64 %sa , %c
54
+ %a1 = add nsw i32 %a , 1
55
+ %b1 = add nsw i32 %b , 1
56
+ %sa = sext i32 %a1 to i64
57
+ %sb = sext i32 %b1 to i64
58
+ %add = add nsw i64 %sa , 1
61
59
%cmp2 = icmp sge i64 %sb , %add
62
60
ret i1 %cmp2
63
61
64
62
else:
65
63
ret i1 false
66
64
}
67
65
68
- define i1 @cmp_sext_sgt (i32 %a , i32 %b ){
69
- ; CHECK-LABEL: define i1 @cmp_sext_sgt (
70
- ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
66
+ define i1 @cmp_sext_dynamic_increment (i32 %a , i32 %b , i64 %c ){
67
+ ; CHECK-LABEL: define i1 @cmp_sext_dynamic_increment (
68
+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]] ) {
71
69
; CHECK-NEXT: entry:
70
+ ; CHECK-NEXT: [[POS:%.*]] = icmp slt i64 [[C]], 2
71
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[POS]])
72
72
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
73
73
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
74
74
; CHECK: then:
75
75
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
76
76
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
77
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
78
- ; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[SB]], [[ADD]]
79
- ; CHECK-NEXT: ret i1 [[CMP2]]
77
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], [[C]]
78
+ ; CHECK-NEXT: ret i1 true
80
79
; CHECK: else:
81
80
; CHECK-NEXT: ret i1 false
82
81
;
83
82
entry:
83
+ %pos = icmp slt i64 %c , 2
84
+ call void @llvm.assume (i1 %pos )
84
85
%cmp = icmp slt i32 %a , %b
85
86
br i1 %cmp , label %then , label %else
86
87
87
88
then:
88
89
%sa = sext i32 %a to i64
89
90
%sb = sext i32 %b to i64
90
- %add = add nsw i64 %sa , 1
91
- %cmp2 = icmp sgt i64 %sb , %add
91
+ %add = add nsw i64 %sa , %c
92
+ %cmp2 = icmp sge i64 %sb , %add
92
93
ret i1 %cmp2
93
94
94
95
else:
@@ -105,8 +106,7 @@ define i1 @cmp_zext_nneg(i32 %a, i32 %b){
105
106
; CHECK-NEXT: [[SA:%.*]] = zext nneg i32 [[A]] to i64
106
107
; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64
107
108
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
108
- ; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
109
- ; CHECK-NEXT: ret i1 [[CMP2]]
109
+ ; CHECK-NEXT: ret i1 true
110
110
; CHECK: else:
111
111
; CHECK-NEXT: ret i1 false
112
112
;
@@ -216,3 +216,33 @@ then:
216
216
else:
217
217
ret i1 false
218
218
}
219
+
220
+ define i1 @cmp_sext_sgt (i32 %a , i32 %b ){
221
+ ; CHECK-LABEL: define i1 @cmp_sext_sgt(
222
+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
223
+ ; CHECK-NEXT: entry:
224
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
225
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
226
+ ; CHECK: then:
227
+ ; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
228
+ ; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
229
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
230
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[SB]], [[ADD]]
231
+ ; CHECK-NEXT: ret i1 [[CMP2]]
232
+ ; CHECK: else:
233
+ ; CHECK-NEXT: ret i1 false
234
+ ;
235
+ entry:
236
+ %cmp = icmp slt i32 %a , %b
237
+ br i1 %cmp , label %then , label %else
238
+
239
+ then:
240
+ %sa = sext i32 %a to i64
241
+ %sb = sext i32 %b to i64
242
+ %add = add nsw i64 %sa , 1
243
+ %cmp2 = icmp sgt i64 %sb , %add
244
+ ret i1 %cmp2
245
+
246
+ else:
247
+ ret i1 false
248
+ }
0 commit comments