@@ -92,6 +92,63 @@ define i1 @icmp_add_v8i32(<8 x i32> %a) {
92
92
ret i1 %r
93
93
}
94
94
95
+ declare void @use.i1 (i1 )
96
+ declare void @use.i32 (i32 )
97
+ declare void @use.double (double )
98
+
99
+
100
+ define i1 @fcmp_and_v2f64_multiuse (<2 x double > %a ) {
101
+ ; SSE-LABEL: @fcmp_and_v2f64_multiuse(
102
+ ; SSE-NEXT: [[E1:%.*]] = extractelement <2 x double> [[A:%.*]], i32 0
103
+ ; SSE-NEXT: call void @use.double(double [[E1]])
104
+ ; SSE-NEXT: [[E2:%.*]] = extractelement <2 x double> [[A]], i32 1
105
+ ; SSE-NEXT: [[CMP1:%.*]] = fcmp olt double [[E1]], 4.200000e+01
106
+ ; SSE-NEXT: [[CMP2:%.*]] = fcmp olt double [[E2]], -8.000000e+00
107
+ ; SSE-NEXT: [[R:%.*]] = and i1 [[CMP1]], [[CMP2]]
108
+ ; SSE-NEXT: call void @use.i1(i1 [[R]])
109
+ ; SSE-NEXT: ret i1 [[R]]
110
+ ;
111
+ ; AVX-LABEL: @fcmp_and_v2f64_multiuse(
112
+ ; AVX-NEXT: [[E1:%.*]] = extractelement <2 x double> [[A:%.*]], i32 0
113
+ ; AVX-NEXT: call void @use.double(double [[E1]])
114
+ ; AVX-NEXT: [[TMP1:%.*]] = fcmp olt <2 x double> [[A]], <double 4.200000e+01, double -8.000000e+00>
115
+ ; AVX-NEXT: [[SHIFT:%.*]] = shufflevector <2 x i1> [[TMP1]], <2 x i1> poison, <2 x i32> <i32 1, i32 poison>
116
+ ; AVX-NEXT: [[TMP2:%.*]] = and <2 x i1> [[TMP1]], [[SHIFT]]
117
+ ; AVX-NEXT: [[R:%.*]] = extractelement <2 x i1> [[TMP2]], i64 0
118
+ ; AVX-NEXT: call void @use.i1(i1 [[R]])
119
+ ; AVX-NEXT: ret i1 [[R]]
120
+ ;
121
+ %e1 = extractelement <2 x double > %a , i32 0
122
+ call void @use.double (double %e1 )
123
+ %e2 = extractelement <2 x double > %a , i32 1
124
+ %cmp1 = fcmp olt double %e1 , 42 .0
125
+ %cmp2 = fcmp olt double %e2 , -8 .0
126
+ %r = and i1 %cmp1 , %cmp2
127
+ call void @use.i1 (i1 %r )
128
+ ret i1 %r
129
+ }
130
+
131
+ define i1 @icmp_xor_v4i32_multiuse (<4 x i32 > %a ) {
132
+ ; CHECK-LABEL: @icmp_xor_v4i32_multiuse(
133
+ ; CHECK-NEXT: [[E2:%.*]] = extractelement <4 x i32> [[A:%.*]], i32 1
134
+ ; CHECK-NEXT: call void @use.i32(i32 [[E2]])
135
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[A]], <i32 poison, i32 -8, i32 poison, i32 42>
136
+ ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x i1> [[TMP1]], <4 x i1> poison, <4 x i32> <i32 poison, i32 3, i32 poison, i32 poison>
137
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor <4 x i1> [[TMP1]], [[SHIFT]]
138
+ ; CHECK-NEXT: [[R:%.*]] = extractelement <4 x i1> [[TMP2]], i64 1
139
+ ; CHECK-NEXT: call void @use.i1(i1 [[R]])
140
+ ; CHECK-NEXT: ret i1 [[R]]
141
+ ;
142
+ %e1 = extractelement <4 x i32 > %a , i32 3
143
+ %e2 = extractelement <4 x i32 > %a , i32 1
144
+ call void @use.i32 (i32 %e2 )
145
+ %cmp1 = icmp sgt i32 %e1 , 42
146
+ %cmp2 = icmp sgt i32 %e2 , -8
147
+ %r = xor i1 %cmp1 , %cmp2
148
+ call void @use.i1 (i1 %r )
149
+ ret i1 %r
150
+ }
151
+
95
152
; Negative test - this could CSE/simplify.
96
153
97
154
define i1 @same_extract_index (<4 x i32 > %a ) {
0 commit comments