514 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -mtriple=x86_64-- -S | FileCheck %s --check-prefixes=CHECK,SSE3; RUN: opt < %s -passes=slp-vectorizer -mtriple=x86_64-- -mattr=avx512vl -S | FileCheck %s --check-prefixes=CHECK,AVX4 5declare void @use1(i1)6 7define i1 @logical_and_icmp(<4 x i32> %x) {8; CHECK-LABEL: @logical_and_icmp(9; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[X:%.*]], zeroinitializer10; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]11; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP2]])12; CHECK-NEXT: ret i1 [[TMP3]]13;14 %x0 = extractelement <4 x i32> %x, i32 015 %x1 = extractelement <4 x i32> %x, i32 116 %x2 = extractelement <4 x i32> %x, i32 217 %x3 = extractelement <4 x i32> %x, i32 318 %c0 = icmp slt i32 %x0, 019 %c1 = icmp slt i32 %x1, 020 %c2 = icmp slt i32 %x2, 021 %c3 = icmp slt i32 %x3, 022 %s1 = select i1 %c0, i1 %c1, i1 false23 %s2 = select i1 %s1, i1 %c2, i1 false24 %s3 = select i1 %s2, i1 %c3, i1 false25 ret i1 %s326}27 28define i1 @logical_or_icmp(<4 x i32> %x, <4 x i32> %y) {29; CHECK-LABEL: @logical_or_icmp(30; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[X:%.*]], [[Y:%.*]]31; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]32; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])33; CHECK-NEXT: ret i1 [[TMP3]]34;35 %x0 = extractelement <4 x i32> %x, i32 036 %x1 = extractelement <4 x i32> %x, i32 137 %x2 = extractelement <4 x i32> %x, i32 238 %x3 = extractelement <4 x i32> %x, i32 339 %y0 = extractelement <4 x i32> %y, i32 040 %y1 = extractelement <4 x i32> %y, i32 141 %y2 = extractelement <4 x i32> %y, i32 242 %y3 = extractelement <4 x i32> %y, i32 343 %c0 = icmp slt i32 %x0, %y044 %c1 = icmp slt i32 %x1, %y145 %c2 = icmp slt i32 %x2, %y246 %c3 = icmp slt i32 %x3, %y347 %s1 = select i1 %c0, i1 true, i1 %c148 %s2 = select i1 %s1, i1 true, i1 %c249 %s3 = select i1 %s2, i1 true, i1 %c350 ret i1 %s351}52 53define i1 @logical_and_fcmp(<4 x float> %x) {54; CHECK-LABEL: @logical_and_fcmp(55; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt <4 x float> [[X:%.*]], zeroinitializer56; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]57; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP2]])58; CHECK-NEXT: ret i1 [[TMP3]]59;60 %x0 = extractelement <4 x float> %x, i32 061 %x1 = extractelement <4 x float> %x, i32 162 %x2 = extractelement <4 x float> %x, i32 263 %x3 = extractelement <4 x float> %x, i32 364 %c0 = fcmp olt float %x0, 0.065 %c1 = fcmp olt float %x1, 0.066 %c2 = fcmp olt float %x2, 0.067 %c3 = fcmp olt float %x3, 0.068 %s1 = select i1 %c0, i1 %c1, i1 false69 %s2 = select i1 %s1, i1 %c2, i1 false70 %s3 = select i1 %s2, i1 %c3, i1 false71 ret i1 %s372}73 74define i1 @logical_or_fcmp(<4 x float> %x) {75; CHECK-LABEL: @logical_or_fcmp(76; CHECK-NEXT: [[TMP1:%.*]] = fcmp olt <4 x float> [[X:%.*]], zeroinitializer77; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]78; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])79; CHECK-NEXT: ret i1 [[TMP3]]80;81 %x0 = extractelement <4 x float> %x, i32 082 %x1 = extractelement <4 x float> %x, i32 183 %x2 = extractelement <4 x float> %x, i32 284 %x3 = extractelement <4 x float> %x, i32 385 %c0 = fcmp olt float %x0, 0.086 %c1 = fcmp olt float %x1, 0.087 %c2 = fcmp olt float %x2, 0.088 %c3 = fcmp olt float %x3, 0.089 %s1 = select i1 %c0, i1 true, i1 %c190 %s2 = select i1 %s1, i1 true, i1 %c291 %s3 = select i1 %s2, i1 true, i1 %c392 ret i1 %s393}94 95define i1 @logical_and_icmp_diff_preds(<4 x i32> %x) {96; SSE-LABEL: @logical_and_icmp_diff_preds(97; SSE-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> <i32 poison, i32 poison, i32 0, i32 poison>, <4 x i32> <i32 1, i32 3, i32 6, i32 0>98; SSE-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[X]], <4 x i32> <i32 0, i32 0, i32 poison, i32 0>, <4 x i32> <i32 4, i32 5, i32 2, i32 7>99; SSE-NEXT: [[TMP3:%.*]] = icmp slt <4 x i32> [[TMP1]], [[TMP2]]100; SSE-NEXT: [[TMP4:%.*]] = icmp ult <4 x i32> [[TMP1]], [[TMP2]]101; SSE-NEXT: [[TMP5:%.*]] = shufflevector <4 x i1> [[TMP3]], <4 x i1> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>102; SSE-NEXT: [[TMP6:%.*]] = freeze <4 x i1> [[TMP5]]103; SSE-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP6]])104; SSE-NEXT: ret i1 [[TMP7]]105;106; AVX-LABEL: @logical_and_icmp_diff_preds(107; AVX-NEXT: [[X0:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 0108; AVX-NEXT: [[X1:%.*]] = extractelement <4 x i32> [[X]], i32 1109; AVX-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X]], i32 2110; AVX-NEXT: [[X3:%.*]] = extractelement <4 x i32> [[X]], i32 3111; AVX-NEXT: [[C0:%.*]] = icmp ult i32 [[X0]], 0112; AVX-NEXT: [[C1:%.*]] = icmp slt i32 [[X1]], 0113; AVX-NEXT: [[C2:%.*]] = icmp sgt i32 [[X2]], 0114; AVX-NEXT: [[C3:%.*]] = icmp slt i32 [[X3]], 0115; AVX-NEXT: [[S1:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false116; AVX-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 [[C2]], i1 false117; AVX-NEXT: [[S3:%.*]] = select i1 [[S2]], i1 [[C3]], i1 false118; AVX-NEXT: ret i1 [[S3]]119;120 %x0 = extractelement <4 x i32> %x, i32 0121 %x1 = extractelement <4 x i32> %x, i32 1122 %x2 = extractelement <4 x i32> %x, i32 2123 %x3 = extractelement <4 x i32> %x, i32 3124 %c0 = icmp ult i32 %x0, 0125 %c1 = icmp slt i32 %x1, 0126 %c2 = icmp sgt i32 %x2, 0127 %c3 = icmp slt i32 %x3, 0128 %s1 = select i1 %c0, i1 %c1, i1 false129 %s2 = select i1 %s1, i1 %c2, i1 false130 %s3 = select i1 %s2, i1 %c3, i1 false131 ret i1 %s3132}133 134define i1 @logical_and_icmp_diff_const(<4 x i32> %x) {135; CHECK-LABEL: @logical_and_icmp_diff_const(136; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[X:%.*]], <i32 0, i32 1, i32 2, i32 3>137; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]138; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP2]])139; CHECK-NEXT: ret i1 [[TMP3]]140;141 %x0 = extractelement <4 x i32> %x, i32 0142 %x1 = extractelement <4 x i32> %x, i32 1143 %x2 = extractelement <4 x i32> %x, i32 2144 %x3 = extractelement <4 x i32> %x, i32 3145 %c0 = icmp sgt i32 %x0, 0146 %c1 = icmp sgt i32 %x1, 1147 %c2 = icmp sgt i32 %x2, 2148 %c3 = icmp sgt i32 %x3, 3149 %s1 = select i1 %c0, i1 %c1, i1 false150 %s2 = select i1 %s1, i1 %c2, i1 false151 %s3 = select i1 %s2, i1 %c3, i1 false152 ret i1 %s3153}154 155define i1 @mixed_logical_icmp(<4 x i32> %x) {156; CHECK-LABEL: @mixed_logical_icmp(157; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[X:%.*]], zeroinitializer158; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i1> [[TMP1]], i32 0159; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i1> [[TMP1]], i32 1160; CHECK-NEXT: [[S1:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 false161; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i1> [[TMP1]], i32 2162; CHECK-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 true, i1 [[TMP4]]163; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i1> [[TMP1]], i32 3164; CHECK-NEXT: [[S3:%.*]] = select i1 [[S2]], i1 [[TMP5]], i1 false165; CHECK-NEXT: ret i1 [[S3]]166;167 %x0 = extractelement <4 x i32> %x, i32 0168 %x1 = extractelement <4 x i32> %x, i32 1169 %x2 = extractelement <4 x i32> %x, i32 2170 %x3 = extractelement <4 x i32> %x, i32 3171 %c0 = icmp sgt i32 %x0, 0172 %c1 = icmp sgt i32 %x1, 0173 %c2 = icmp sgt i32 %x2, 0174 %c3 = icmp sgt i32 %x3, 0175 %s1 = select i1 %c0, i1 %c1, i1 false176 %s2 = select i1 %s1, i1 true, i1 %c2177 %s3 = select i1 %s2, i1 %c3, i1 false178 ret i1 %s3179}180 181define i1 @logical_and_icmp_subvec(<4 x i32> %x) {182; CHECK-LABEL: @logical_and_icmp_subvec(183; CHECK-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 2184; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[X]], <4 x i32> poison, <2 x i32> <i32 0, i32 1>185; CHECK-NEXT: [[TMP2:%.*]] = icmp slt <2 x i32> [[TMP1]], zeroinitializer186; CHECK-NEXT: [[C2:%.*]] = icmp slt i32 [[X2]], 0187; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i1> [[TMP2]], i32 0188; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i1> [[TMP2]], i32 1189; CHECK-NEXT: [[S1:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false190; CHECK-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 [[C2]], i1 false191; CHECK-NEXT: ret i1 [[S2]]192;193 %x0 = extractelement <4 x i32> %x, i32 0194 %x1 = extractelement <4 x i32> %x, i32 1195 %x2 = extractelement <4 x i32> %x, i32 2196 %c0 = icmp slt i32 %x0, 0197 %c1 = icmp slt i32 %x1, 0198 %c2 = icmp slt i32 %x2, 0199 %s1 = select i1 %c0, i1 %c1, i1 false200 %s2 = select i1 %s1, i1 %c2, i1 false201 ret i1 %s2202}203 204; TODO: This is better than all-scalar and still safe,205; but we want this to be 2 reductions with glue206; logic...or a wide reduction?207 208define i1 @logical_and_icmp_clamp(<4 x i32> %x) {209; CHECK-LABEL: @logical_and_icmp_clamp(210; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[X:%.*]], splat (i32 42)211; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt <4 x i32> [[X]], splat (i32 17)212; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i1> [[TMP2]], <4 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>213; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i1> [[TMP1]], <4 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>214; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <8 x i1> [[TMP3]], <8 x i1> [[TMP7]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>215; CHECK-NEXT: [[TMP5:%.*]] = freeze <8 x i1> [[TMP4]]216; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> [[TMP5]])217; CHECK-NEXT: ret i1 [[TMP6]]218;219 %x0 = extractelement <4 x i32> %x, i32 0220 %x1 = extractelement <4 x i32> %x, i32 1221 %x2 = extractelement <4 x i32> %x, i32 2222 %x3 = extractelement <4 x i32> %x, i32 3223 %c0 = icmp slt i32 %x0, 42224 %c1 = icmp slt i32 %x1, 42225 %c2 = icmp slt i32 %x2, 42226 %c3 = icmp slt i32 %x3, 42227 %d0 = icmp sgt i32 %x0, 17228 %d1 = icmp sgt i32 %x1, 17229 %d2 = icmp sgt i32 %x2, 17230 %d3 = icmp sgt i32 %x3, 17231 %s1 = select i1 %c0, i1 %c1, i1 false232 %s2 = select i1 %s1, i1 %c2, i1 false233 %s3 = select i1 %s2, i1 %c3, i1 false234 %s4 = select i1 %s3, i1 %d0, i1 false235 %s5 = select i1 %s4, i1 %d1, i1 false236 %s6 = select i1 %s5, i1 %d2, i1 false237 %s7 = select i1 %s6, i1 %d3, i1 false238 ret i1 %s7239}240 241define i1 @logical_and_icmp_clamp_extra_use_cmp(<4 x i32> %x) {242; CHECK-LABEL: @logical_and_icmp_clamp_extra_use_cmp(243; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[X:%.*]], splat (i32 42)244; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i1> [[TMP1]], i32 2245; CHECK-NEXT: call void @use1(i1 [[TMP5]])246; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt <4 x i32> [[X]], splat (i32 17)247; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <4 x i1> [[TMP3]], <4 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>248; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <4 x i1> [[TMP1]], <4 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>249; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <8 x i1> [[TMP8]], <8 x i1> [[TMP9]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>250; CHECK-NEXT: [[TMP6:%.*]] = freeze <8 x i1> [[TMP4]]251; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> [[TMP6]])252; CHECK-NEXT: ret i1 [[TMP7]]253;254 %x0 = extractelement <4 x i32> %x, i32 0255 %x1 = extractelement <4 x i32> %x, i32 1256 %x2 = extractelement <4 x i32> %x, i32 2257 %x3 = extractelement <4 x i32> %x, i32 3258 %c0 = icmp slt i32 %x0, 42259 %c1 = icmp slt i32 %x1, 42260 %c2 = icmp slt i32 %x2, 42261 call void @use1(i1 %c2)262 %c3 = icmp slt i32 %x3, 42263 %d0 = icmp sgt i32 %x0, 17264 %d1 = icmp sgt i32 %x1, 17265 %d2 = icmp sgt i32 %x2, 17266 %d3 = icmp sgt i32 %x3, 17267 %s1 = select i1 %c0, i1 %c1, i1 false268 %s2 = select i1 %s1, i1 %c2, i1 false269 %s3 = select i1 %s2, i1 %c3, i1 false270 %s4 = select i1 %s3, i1 %d0, i1 false271 %s5 = select i1 %s4, i1 %d1, i1 false272 %s6 = select i1 %s5, i1 %d2, i1 false273 %s7 = select i1 %s6, i1 %d3, i1 false274 ret i1 %s7275}276 277define i1 @logical_and_icmp_clamp_extra_use_select(<4 x i32> %x) {278; CHECK-LABEL: @logical_and_icmp_clamp_extra_use_select(279; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[X:%.*]], splat (i32 42)280; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt <4 x i32> [[X]], splat (i32 17)281; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i1> [[TMP1]], i32 0282; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i1> [[TMP1]], i32 1283; CHECK-NEXT: [[S1:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false284; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i1> [[TMP1]], i32 2285; CHECK-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 [[TMP5]], i1 false286; CHECK-NEXT: call void @use1(i1 [[S2]])287; CHECK-NEXT: [[TMP6:%.*]] = freeze <4 x i1> [[TMP2]]288; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP6]])289; CHECK-NEXT: [[TMP8:%.*]] = extractelement <4 x i1> [[TMP1]], i32 3290; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[TMP7]], i1 [[TMP8]], i1 false291; CHECK-NEXT: [[OP_RDX1:%.*]] = select i1 [[S2]], i1 [[OP_RDX]], i1 false292; CHECK-NEXT: ret i1 [[OP_RDX1]]293;294 %x0 = extractelement <4 x i32> %x, i32 0295 %x1 = extractelement <4 x i32> %x, i32 1296 %x2 = extractelement <4 x i32> %x, i32 2297 %x3 = extractelement <4 x i32> %x, i32 3298 %c0 = icmp slt i32 %x0, 42299 %c1 = icmp slt i32 %x1, 42300 %c2 = icmp slt i32 %x2, 42301 %c3 = icmp slt i32 %x3, 42302 %d0 = icmp sgt i32 %x0, 17303 %d1 = icmp sgt i32 %x1, 17304 %d2 = icmp sgt i32 %x2, 17305 %d3 = icmp sgt i32 %x3, 17306 %s1 = select i1 %c0, i1 %c1, i1 false307 %s2 = select i1 %s1, i1 %c2, i1 false308 call void @use1(i1 %s2)309 %s3 = select i1 %s2, i1 %c3, i1 false310 %s4 = select i1 %s3, i1 %d0, i1 false311 %s5 = select i1 %s4, i1 %d1, i1 false312 %s6 = select i1 %s5, i1 %d2, i1 false313 %s7 = select i1 %s6, i1 %d3, i1 false314 ret i1 %s7315}316 317define i1 @logical_and_icmp_clamp_v8i32(<8 x i32> %x, <8 x i32> %y) {318; CHECK-LABEL: @logical_and_icmp_clamp_v8i32(319; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[X:%.*]], <8 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>320; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[Y:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>321; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>322; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> <i32 42, i32 42, i32 42, i32 42, i32 poison, i32 poison, i32 poison, i32 poison>, <8 x i32> [[TMP7]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>323; CHECK-NEXT: [[TMP4:%.*]] = icmp slt <8 x i32> [[TMP1]], [[TMP3]]324; CHECK-NEXT: [[TMP5:%.*]] = freeze <8 x i1> [[TMP4]]325; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> [[TMP5]])326; CHECK-NEXT: ret i1 [[TMP6]]327;328 %x0 = extractelement <8 x i32> %x, i32 0329 %x1 = extractelement <8 x i32> %x, i32 1330 %x2 = extractelement <8 x i32> %x, i32 2331 %x3 = extractelement <8 x i32> %x, i32 3332 %y0 = extractelement <8 x i32> %y, i32 0333 %y1 = extractelement <8 x i32> %y, i32 1334 %y2 = extractelement <8 x i32> %y, i32 2335 %y3 = extractelement <8 x i32> %y, i32 3336 %c0 = icmp slt i32 %x0, 42337 %c1 = icmp slt i32 %x1, 42338 %c2 = icmp slt i32 %x2, 42339 %c3 = icmp slt i32 %x3, 42340 %d0 = icmp slt i32 %x0, %y0341 %d1 = icmp slt i32 %x1, %y1342 %d2 = icmp slt i32 %x2, %y2343 %d3 = icmp slt i32 %x3, %y3344 %s1 = select i1 %c0, i1 %c1, i1 false345 %s2 = select i1 %s1, i1 %c2, i1 false346 %s3 = select i1 %s2, i1 %c3, i1 false347 %s4 = select i1 %s3, i1 %d0, i1 false348 %s5 = select i1 %s4, i1 %d1, i1 false349 %s6 = select i1 %s5, i1 %d2, i1 false350 %s7 = select i1 %s6, i1 %d3, i1 false351 ret i1 %s7352}353 354define i1 @logical_and_icmp_clamp_partial(<4 x i32> %x) {355; CHECK-LABEL: @logical_and_icmp_clamp_partial(356; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 2357; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[X]], <4 x i32> poison, <2 x i32> <i32 0, i32 1>358; CHECK-NEXT: [[TMP3:%.*]] = icmp slt <2 x i32> [[TMP2]], splat (i32 42)359; CHECK-NEXT: [[C2:%.*]] = icmp slt i32 [[TMP1]], 42360; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt <4 x i32> [[X]], splat (i32 17)361; CHECK-NEXT: [[TMP5:%.*]] = freeze <4 x i1> [[TMP4]]362; CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP5]])363; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i1> [[TMP3]], i32 0364; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[TMP7]], i1 [[TMP6]], i1 false365; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i1> [[TMP3]], i32 1366; CHECK-NEXT: [[TMP9:%.*]] = freeze i1 [[TMP8]]367; CHECK-NEXT: [[OP_RDX1:%.*]] = select i1 [[TMP9]], i1 [[C2]], i1 false368; CHECK-NEXT: [[TMP10:%.*]] = freeze i1 [[OP_RDX]]369; CHECK-NEXT: [[OP_RDX2:%.*]] = select i1 [[TMP10]], i1 [[OP_RDX1]], i1 false370; CHECK-NEXT: ret i1 [[OP_RDX2]]371;372 %x0 = extractelement <4 x i32> %x, i32 0373 %x1 = extractelement <4 x i32> %x, i32 1374 %x2 = extractelement <4 x i32> %x, i32 2375 %x3 = extractelement <4 x i32> %x, i32 3376 %c0 = icmp slt i32 %x0, 42377 %c1 = icmp slt i32 %x1, 42378 %c2 = icmp slt i32 %x2, 42379 ; remove an element from the previous test380 %d0 = icmp sgt i32 %x0, 17381 %d1 = icmp sgt i32 %x1, 17382 %d2 = icmp sgt i32 %x2, 17383 %d3 = icmp sgt i32 %x3, 17384 %s1 = select i1 %c0, i1 %c1, i1 false385 %s2 = select i1 %s1, i1 %c2, i1 false386 ; remove an element from the previous test387 %s4 = select i1 %s2, i1 %d0, i1 false388 %s5 = select i1 %s4, i1 %d1, i1 false389 %s6 = select i1 %s5, i1 %d2, i1 false390 %s7 = select i1 %s6, i1 %d3, i1 false391 ret i1 %s7392}393 394define i1 @logical_and_icmp_clamp_pred_diff(<4 x i32> %x) {395; CHECK-LABEL: @logical_and_icmp_clamp_pred_diff(396; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>397; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 42, i32 42, i32 42, i32 poison>, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 12, i32 13, i32 14, i32 3>398; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP1]], <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>399; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> <i32 17, i32 17, i32 17, i32 17, i32 poison, i32 poison, i32 poison, i32 42>, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 0, i32 1, i32 2, i32 15>400; CHECK-NEXT: [[TMP5:%.*]] = icmp sgt <8 x i32> [[TMP3]], [[TMP4]]401; CHECK-NEXT: [[TMP6:%.*]] = icmp ult <8 x i32> [[TMP3]], [[TMP4]]402; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i1> [[TMP5]], <8 x i1> [[TMP6]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 15>403; CHECK-NEXT: [[TMP8:%.*]] = freeze <8 x i1> [[TMP7]]404; CHECK-NEXT: [[TMP9:%.*]] = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> [[TMP8]])405; CHECK-NEXT: ret i1 [[TMP9]]406;407 %x0 = extractelement <4 x i32> %x, i32 0408 %x1 = extractelement <4 x i32> %x, i32 1409 %x2 = extractelement <4 x i32> %x, i32 2410 %x3 = extractelement <4 x i32> %x, i32 3411 %c0 = icmp slt i32 %x0, 42412 %c1 = icmp slt i32 %x1, 42413 %c2 = icmp slt i32 %x2, 42414 %c3 = icmp ult i32 %x3, 42 ; predicate changed415 %d0 = icmp sgt i32 %x0, 17416 %d1 = icmp sgt i32 %x1, 17417 %d2 = icmp sgt i32 %x2, 17418 %d3 = icmp sgt i32 %x3, 17419 %s1 = select i1 %c0, i1 %c1, i1 false420 %s2 = select i1 %s1, i1 %c2, i1 false421 %s3 = select i1 %s2, i1 %c3, i1 false422 %s4 = select i1 %s3, i1 %d0, i1 false423 %s5 = select i1 %s4, i1 %d1, i1 false424 %s6 = select i1 %s5, i1 %d2, i1 false425 %s7 = select i1 %s6, i1 %d3, i1 false426 ret i1 %s7427}428 429define i1 @logical_and_icmp_extra_op(<4 x i32> %x, <4 x i32> %y, i1 %c) {430; CHECK-LABEL: @logical_and_icmp_extra_op(431; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[X:%.*]], [[Y:%.*]]432; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]433; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP2]])434; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[C:%.*]], i1 [[TMP3]], i1 false435; CHECK-NEXT: ret i1 [[OP_RDX]]436;437 %x0 = extractelement <4 x i32> %x, i32 0438 %x1 = extractelement <4 x i32> %x, i32 1439 %x2 = extractelement <4 x i32> %x, i32 2440 %x3 = extractelement <4 x i32> %x, i32 3441 %y0 = extractelement <4 x i32> %y, i32 0442 %y1 = extractelement <4 x i32> %y, i32 1443 %y2 = extractelement <4 x i32> %y, i32 2444 %y3 = extractelement <4 x i32> %y, i32 3445 %d0 = icmp slt i32 %x0, %y0446 %d1 = icmp slt i32 %x1, %y1447 %d2 = icmp slt i32 %x2, %y2448 %d3 = icmp slt i32 %x3, %y3449 %s3 = select i1 %c, i1 %c, i1 false450 %s4 = select i1 %s3, i1 %d0, i1 false451 %s5 = select i1 %s4, i1 %d1, i1 false452 %s6 = select i1 %s5, i1 %d2, i1 false453 %s7 = select i1 %s6, i1 %d3, i1 false454 ret i1 %s7455}456 457define i1 @logical_or_icmp_extra_op(<4 x i32> %x, <4 x i32> %y, i1 %c) {458; CHECK-LABEL: @logical_or_icmp_extra_op(459; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <4 x i32> [[X:%.*]], [[Y:%.*]]460; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]461; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP2]])462; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP3]]463; CHECK-NEXT: ret i1 [[OP_RDX]]464;465 %x0 = extractelement <4 x i32> %x, i32 0466 %x1 = extractelement <4 x i32> %x, i32 1467 %x2 = extractelement <4 x i32> %x, i32 2468 %x3 = extractelement <4 x i32> %x, i32 3469 %y0 = extractelement <4 x i32> %y, i32 0470 %y1 = extractelement <4 x i32> %y, i32 1471 %y2 = extractelement <4 x i32> %y, i32 2472 %y3 = extractelement <4 x i32> %y, i32 3473 %d0 = icmp slt i32 %x0, %y0474 %d1 = icmp slt i32 %x1, %y1475 %d2 = icmp slt i32 %x2, %y2476 %d3 = icmp slt i32 %x3, %y3477 %s3 = select i1 %c, i1 true, i1 %c478 %s4 = select i1 %s3, i1 true, i1 %d0479 %s5 = select i1 %s4, i1 true, i1 %d1480 %s6 = select i1 %s5, i1 true, i1 %d2481 %s7 = select i1 %s6, i1 true, i1 %d3482 ret i1 %s7483}484 485define i1 @logical_and_icmp_extra_args(<4 x i32> %x, i1 %c0, i1 %c1, i1 %c2) {486; CHECK-LABEL: @logical_and_icmp_extra_args(487; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[X:%.*]], splat (i32 17)488; CHECK-NEXT: [[TMP2:%.*]] = freeze <4 x i1> [[TMP1]]489; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP2]])490; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[TMP3]], i1 [[C0:%.*]], i1 false491; CHECK-NEXT: [[TMP4:%.*]] = freeze i1 [[C1:%.*]]492; CHECK-NEXT: [[OP_RDX1:%.*]] = select i1 [[TMP4]], i1 [[C2:%.*]], i1 false493; CHECK-NEXT: [[TMP5:%.*]] = freeze i1 [[OP_RDX]]494; CHECK-NEXT: [[OP_RDX2:%.*]] = select i1 [[TMP5]], i1 [[OP_RDX1]], i1 false495; CHECK-NEXT: ret i1 [[OP_RDX2]]496;497 %x0 = extractelement <4 x i32> %x, i32 0498 %x1 = extractelement <4 x i32> %x, i32 1499 %x2 = extractelement <4 x i32> %x, i32 2500 %x3 = extractelement <4 x i32> %x, i32 3501 %d0 = icmp sgt i32 %x0, 17502 %d1 = icmp sgt i32 %x1, 17503 %d2 = icmp sgt i32 %x2, 17504 %d3 = icmp sgt i32 %x3, 17505 %s1 = select i1 %d0, i1 %c0, i1 false ; <- d0, d1, d2, d3 gets reduced.506 %s2 = select i1 %s1, i1 %c1, i1 false ; <- c0, c1, c2 remain scalar.507 %s3 = select i1 %s2, i1 %c2, i1 false508 %s5 = select i1 %s3, i1 %d1, i1 false509 %s6 = select i1 %s5, i1 %d2, i1 false510 %s7 = select i1 %s6, i1 %d3, i1 false511 ret i1 %s7512}513 514