1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2
2
; RUN: opt < %s -constprop -S | FileCheck %s
3
3
4
- declare void @dummy (i8 )
5
- declare void @dummy_vec (<2 x i8 >)
6
-
7
4
declare i8 @llvm.uadd.sat.i8 (i8 , i8 )
8
5
declare i8 @llvm.sadd.sat.i8 (i8 , i8 )
9
6
declare <2 x i8 > @llvm.uadd.sat.v2i8 (<2 x i8 >, <2 x i8 >)
@@ -14,98 +11,162 @@ declare i8 @llvm.ssub.sat.i8(i8, i8)
14
11
declare <2 x i8 > @llvm.usub.sat.v2i8 (<2 x i8 >, <2 x i8 >)
15
12
declare <2 x i8 > @llvm.ssub.sat.v2i8 (<2 x i8 >, <2 x i8 >)
16
13
17
- define void @test_add_scalar () {
18
- ; CHECK-LABEL: @test_add_scalar(
19
- ; CHECK-NEXT: call void @dummy(i8 30)
20
- ; CHECK-NEXT: call void @dummy(i8 -1)
21
- ; CHECK-NEXT: call void @dummy(i8 -10)
22
- ; CHECK-NEXT: call void @dummy(i8 127)
23
- ; CHECK-NEXT: call void @dummy(i8 -128)
24
- ; CHECK-NEXT: ret void
25
- ;
26
- %x1 = call i8 @llvm.uadd.sat.i8 (i8 10 , i8 20 )
27
- call void @dummy (i8 %x1 )
28
- %x2 = call i8 @llvm.uadd.sat.i8 (i8 250 , i8 100 )
29
- call void @dummy (i8 %x2 )
30
-
31
- %y1 = call i8 @llvm.sadd.sat.i8 (i8 10 , i8 -20 )
32
- call void @dummy (i8 %y1 )
33
- %y2 = call i8 @llvm.sadd.sat.i8 (i8 120 , i8 10 )
34
- call void @dummy (i8 %y2 )
35
- %y3 = call i8 @llvm.sadd.sat.i8 (i8 -120 , i8 -10 )
36
- call void @dummy (i8 %y3 )
37
-
38
- ret void
39
- }
40
-
41
- define void @test_add_vector (<2 x i8 > %a ) {
42
- ; CHECK-LABEL: @test_add_vector(
43
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 20, i8 30>)
44
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 -1, i8 -1>)
45
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 -10, i8 -30>)
46
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 127, i8 127>)
47
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 -128, i8 -128>)
48
- ; CHECK-NEXT: ret void
49
- ;
50
- %x1 = call <2 x i8 > @llvm.uadd.sat.v2i8 (<2 x i8 > <i8 10 , i8 15 >, <2 x i8 > <i8 10 , i8 15 >)
51
- call void @dummy_vec (<2 x i8 > %x1 )
52
- %x2 = call <2 x i8 > @llvm.uadd.sat.v2i8 (<2 x i8 > <i8 100 , i8 200 >, <2 x i8 > <i8 250 , i8 100 >)
53
- call void @dummy_vec (<2 x i8 > %x2 )
54
-
55
- %y1 = call <2 x i8 > @llvm.sadd.sat.v2i8 (<2 x i8 > <i8 10 , i8 -15 >, <2 x i8 > <i8 -20 , i8 -15 >)
56
- call void @dummy_vec (<2 x i8 > %y1 )
57
- %y2 = call <2 x i8 > @llvm.sadd.sat.v2i8 (<2 x i8 > <i8 100 , i8 10 >, <2 x i8 > <i8 30 , i8 120 >)
58
- call void @dummy_vec (<2 x i8 > %y2 )
59
- %y3 = call <2 x i8 > @llvm.sadd.sat.v2i8 (<2 x i8 > <i8 -100 , i8 -10 >, <2 x i8 > <i8 -30 , i8 -120 >)
60
- call void @dummy_vec (<2 x i8 > %y3 )
61
-
62
- ret void
63
- }
64
-
65
- define void @test_usub_ssub_scalar () {
66
- ; CHECK-LABEL: @test_usub_ssub_scalar(
67
- ; CHECK-NEXT: call void @dummy(i8 10)
68
- ; CHECK-NEXT: call void @dummy(i8 0)
69
- ; CHECK-NEXT: call void @dummy(i8 -30)
70
- ; CHECK-NEXT: call void @dummy(i8 127)
71
- ; CHECK-NEXT: call void @dummy(i8 -128)
72
- ; CHECK-NEXT: ret void
73
- ;
74
- %x1 = call i8 @llvm.usub.sat.i8 (i8 20 , i8 10 )
75
- call void @dummy (i8 %x1 )
76
- %x2 = call i8 @llvm.usub.sat.i8 (i8 200 , i8 250 )
77
- call void @dummy (i8 %x2 )
78
-
79
- %y1 = call i8 @llvm.ssub.sat.i8 (i8 -10 , i8 20 )
80
- call void @dummy (i8 %y1 )
81
- %y2 = call i8 @llvm.ssub.sat.i8 (i8 120 , i8 -10 )
82
- call void @dummy (i8 %y2 )
83
- %y3 = call i8 @llvm.ssub.sat.i8 (i8 -120 , i8 10 )
84
- call void @dummy (i8 %y3 )
85
-
86
- ret void
87
- }
88
-
89
- define void @test_sub_vector (<2 x i8 > %a ) {
90
- ; CHECK-LABEL: @test_sub_vector(
91
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 10, i8 5>)
92
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> zeroinitializer)
93
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 30, i8 0>)
94
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 127, i8 127>)
95
- ; CHECK-NEXT: call void @dummy_vec(<2 x i8> <i8 -128, i8 -128>)
96
- ; CHECK-NEXT: ret void
97
- ;
98
- %x1 = call <2 x i8 > @llvm.usub.sat.v2i8 (<2 x i8 > <i8 20 , i8 15 >, <2 x i8 > <i8 10 , i8 10 >)
99
- call void @dummy_vec (<2 x i8 > %x1 )
100
- %x2 = call <2 x i8 > @llvm.usub.sat.v2i8 (<2 x i8 > <i8 100 , i8 200 >, <2 x i8 > <i8 150 , i8 250 >)
101
- call void @dummy_vec (<2 x i8 > %x2 )
102
-
103
- %y1 = call <2 x i8 > @llvm.ssub.sat.v2i8 (<2 x i8 > <i8 10 , i8 -15 >, <2 x i8 > <i8 -20 , i8 -15 >)
104
- call void @dummy_vec (<2 x i8 > %y1 )
105
- %y2 = call <2 x i8 > @llvm.ssub.sat.v2i8 (<2 x i8 > <i8 100 , i8 10 >, <2 x i8 > <i8 -30 , i8 -120 >)
106
- call void @dummy_vec (<2 x i8 > %y2 )
107
- %y3 = call <2 x i8 > @llvm.ssub.sat.v2i8 (<2 x i8 > <i8 -100 , i8 -10 >, <2 x i8 > <i8 30 , i8 120 >)
108
- call void @dummy_vec (<2 x i8 > %y3 )
109
-
110
- ret void
14
+ define i8 @test_uadd_scalar_no_sat () {
15
+ ; CHECK-LABEL: @test_uadd_scalar_no_sat(
16
+ ; CHECK-NEXT: ret i8 30
17
+ ;
18
+ %x = call i8 @llvm.uadd.sat.i8 (i8 10 , i8 20 )
19
+ ret i8 %x
20
+ }
21
+
22
+ define i8 @test_uadd_scalar_sat () {
23
+ ; CHECK-LABEL: @test_uadd_scalar_sat(
24
+ ; CHECK-NEXT: ret i8 -1
25
+ ;
26
+ %x = call i8 @llvm.uadd.sat.i8 (i8 250 , i8 100 )
27
+ ret i8 %x
28
+ }
29
+
30
+ define i8 @test_sadd_scalar_no_sat () {
31
+ ; CHECK-LABEL: @test_sadd_scalar_no_sat(
32
+ ; CHECK-NEXT: ret i8 -10
33
+ ;
34
+ %x = call i8 @llvm.sadd.sat.i8 (i8 10 , i8 -20 )
35
+ ret i8 %x
36
+ }
37
+
38
+ define i8 @test_sadd_scalar_sat_pos () {
39
+ ; CHECK-LABEL: @test_sadd_scalar_sat_pos(
40
+ ; CHECK-NEXT: ret i8 127
41
+ ;
42
+ %x = call i8 @llvm.sadd.sat.i8 (i8 120 , i8 10 )
43
+ ret i8 %x
44
+ }
45
+
46
+ define i8 @test_sadd_scalar_sat_neg () {
47
+ ; CHECK-LABEL: @test_sadd_scalar_sat_neg(
48
+ ; CHECK-NEXT: ret i8 -128
49
+ ;
50
+ %x = call i8 @llvm.sadd.sat.i8 (i8 -120 , i8 -10 )
51
+ ret i8 %x
52
+ }
53
+
54
+ define <2 x i8 > @test_uadd_vector_no_sat (<2 x i8 > %a ) {
55
+ ; CHECK-LABEL: @test_uadd_vector_no_sat(
56
+ ; CHECK-NEXT: ret <2 x i8> <i8 20, i8 30>
57
+ ;
58
+ %x = call <2 x i8 > @llvm.uadd.sat.v2i8 (<2 x i8 > <i8 10 , i8 15 >, <2 x i8 > <i8 10 , i8 15 >)
59
+ ret <2 x i8 > %x
60
+ }
61
+
62
+ define <2 x i8 > @test_uadd_vector_sat (<2 x i8 > %a ) {
63
+ ; CHECK-LABEL: @test_uadd_vector_sat(
64
+ ; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1>
65
+ ;
66
+ %x = call <2 x i8 > @llvm.uadd.sat.v2i8 (<2 x i8 > <i8 100 , i8 200 >, <2 x i8 > <i8 250 , i8 100 >)
67
+ ret <2 x i8 > %x
68
+ }
69
+
70
+ define <2 x i8 > @test_sadd_vector_no_sat (<2 x i8 > %a ) {
71
+ ; CHECK-LABEL: @test_sadd_vector_no_sat(
72
+ ; CHECK-NEXT: ret <2 x i8> <i8 -10, i8 -30>
73
+ ;
74
+ %x = call <2 x i8 > @llvm.sadd.sat.v2i8 (<2 x i8 > <i8 10 , i8 -15 >, <2 x i8 > <i8 -20 , i8 -15 >)
75
+ ret <2 x i8 > %x
76
+ }
77
+
78
+ define <2 x i8 > @test_sadd_vector_sat_pos (<2 x i8 > %a ) {
79
+ ; CHECK-LABEL: @test_sadd_vector_sat_pos(
80
+ ; CHECK-NEXT: ret <2 x i8> <i8 127, i8 127>
81
+ ;
82
+ %x = call <2 x i8 > @llvm.sadd.sat.v2i8 (<2 x i8 > <i8 100 , i8 10 >, <2 x i8 > <i8 30 , i8 120 >)
83
+ ret <2 x i8 > %x
84
+ }
85
+
86
+ define <2 x i8 > @test_sadd_vector_sat_neg (<2 x i8 > %a ) {
87
+ ; CHECK-LABEL: @test_sadd_vector_sat_neg(
88
+ ; CHECK-NEXT: ret <2 x i8> <i8 -128, i8 -128>
89
+ ;
90
+ %x = call <2 x i8 > @llvm.sadd.sat.v2i8 (<2 x i8 > <i8 -100 , i8 -10 >, <2 x i8 > <i8 -30 , i8 -120 >)
91
+ ret <2 x i8 > %x
92
+ }
93
+
94
+ define i8 @test_usub_scalar_no_sat () {
95
+ ; CHECK-LABEL: @test_usub_scalar_no_sat(
96
+ ; CHECK-NEXT: ret i8 10
97
+ ;
98
+ %x = call i8 @llvm.usub.sat.i8 (i8 20 , i8 10 )
99
+ ret i8 %x
100
+ }
101
+
102
+ define i8 @test_usub_scalar_sat () {
103
+ ; CHECK-LABEL: @test_usub_scalar_sat(
104
+ ; CHECK-NEXT: ret i8 0
105
+ ;
106
+ %x = call i8 @llvm.usub.sat.i8 (i8 200 , i8 250 )
107
+ ret i8 %x
108
+ }
109
+
110
+ define i8 @test_ssub_scalar_no_sat () {
111
+ ; CHECK-LABEL: @test_ssub_scalar_no_sat(
112
+ ; CHECK-NEXT: ret i8 -30
113
+ ;
114
+ %x = call i8 @llvm.ssub.sat.i8 (i8 -10 , i8 20 )
115
+ ret i8 %x
116
+ }
117
+
118
+ define i8 @test_ssub_scalar_sat_pos () {
119
+ ; CHECK-LABEL: @test_ssub_scalar_sat_pos(
120
+ ; CHECK-NEXT: ret i8 127
121
+ ;
122
+ %x = call i8 @llvm.ssub.sat.i8 (i8 120 , i8 -10 )
123
+ ret i8 %x
124
+ }
125
+
126
+ define i8 @test_ssub_scalar_sat_neg () {
127
+ ; CHECK-LABEL: @test_ssub_scalar_sat_neg(
128
+ ; CHECK-NEXT: ret i8 -128
129
+ ;
130
+ %x = call i8 @llvm.ssub.sat.i8 (i8 -120 , i8 10 )
131
+ ret i8 %x
132
+ }
133
+
134
+ define <2 x i8 > @test_usub_vector_no_sat (<2 x i8 > %a ) {
135
+ ; CHECK-LABEL: @test_usub_vector_no_sat(
136
+ ; CHECK-NEXT: ret <2 x i8> <i8 10, i8 5>
137
+ ;
138
+ %x = call <2 x i8 > @llvm.usub.sat.v2i8 (<2 x i8 > <i8 20 , i8 15 >, <2 x i8 > <i8 10 , i8 10 >)
139
+ ret <2 x i8 > %x
140
+ }
141
+
142
+ define <2 x i8 > @test_usub_vector_sat (<2 x i8 > %a ) {
143
+ ; CHECK-LABEL: @test_usub_vector_sat(
144
+ ; CHECK-NEXT: ret <2 x i8> zeroinitializer
145
+ ;
146
+ %x = call <2 x i8 > @llvm.usub.sat.v2i8 (<2 x i8 > <i8 100 , i8 200 >, <2 x i8 > <i8 150 , i8 250 >)
147
+ ret <2 x i8 > %x
148
+ }
149
+
150
+ define <2 x i8 > @test_ssub_vector_no_sat (<2 x i8 > %a ) {
151
+ ; CHECK-LABEL: @test_ssub_vector_no_sat(
152
+ ; CHECK-NEXT: ret <2 x i8> <i8 30, i8 0>
153
+ ;
154
+ %x = call <2 x i8 > @llvm.ssub.sat.v2i8 (<2 x i8 > <i8 10 , i8 -15 >, <2 x i8 > <i8 -20 , i8 -15 >)
155
+ ret <2 x i8 > %x
156
+ }
157
+
158
+ define <2 x i8 > @test_ssub_vector_sat_pos (<2 x i8 > %a ) {
159
+ ; CHECK-LABEL: @test_ssub_vector_sat_pos(
160
+ ; CHECK-NEXT: ret <2 x i8> <i8 127, i8 127>
161
+ ;
162
+ %x = call <2 x i8 > @llvm.ssub.sat.v2i8 (<2 x i8 > <i8 100 , i8 10 >, <2 x i8 > <i8 -30 , i8 -120 >)
163
+ ret <2 x i8 > %x
164
+ }
165
+
166
+ define <2 x i8 > @test_ssub_vector_sat_neg (<2 x i8 > %a ) {
167
+ ; CHECK-LABEL: @test_ssub_vector_sat_neg(
168
+ ; CHECK-NEXT: ret <2 x i8> <i8 -128, i8 -128>
169
+ ;
170
+ %x = call <2 x i8 > @llvm.ssub.sat.v2i8 (<2 x i8 > <i8 -100 , i8 -10 >, <2 x i8 > <i8 30 , i8 120 >)
171
+ ret <2 x i8 > %x
111
172
}
0 commit comments