@@ -92,6 +92,60 @@ define i1 @icmp_add_v8i32(<8 x i32> %a) {
92
92
ret i1 %r
93
93
}
94
94
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
+
95
149
; Negative test - this could CSE/simplify.
96
150
97
151
define i1 @same_extract_index (<4 x i32 > %a ) {
0 commit comments