@@ -15,8 +15,7 @@ declare void @barrier()
15
15
16
16
define <2 x i8 > @umax_xor_Cpow2 (<2 x i8 > %x ) {
17
17
; CHECK-LABEL: @umax_xor_Cpow2(
18
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor <2 x i8> [[X:%.*]], <i8 -128, i8 -128>
19
- ; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.umax.v2i8(<2 x i8> [[X]], <2 x i8> [[X_XOR]])
18
+ ; CHECK-NEXT: [[R:%.*]] = or <2 x i8> [[X:%.*]], <i8 -128, i8 -128>
20
19
; CHECK-NEXT: ret <2 x i8> [[R]]
21
20
;
22
21
%x_xor = xor <2 x i8 > %x , <i8 128 , i8 128 >
@@ -26,8 +25,7 @@ define <2 x i8> @umax_xor_Cpow2(<2 x i8> %x) {
26
25
27
26
define i8 @umin_xor_Cpow2 (i8 %x ) {
28
27
; CHECK-LABEL: @umin_xor_Cpow2(
29
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor i8 [[X:%.*]], 64
30
- ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[X_XOR]])
28
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[X:%.*]], -65
31
29
; CHECK-NEXT: ret i8 [[R]]
32
30
;
33
31
%x_xor = xor i8 %x , 64
@@ -37,8 +35,7 @@ define i8 @umin_xor_Cpow2(i8 %x) {
37
35
38
36
define i8 @smax_xor_Cpow2_pos (i8 %x ) {
39
37
; CHECK-LABEL: @smax_xor_Cpow2_pos(
40
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor i8 [[X:%.*]], 32
41
- ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[X_XOR]])
38
+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[X:%.*]], 32
42
39
; CHECK-NEXT: ret i8 [[R]]
43
40
;
44
41
%x_xor = xor i8 %x , 32
@@ -48,8 +45,7 @@ define i8 @smax_xor_Cpow2_pos(i8 %x) {
48
45
49
46
define <2 x i8 > @smin_xor_Cpow2_pos (<2 x i8 > %x ) {
50
47
; CHECK-LABEL: @smin_xor_Cpow2_pos(
51
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor <2 x i8> [[X:%.*]], <i8 16, i8 16>
52
- ; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[X]], <2 x i8> [[X_XOR]])
48
+ ; CHECK-NEXT: [[R:%.*]] = and <2 x i8> [[X:%.*]], <i8 -17, i8 -17>
53
49
; CHECK-NEXT: ret <2 x i8> [[R]]
54
50
;
55
51
%x_xor = xor <2 x i8 > %x , <i8 16 , i8 16 >
@@ -59,8 +55,7 @@ define <2 x i8> @smin_xor_Cpow2_pos(<2 x i8> %x) {
59
55
60
56
define <2 x i8 > @smax_xor_Cpow2_neg (<2 x i8 > %x ) {
61
57
; CHECK-LABEL: @smax_xor_Cpow2_neg(
62
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor <2 x i8> [[X:%.*]], <i8 -128, i8 -128>
63
- ; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> [[X_XOR]])
58
+ ; CHECK-NEXT: [[R:%.*]] = and <2 x i8> [[X:%.*]], <i8 127, i8 127>
64
59
; CHECK-NEXT: ret <2 x i8> [[R]]
65
60
;
66
61
%x_xor = xor <2 x i8 > %x , <i8 128 , i8 128 >
@@ -70,8 +65,7 @@ define <2 x i8> @smax_xor_Cpow2_neg(<2 x i8> %x) {
70
65
71
66
define i8 @smin_xor_Cpow2_neg (i8 %x ) {
72
67
; CHECK-LABEL: @smin_xor_Cpow2_neg(
73
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor i8 [[X:%.*]], -128
74
- ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[X_XOR]])
68
+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[X:%.*]], -128
75
69
; CHECK-NEXT: ret i8 [[R]]
76
70
;
77
71
%x_xor = xor i8 %x , 128
@@ -83,8 +77,7 @@ define i8 @umax_xor_pow2(i8 %x, i8 %y) {
83
77
; CHECK-LABEL: @umax_xor_pow2(
84
78
; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]
85
79
; CHECK-NEXT: [[YP2:%.*]] = and i8 [[NY]], [[Y]]
86
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor i8 [[YP2]], [[X:%.*]]
87
- ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[X_XOR]])
80
+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[YP2]], [[X:%.*]]
88
81
; CHECK-NEXT: ret i8 [[R]]
89
82
;
90
83
%ny = sub i8 0 , %y
@@ -98,8 +91,8 @@ define <2 x i8> @umin_xor_pow2(<2 x i8> %x, <2 x i8> %y) {
98
91
; CHECK-LABEL: @umin_xor_pow2(
99
92
; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]
100
93
; CHECK-NEXT: [[YP2:%.*]] = and <2 x i8> [[NY]], [[Y]]
101
- ; CHECK-NEXT: [[X_XOR :%.*]] = xor <2 x i8> [[YP2]], [[X:%.*]]
102
- ; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[X ]], <2 x i8> [[X_XOR]])
94
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <2 x i8> [[YP2]], <i8 -1, i8 -1>
95
+ ; CHECK-NEXT: [[R:%.*]] = and <2 x i8> [[TMP1 ]], [[X:%.*]]
103
96
; CHECK-NEXT: ret <2 x i8> [[R]]
104
97
;
105
98
%ny = sub <2 x i8 > <i8 0 , i8 0 >, %y
@@ -146,8 +139,7 @@ define i8 @smax_xor_pow2_neg(i8 %x, i8 %y) {
146
139
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[YP2]], 0
147
140
; CHECK-NEXT: br i1 [[CMP]], label [[NEG:%.*]], label [[POS:%.*]]
148
141
; CHECK: neg:
149
- ; CHECK-NEXT: [[X_XOR:%.*]] = xor i8 [[YP2]], [[X:%.*]]
150
- ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[X_XOR]])
142
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[X:%.*]], 127
151
143
; CHECK-NEXT: ret i8 [[R]]
152
144
; CHECK: pos:
153
145
; CHECK-NEXT: call void @barrier()
@@ -173,8 +165,8 @@ define i8 @smin_xor_pow2_pos(i8 %x, i8 %y) {
173
165
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[YP2]], 0
174
166
; CHECK-NEXT: br i1 [[CMP]], label [[NEG:%.*]], label [[POS:%.*]]
175
167
; CHECK: neg:
176
- ; CHECK-NEXT: [[X_XOR :%.*]] = xor i8 [[YP2]], [[X:%.*]]
177
- ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.smin.i8(i8 [[X ]], i8 [[X_XOR]])
168
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[YP2]], -1
169
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[TMP1 ]], [[X:%.*]]
178
170
; CHECK-NEXT: ret i8 [[R]]
179
171
; CHECK: pos:
180
172
; CHECK-NEXT: call void @barrier()
0 commit comments