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