brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.8 KiB · 1904540 Raw
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