693 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=slp-vectorizer -S < %s -mtriple=aarch64 | FileCheck %s3 4; This test is two versions of the IR extracted from a DSP routine performing5; boolean distance. The first involves a mixture of vector intrinsics and6; scalar code, the second is just scalar. They should both ideally not be7; vectorized any more than the input (unless the codegen has improved8; significantly).9 10define void @dist_vec(ptr nocapture noundef readonly %pA, ptr nocapture noundef readonly %pB, i32 noundef %numberOfBools, ptr nocapture noundef writeonly %cTT, ptr nocapture noundef writeonly %cFF, ptr nocapture noundef writeonly %cTF, ptr nocapture noundef writeonly %cFT) {11; CHECK-LABEL: @dist_vec(12; CHECK-NEXT: entry:13; CHECK-NEXT: [[CMP_NOT264:%.*]] = icmp ult i32 [[NUMBEROFBOOLS:%.*]], 12814; CHECK-NEXT: br i1 [[CMP_NOT264]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]15; CHECK: while.body.preheader:16; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[NUMBEROFBOOLS]], 717; CHECK-NEXT: [[TMP0:%.*]] = add nsw i32 [[SHR]], -118; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i6419; CHECK-NEXT: [[TMP2:%.*]] = shl nuw nsw i64 [[TMP1]], 420; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 1621; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[PA:%.*]], i64 [[TMP3]]22; CHECK-NEXT: br label [[WHILE_BODY:%.*]]23; CHECK: while.body:24; CHECK-NEXT: [[PA_ADDR_0271:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[WHILE_BODY]] ], [ [[PA]], [[WHILE_BODY_PREHEADER]] ]25; CHECK-NEXT: [[PB_ADDR_0270:%.*]] = phi ptr [ [[ADD_PTR8:%.*]], [[WHILE_BODY]] ], [ [[PB:%.*]], [[WHILE_BODY_PREHEADER]] ]26; CHECK-NEXT: [[NBBOOLBLOCK_0269:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[SHR]], [[WHILE_BODY_PREHEADER]] ]27; CHECK-NEXT: [[TMP4TT_0268:%.*]] = phi <2 x i64> [ [[ADD_I:%.*]], [[WHILE_BODY]] ], [ zeroinitializer, [[WHILE_BODY_PREHEADER]] ]28; CHECK-NEXT: [[TMP4FF_0267:%.*]] = phi <2 x i64> [ [[ADD_I253:%.*]], [[WHILE_BODY]] ], [ zeroinitializer, [[WHILE_BODY_PREHEADER]] ]29; CHECK-NEXT: [[TMP4TF_0266:%.*]] = phi <2 x i64> [ [[ADD_I258:%.*]], [[WHILE_BODY]] ], [ zeroinitializer, [[WHILE_BODY_PREHEADER]] ]30; CHECK-NEXT: [[TMP4FT_0265:%.*]] = phi <2 x i64> [ [[ADD_I263:%.*]], [[WHILE_BODY]] ], [ zeroinitializer, [[WHILE_BODY_PREHEADER]] ]31; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i32>, ptr [[PA_ADDR_0271]], align 432; CHECK-NEXT: [[TMP5:%.*]] = load <4 x i32>, ptr [[PB_ADDR_0270]], align 433; CHECK-NEXT: [[ADD_PTR]] = getelementptr inbounds i32, ptr [[PA_ADDR_0271]], i64 434; CHECK-NEXT: [[ADD_PTR8]] = getelementptr inbounds i32, ptr [[PB_ADDR_0270]], i64 435; CHECK-NEXT: [[AND_I:%.*]] = and <4 x i32> [[TMP5]], [[TMP4]]36; CHECK-NEXT: [[NOT_I:%.*]] = xor <4 x i32> [[TMP4]], splat (i32 -1)37; CHECK-NEXT: [[NOT_I242:%.*]] = xor <4 x i32> [[TMP5]], splat (i32 -1)38; CHECK-NEXT: [[AND_I243:%.*]] = and <4 x i32> [[NOT_I242]], [[NOT_I]]39; CHECK-NEXT: [[AND_I245:%.*]] = and <4 x i32> [[TMP4]], [[NOT_I242]]40; CHECK-NEXT: [[AND_I247:%.*]] = and <4 x i32> [[TMP5]], [[NOT_I]]41; CHECK-NEXT: [[TMP6:%.*]] = bitcast <4 x i32> [[AND_I]] to <16 x i8>42; CHECK-NEXT: [[VCNTQ_V_I:%.*]] = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> [[TMP6]])43; CHECK-NEXT: [[VPADDL_I:%.*]] = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> [[VCNTQ_V_I]])44; CHECK-NEXT: [[VPADDL1_I:%.*]] = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> [[VPADDL_I]])45; CHECK-NEXT: [[VPADDL1_I248:%.*]] = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> [[VPADDL1_I]])46; CHECK-NEXT: [[ADD_I]] = add <2 x i64> [[VPADDL1_I248]], [[TMP4TT_0268]]47; CHECK-NEXT: [[TMP7:%.*]] = bitcast <4 x i32> [[AND_I243]] to <16 x i8>48; CHECK-NEXT: [[VCNTQ_V_I249:%.*]] = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> [[TMP7]])49; CHECK-NEXT: [[VPADDL_I250:%.*]] = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> [[VCNTQ_V_I249]])50; CHECK-NEXT: [[VPADDL1_I251:%.*]] = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> [[VPADDL_I250]])51; CHECK-NEXT: [[VPADDL1_I252:%.*]] = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> [[VPADDL1_I251]])52; CHECK-NEXT: [[ADD_I253]] = add <2 x i64> [[VPADDL1_I252]], [[TMP4FF_0267]]53; CHECK-NEXT: [[TMP8:%.*]] = bitcast <4 x i32> [[AND_I245]] to <16 x i8>54; CHECK-NEXT: [[VCNTQ_V_I254:%.*]] = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> [[TMP8]])55; CHECK-NEXT: [[VPADDL_I255:%.*]] = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> [[VCNTQ_V_I254]])56; CHECK-NEXT: [[VPADDL1_I256:%.*]] = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> [[VPADDL_I255]])57; CHECK-NEXT: [[VPADDL1_I257:%.*]] = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> [[VPADDL1_I256]])58; CHECK-NEXT: [[ADD_I258]] = add <2 x i64> [[VPADDL1_I257]], [[TMP4TF_0266]]59; CHECK-NEXT: [[TMP9:%.*]] = bitcast <4 x i32> [[AND_I247]] to <16 x i8>60; CHECK-NEXT: [[VCNTQ_V_I259:%.*]] = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> [[TMP9]])61; CHECK-NEXT: [[VPADDL_I260:%.*]] = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> [[VCNTQ_V_I259]])62; CHECK-NEXT: [[VPADDL1_I261:%.*]] = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> [[VPADDL_I260]])63; CHECK-NEXT: [[VPADDL1_I262:%.*]] = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> [[VPADDL1_I261]])64; CHECK-NEXT: [[ADD_I263]] = add <2 x i64> [[VPADDL1_I262]], [[TMP4FT_0265]]65; CHECK-NEXT: [[DEC]] = add nsw i32 [[NBBOOLBLOCK_0269]], -166; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[DEC]], 067; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]68; CHECK: while.end.loopexit:69; CHECK-NEXT: [[SCEVGEP311:%.*]] = getelementptr i8, ptr [[PB]], i64 [[TMP3]]70; CHECK-NEXT: br label [[WHILE_END]]71; CHECK: while.end:72; CHECK-NEXT: [[TMP4FT_0_LCSSA:%.*]] = phi <2 x i64> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[ADD_I263]], [[WHILE_END_LOOPEXIT]] ]73; CHECK-NEXT: [[TMP4TF_0_LCSSA:%.*]] = phi <2 x i64> [ zeroinitializer, [[ENTRY]] ], [ [[ADD_I258]], [[WHILE_END_LOOPEXIT]] ]74; CHECK-NEXT: [[TMP4FF_0_LCSSA:%.*]] = phi <2 x i64> [ zeroinitializer, [[ENTRY]] ], [ [[ADD_I253]], [[WHILE_END_LOOPEXIT]] ]75; CHECK-NEXT: [[TMP4TT_0_LCSSA:%.*]] = phi <2 x i64> [ zeroinitializer, [[ENTRY]] ], [ [[ADD_I]], [[WHILE_END_LOOPEXIT]] ]76; CHECK-NEXT: [[PB_ADDR_0_LCSSA:%.*]] = phi ptr [ [[PB]], [[ENTRY]] ], [ [[SCEVGEP311]], [[WHILE_END_LOOPEXIT]] ]77; CHECK-NEXT: [[PA_ADDR_0_LCSSA:%.*]] = phi ptr [ [[PA]], [[ENTRY]] ], [ [[SCEVGEP]], [[WHILE_END_LOOPEXIT]] ]78; CHECK-NEXT: [[VGETQ_LANE:%.*]] = extractelement <2 x i64> [[TMP4TT_0_LCSSA]], i64 079; CHECK-NEXT: [[VGETQ_LANE45:%.*]] = extractelement <2 x i64> [[TMP4TT_0_LCSSA]], i64 180; CHECK-NEXT: [[ADD:%.*]] = add i64 [[VGETQ_LANE]], [[VGETQ_LANE45]]81; CHECK-NEXT: [[CONV48:%.*]] = trunc i64 [[ADD]] to i3282; CHECK-NEXT: [[VGETQ_LANE51:%.*]] = extractelement <2 x i64> [[TMP4FF_0_LCSSA]], i64 083; CHECK-NEXT: [[VGETQ_LANE55:%.*]] = extractelement <2 x i64> [[TMP4FF_0_LCSSA]], i64 184; CHECK-NEXT: [[ADD57:%.*]] = add i64 [[VGETQ_LANE51]], [[VGETQ_LANE55]]85; CHECK-NEXT: [[CONV60:%.*]] = trunc i64 [[ADD57]] to i3286; CHECK-NEXT: [[VGETQ_LANE63:%.*]] = extractelement <2 x i64> [[TMP4TF_0_LCSSA]], i64 087; CHECK-NEXT: [[VGETQ_LANE67:%.*]] = extractelement <2 x i64> [[TMP4TF_0_LCSSA]], i64 188; CHECK-NEXT: [[ADD69:%.*]] = add i64 [[VGETQ_LANE63]], [[VGETQ_LANE67]]89; CHECK-NEXT: [[CONV72:%.*]] = trunc i64 [[ADD69]] to i3290; CHECK-NEXT: [[VGETQ_LANE75:%.*]] = extractelement <2 x i64> [[TMP4FT_0_LCSSA]], i64 091; CHECK-NEXT: [[VGETQ_LANE79:%.*]] = extractelement <2 x i64> [[TMP4FT_0_LCSSA]], i64 192; CHECK-NEXT: [[ADD81:%.*]] = add i64 [[VGETQ_LANE75]], [[VGETQ_LANE79]]93; CHECK-NEXT: [[CONV84:%.*]] = trunc i64 [[ADD81]] to i3294; CHECK-NEXT: [[AND:%.*]] = and i32 [[NUMBEROFBOOLS]], 12795; CHECK-NEXT: [[CMP86284:%.*]] = icmp ugt i32 [[AND]], 3196; CHECK-NEXT: br i1 [[CMP86284]], label [[WHILE_BODY88:%.*]], label [[WHILE_END122:%.*]]97; CHECK: while.body88:98; CHECK-NEXT: [[PA_ADDR_1291:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[WHILE_END121:%.*]] ], [ [[PA_ADDR_0_LCSSA]], [[WHILE_END]] ]99; CHECK-NEXT: [[PB_ADDR_1290:%.*]] = phi ptr [ [[INCDEC_PTR89:%.*]], [[WHILE_END121]] ], [ [[PB_ADDR_0_LCSSA]], [[WHILE_END]] ]100; CHECK-NEXT: [[_CTT_0289:%.*]] = phi i32 [ [[ADD99:%.*]], [[WHILE_END121]] ], [ [[CONV48]], [[WHILE_END]] ]101; CHECK-NEXT: [[_CFF_0288:%.*]] = phi i32 [ [[ADD106:%.*]], [[WHILE_END121]] ], [ [[CONV60]], [[WHILE_END]] ]102; CHECK-NEXT: [[_CTF_0287:%.*]] = phi i32 [ [[ADD113:%.*]], [[WHILE_END121]] ], [ [[CONV72]], [[WHILE_END]] ]103; CHECK-NEXT: [[_CFT_0286:%.*]] = phi i32 [ [[ADD120:%.*]], [[WHILE_END121]] ], [ [[CONV84]], [[WHILE_END]] ]104; CHECK-NEXT: [[NBBOOLBLOCK_1285:%.*]] = phi i32 [ [[SUB:%.*]], [[WHILE_END121]] ], [ [[AND]], [[WHILE_END]] ]105; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[PA_ADDR_1291]], align 4106; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[PB_ADDR_1290]], align 4107; CHECK-NEXT: br label [[WHILE_BODY93:%.*]]108; CHECK: while.body93:109; CHECK-NEXT: [[_CTT_1283:%.*]] = phi i32 [ [[_CTT_0289]], [[WHILE_BODY88]] ], [ [[ADD99]], [[WHILE_BODY93]] ]110; CHECK-NEXT: [[_CFF_1282:%.*]] = phi i32 [ [[_CFF_0288]], [[WHILE_BODY88]] ], [ [[ADD106]], [[WHILE_BODY93]] ]111; CHECK-NEXT: [[_CTF_1281:%.*]] = phi i32 [ [[_CTF_0287]], [[WHILE_BODY88]] ], [ [[ADD113]], [[WHILE_BODY93]] ]112; CHECK-NEXT: [[_CFT_1280:%.*]] = phi i32 [ [[_CFT_0286]], [[WHILE_BODY88]] ], [ [[ADD120]], [[WHILE_BODY93]] ]113; CHECK-NEXT: [[A_0279:%.*]] = phi i32 [ [[TMP10]], [[WHILE_BODY88]] ], [ [[SHR96:%.*]], [[WHILE_BODY93]] ]114; CHECK-NEXT: [[B_0278:%.*]] = phi i32 [ [[TMP11]], [[WHILE_BODY88]] ], [ [[SHR97:%.*]], [[WHILE_BODY93]] ]115; CHECK-NEXT: [[SHIFT_0277:%.*]] = phi i32 [ 0, [[WHILE_BODY88]] ], [ [[INC:%.*]], [[WHILE_BODY93]] ]116; CHECK-NEXT: [[AND94:%.*]] = and i32 [[A_0279]], 1117; CHECK-NEXT: [[AND95:%.*]] = and i32 [[B_0278]], 1118; CHECK-NEXT: [[SHR96]] = lshr i32 [[A_0279]], 1119; CHECK-NEXT: [[SHR97]] = lshr i32 [[B_0278]], 1120; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[AND94]], 0121; CHECK-NEXT: [[TOBOOL98:%.*]] = icmp ne i32 [[AND95]], 0122; CHECK-NEXT: [[TMP12:%.*]] = select i1 [[TOBOOL]], i1 [[TOBOOL98]], i1 false123; CHECK-NEXT: [[LAND_EXT:%.*]] = zext i1 [[TMP12]] to i32124; CHECK-NEXT: [[ADD99]] = add i32 [[_CTT_1283]], [[LAND_EXT]]125; CHECK-NEXT: [[TOBOOL100:%.*]] = icmp eq i32 [[AND94]], 0126; CHECK-NEXT: [[TOBOOL103:%.*]] = icmp eq i32 [[AND95]], 0127; CHECK-NEXT: [[TMP13:%.*]] = select i1 [[TOBOOL100]], i1 [[TOBOOL103]], i1 false128; CHECK-NEXT: [[LAND_EXT105:%.*]] = zext i1 [[TMP13]] to i32129; CHECK-NEXT: [[ADD106]] = add i32 [[_CFF_1282]], [[LAND_EXT105]]130; CHECK-NEXT: [[TMP14:%.*]] = select i1 [[TOBOOL]], i1 [[TOBOOL103]], i1 false131; CHECK-NEXT: [[LAND_EXT112:%.*]] = zext i1 [[TMP14]] to i32132; CHECK-NEXT: [[ADD113]] = add i32 [[_CTF_1281]], [[LAND_EXT112]]133; CHECK-NEXT: [[TMP15:%.*]] = select i1 [[TOBOOL100]], i1 [[TOBOOL98]], i1 false134; CHECK-NEXT: [[LAND_EXT119:%.*]] = zext i1 [[TMP15]] to i32135; CHECK-NEXT: [[ADD120]] = add i32 [[_CFT_1280]], [[LAND_EXT119]]136; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[SHIFT_0277]], 1137; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], 32138; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[WHILE_END121]], label [[WHILE_BODY93]]139; CHECK: while.end121:140; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i32, ptr [[PA_ADDR_1291]], i64 1141; CHECK-NEXT: [[INCDEC_PTR89]] = getelementptr inbounds i32, ptr [[PB_ADDR_1290]], i64 1142; CHECK-NEXT: [[SUB]] = add nsw i32 [[NBBOOLBLOCK_1285]], -32143; CHECK-NEXT: [[CMP86:%.*]] = icmp ugt i32 [[SUB]], 31144; CHECK-NEXT: br i1 [[CMP86]], label [[WHILE_BODY88]], label [[WHILE_END122]]145; CHECK: while.end122:146; CHECK-NEXT: [[NBBOOLBLOCK_1_LCSSA:%.*]] = phi i32 [ [[AND]], [[WHILE_END]] ], [ [[SUB]], [[WHILE_END121]] ]147; CHECK-NEXT: [[_CFT_0_LCSSA:%.*]] = phi i32 [ [[CONV84]], [[WHILE_END]] ], [ [[ADD120]], [[WHILE_END121]] ]148; CHECK-NEXT: [[_CTF_0_LCSSA:%.*]] = phi i32 [ [[CONV72]], [[WHILE_END]] ], [ [[ADD113]], [[WHILE_END121]] ]149; CHECK-NEXT: [[_CFF_0_LCSSA:%.*]] = phi i32 [ [[CONV60]], [[WHILE_END]] ], [ [[ADD106]], [[WHILE_END121]] ]150; CHECK-NEXT: [[_CTT_0_LCSSA:%.*]] = phi i32 [ [[CONV48]], [[WHILE_END]] ], [ [[ADD99]], [[WHILE_END121]] ]151; CHECK-NEXT: [[PB_ADDR_1_LCSSA:%.*]] = phi ptr [ [[PB_ADDR_0_LCSSA]], [[WHILE_END]] ], [ [[INCDEC_PTR89]], [[WHILE_END121]] ]152; CHECK-NEXT: [[PA_ADDR_1_LCSSA:%.*]] = phi ptr [ [[PA_ADDR_0_LCSSA]], [[WHILE_END]] ], [ [[INCDEC_PTR]], [[WHILE_END121]] ]153; CHECK-NEXT: [[CMP130_NOT299:%.*]] = icmp eq i32 [[NBBOOLBLOCK_1_LCSSA]], 0154; CHECK-NEXT: br i1 [[CMP130_NOT299]], label [[WHILE_END166:%.*]], label [[WHILE_BODY132_PREHEADER:%.*]]155; CHECK: while.body132.preheader:156; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[PB_ADDR_1_LCSSA]], align 4157; CHECK-NEXT: [[SUB125:%.*]] = sub nuw nsw i32 32, [[NBBOOLBLOCK_1_LCSSA]]158; CHECK-NEXT: [[SHR128:%.*]] = lshr i32 [[TMP16]], [[SUB125]]159; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[PA_ADDR_1_LCSSA]], align 4160; CHECK-NEXT: [[SHR126:%.*]] = lshr i32 [[TMP17]], [[SUB125]]161; CHECK-NEXT: br label [[WHILE_BODY132:%.*]]162; CHECK: while.body132:163; CHECK-NEXT: [[_CTT_2306:%.*]] = phi i32 [ [[ADD142:%.*]], [[WHILE_BODY132]] ], [ [[_CTT_0_LCSSA]], [[WHILE_BODY132_PREHEADER]] ]164; CHECK-NEXT: [[_CFF_2305:%.*]] = phi i32 [ [[ADD150:%.*]], [[WHILE_BODY132]] ], [ [[_CFF_0_LCSSA]], [[WHILE_BODY132_PREHEADER]] ]165; CHECK-NEXT: [[_CTF_2304:%.*]] = phi i32 [ [[ADD157:%.*]], [[WHILE_BODY132]] ], [ [[_CTF_0_LCSSA]], [[WHILE_BODY132_PREHEADER]] ]166; CHECK-NEXT: [[_CFT_2303:%.*]] = phi i32 [ [[ADD164:%.*]], [[WHILE_BODY132]] ], [ [[_CFT_0_LCSSA]], [[WHILE_BODY132_PREHEADER]] ]167; CHECK-NEXT: [[NBBOOLBLOCK_2302:%.*]] = phi i32 [ [[DEC165:%.*]], [[WHILE_BODY132]] ], [ [[NBBOOLBLOCK_1_LCSSA]], [[WHILE_BODY132_PREHEADER]] ]168; CHECK-NEXT: [[A_1301:%.*]] = phi i32 [ [[SHR135:%.*]], [[WHILE_BODY132]] ], [ [[SHR126]], [[WHILE_BODY132_PREHEADER]] ]169; CHECK-NEXT: [[B_1300:%.*]] = phi i32 [ [[SHR136:%.*]], [[WHILE_BODY132]] ], [ [[SHR128]], [[WHILE_BODY132_PREHEADER]] ]170; CHECK-NEXT: [[AND133:%.*]] = and i32 [[A_1301]], 1171; CHECK-NEXT: [[AND134:%.*]] = and i32 [[B_1300]], 1172; CHECK-NEXT: [[SHR135]] = lshr i32 [[A_1301]], 1173; CHECK-NEXT: [[SHR136]] = lshr i32 [[B_1300]], 1174; CHECK-NEXT: [[TOBOOL137:%.*]] = icmp ne i32 [[AND133]], 0175; CHECK-NEXT: [[TOBOOL139:%.*]] = icmp ne i32 [[AND134]], 0176; CHECK-NEXT: [[TMP18:%.*]] = select i1 [[TOBOOL137]], i1 [[TOBOOL139]], i1 false177; CHECK-NEXT: [[LAND_EXT141:%.*]] = zext i1 [[TMP18]] to i32178; CHECK-NEXT: [[ADD142]] = add i32 [[_CTT_2306]], [[LAND_EXT141]]179; CHECK-NEXT: [[TOBOOL144:%.*]] = icmp eq i32 [[AND133]], 0180; CHECK-NEXT: [[TOBOOL147:%.*]] = icmp eq i32 [[AND134]], 0181; CHECK-NEXT: [[TMP19:%.*]] = select i1 [[TOBOOL144]], i1 [[TOBOOL147]], i1 false182; CHECK-NEXT: [[LAND_EXT149:%.*]] = zext i1 [[TMP19]] to i32183; CHECK-NEXT: [[ADD150]] = add i32 [[_CFF_2305]], [[LAND_EXT149]]184; CHECK-NEXT: [[TMP20:%.*]] = select i1 [[TOBOOL137]], i1 [[TOBOOL147]], i1 false185; CHECK-NEXT: [[LAND_EXT156:%.*]] = zext i1 [[TMP20]] to i32186; CHECK-NEXT: [[ADD157]] = add i32 [[_CTF_2304]], [[LAND_EXT156]]187; CHECK-NEXT: [[TMP21:%.*]] = select i1 [[TOBOOL144]], i1 [[TOBOOL139]], i1 false188; CHECK-NEXT: [[LAND_EXT163:%.*]] = zext i1 [[TMP21]] to i32189; CHECK-NEXT: [[ADD164]] = add i32 [[_CFT_2303]], [[LAND_EXT163]]190; CHECK-NEXT: [[DEC165]] = add nsw i32 [[NBBOOLBLOCK_2302]], -1191; CHECK-NEXT: [[CMP130_NOT:%.*]] = icmp eq i32 [[DEC165]], 0192; CHECK-NEXT: br i1 [[CMP130_NOT]], label [[WHILE_END166]], label [[WHILE_BODY132]]193; CHECK: while.end166:194; CHECK-NEXT: [[_CFT_2_LCSSA:%.*]] = phi i32 [ [[_CFT_0_LCSSA]], [[WHILE_END122]] ], [ [[ADD164]], [[WHILE_BODY132]] ]195; CHECK-NEXT: [[_CTF_2_LCSSA:%.*]] = phi i32 [ [[_CTF_0_LCSSA]], [[WHILE_END122]] ], [ [[ADD157]], [[WHILE_BODY132]] ]196; CHECK-NEXT: [[_CFF_2_LCSSA:%.*]] = phi i32 [ [[_CFF_0_LCSSA]], [[WHILE_END122]] ], [ [[ADD150]], [[WHILE_BODY132]] ]197; CHECK-NEXT: [[_CTT_2_LCSSA:%.*]] = phi i32 [ [[_CTT_0_LCSSA]], [[WHILE_END122]] ], [ [[ADD142]], [[WHILE_BODY132]] ]198; CHECK-NEXT: store i32 [[_CTT_2_LCSSA]], ptr [[CTT:%.*]], align 4199; CHECK-NEXT: store i32 [[_CFF_2_LCSSA]], ptr [[CFF:%.*]], align 4200; CHECK-NEXT: store i32 [[_CTF_2_LCSSA]], ptr [[CTF:%.*]], align 4201; CHECK-NEXT: store i32 [[_CFT_2_LCSSA]], ptr [[CFT:%.*]], align 4202; CHECK-NEXT: ret void203;204entry:205 %cmp.not264 = icmp ult i32 %numberOfBools, 128206 br i1 %cmp.not264, label %while.end, label %while.body.preheader207 208while.body.preheader: ; preds = %entry209 %shr = lshr i32 %numberOfBools, 7210 %0 = add nsw i32 %shr, -1211 %1 = zext i32 %0 to i64212 %2 = shl nuw nsw i64 %1, 4213 %3 = add nuw nsw i64 %2, 16214 %scevgep = getelementptr i8, ptr %pA, i64 %3215 br label %while.body216 217while.body: ; preds = %while.body.preheader, %while.body218 %pA.addr.0271 = phi ptr [ %add.ptr, %while.body ], [ %pA, %while.body.preheader ]219 %pB.addr.0270 = phi ptr [ %add.ptr8, %while.body ], [ %pB, %while.body.preheader ]220 %nbBoolBlock.0269 = phi i32 [ %dec, %while.body ], [ %shr, %while.body.preheader ]221 %tmp4tt.0268 = phi <2 x i64> [ %add.i, %while.body ], [ zeroinitializer, %while.body.preheader ]222 %tmp4ff.0267 = phi <2 x i64> [ %add.i253, %while.body ], [ zeroinitializer, %while.body.preheader ]223 %tmp4tf.0266 = phi <2 x i64> [ %add.i258, %while.body ], [ zeroinitializer, %while.body.preheader ]224 %tmp4ft.0265 = phi <2 x i64> [ %add.i263, %while.body ], [ zeroinitializer, %while.body.preheader ]225 %4 = load <4 x i32>, ptr %pA.addr.0271, align 4226 %5 = load <4 x i32>, ptr %pB.addr.0270, align 4227 %add.ptr = getelementptr inbounds i32, ptr %pA.addr.0271, i64 4228 %add.ptr8 = getelementptr inbounds i32, ptr %pB.addr.0270, i64 4229 %and.i = and <4 x i32> %5, %4230 %not.i = xor <4 x i32> %4, <i32 -1, i32 -1, i32 -1, i32 -1>231 %not.i242 = xor <4 x i32> %5, <i32 -1, i32 -1, i32 -1, i32 -1>232 %and.i243 = and <4 x i32> %not.i242, %not.i233 %and.i245 = and <4 x i32> %4, %not.i242234 %and.i247 = and <4 x i32> %5, %not.i235 %6 = bitcast <4 x i32> %and.i to <16 x i8>236 %vcntq_v.i = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %6)237 %vpaddl.i = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> %vcntq_v.i)238 %vpaddl1.i = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> %vpaddl.i)239 %vpaddl1.i248 = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> %vpaddl1.i)240 %add.i = add <2 x i64> %vpaddl1.i248, %tmp4tt.0268241 %7 = bitcast <4 x i32> %and.i243 to <16 x i8>242 %vcntq_v.i249 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %7)243 %vpaddl.i250 = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> %vcntq_v.i249)244 %vpaddl1.i251 = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> %vpaddl.i250)245 %vpaddl1.i252 = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> %vpaddl1.i251)246 %add.i253 = add <2 x i64> %vpaddl1.i252, %tmp4ff.0267247 %8 = bitcast <4 x i32> %and.i245 to <16 x i8>248 %vcntq_v.i254 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %8)249 %vpaddl.i255 = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> %vcntq_v.i254)250 %vpaddl1.i256 = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> %vpaddl.i255)251 %vpaddl1.i257 = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> %vpaddl1.i256)252 %add.i258 = add <2 x i64> %vpaddl1.i257, %tmp4tf.0266253 %9 = bitcast <4 x i32> %and.i247 to <16 x i8>254 %vcntq_v.i259 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %9)255 %vpaddl.i260 = tail call <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8> %vcntq_v.i259)256 %vpaddl1.i261 = tail call <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16> %vpaddl.i260)257 %vpaddl1.i262 = tail call <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32> %vpaddl1.i261)258 %add.i263 = add <2 x i64> %vpaddl1.i262, %tmp4ft.0265259 %dec = add nsw i32 %nbBoolBlock.0269, -1260 %cmp.not = icmp eq i32 %dec, 0261 br i1 %cmp.not, label %while.end.loopexit, label %while.body262 263while.end.loopexit: ; preds = %while.body264 %scevgep311 = getelementptr i8, ptr %pB, i64 %3265 br label %while.end266 267while.end: ; preds = %while.end.loopexit, %entry268 %tmp4ft.0.lcssa = phi <2 x i64> [ zeroinitializer, %entry ], [ %add.i263, %while.end.loopexit ]269 %tmp4tf.0.lcssa = phi <2 x i64> [ zeroinitializer, %entry ], [ %add.i258, %while.end.loopexit ]270 %tmp4ff.0.lcssa = phi <2 x i64> [ zeroinitializer, %entry ], [ %add.i253, %while.end.loopexit ]271 %tmp4tt.0.lcssa = phi <2 x i64> [ zeroinitializer, %entry ], [ %add.i, %while.end.loopexit ]272 %pB.addr.0.lcssa = phi ptr [ %pB, %entry ], [ %scevgep311, %while.end.loopexit ]273 %pA.addr.0.lcssa = phi ptr [ %pA, %entry ], [ %scevgep, %while.end.loopexit ]274 %vgetq_lane = extractelement <2 x i64> %tmp4tt.0.lcssa, i64 0275 %vgetq_lane45 = extractelement <2 x i64> %tmp4tt.0.lcssa, i64 1276 %add = add i64 %vgetq_lane, %vgetq_lane45277 %conv48 = trunc i64 %add to i32278 %vgetq_lane51 = extractelement <2 x i64> %tmp4ff.0.lcssa, i64 0279 %vgetq_lane55 = extractelement <2 x i64> %tmp4ff.0.lcssa, i64 1280 %add57 = add i64 %vgetq_lane51, %vgetq_lane55281 %conv60 = trunc i64 %add57 to i32282 %vgetq_lane63 = extractelement <2 x i64> %tmp4tf.0.lcssa, i64 0283 %vgetq_lane67 = extractelement <2 x i64> %tmp4tf.0.lcssa, i64 1284 %add69 = add i64 %vgetq_lane63, %vgetq_lane67285 %conv72 = trunc i64 %add69 to i32286 %vgetq_lane75 = extractelement <2 x i64> %tmp4ft.0.lcssa, i64 0287 %vgetq_lane79 = extractelement <2 x i64> %tmp4ft.0.lcssa, i64 1288 %add81 = add i64 %vgetq_lane75, %vgetq_lane79289 %conv84 = trunc i64 %add81 to i32290 %and = and i32 %numberOfBools, 127291 %cmp86284 = icmp ugt i32 %and, 31292 br i1 %cmp86284, label %while.body88, label %while.end122293 294while.body88: ; preds = %while.end, %while.end121295 %pA.addr.1291 = phi ptr [ %incdec.ptr, %while.end121 ], [ %pA.addr.0.lcssa, %while.end ]296 %pB.addr.1290 = phi ptr [ %incdec.ptr89, %while.end121 ], [ %pB.addr.0.lcssa, %while.end ]297 %_ctt.0289 = phi i32 [ %add99, %while.end121 ], [ %conv48, %while.end ]298 %_cff.0288 = phi i32 [ %add106, %while.end121 ], [ %conv60, %while.end ]299 %_ctf.0287 = phi i32 [ %add113, %while.end121 ], [ %conv72, %while.end ]300 %_cft.0286 = phi i32 [ %add120, %while.end121 ], [ %conv84, %while.end ]301 %nbBoolBlock.1285 = phi i32 [ %sub, %while.end121 ], [ %and, %while.end ]302 %10 = load i32, ptr %pA.addr.1291, align 4303 %11 = load i32, ptr %pB.addr.1290, align 4304 br label %while.body93305 306while.body93: ; preds = %while.body88, %while.body93307 %_ctt.1283 = phi i32 [ %_ctt.0289, %while.body88 ], [ %add99, %while.body93 ]308 %_cff.1282 = phi i32 [ %_cff.0288, %while.body88 ], [ %add106, %while.body93 ]309 %_ctf.1281 = phi i32 [ %_ctf.0287, %while.body88 ], [ %add113, %while.body93 ]310 %_cft.1280 = phi i32 [ %_cft.0286, %while.body88 ], [ %add120, %while.body93 ]311 %a.0279 = phi i32 [ %10, %while.body88 ], [ %shr96, %while.body93 ]312 %b.0278 = phi i32 [ %11, %while.body88 ], [ %shr97, %while.body93 ]313 %shift.0277 = phi i32 [ 0, %while.body88 ], [ %inc, %while.body93 ]314 %and94 = and i32 %a.0279, 1315 %and95 = and i32 %b.0278, 1316 %shr96 = lshr i32 %a.0279, 1317 %shr97 = lshr i32 %b.0278, 1318 %tobool = icmp ne i32 %and94, 0319 %tobool98 = icmp ne i32 %and95, 0320 %12 = select i1 %tobool, i1 %tobool98, i1 false321 %land.ext = zext i1 %12 to i32322 %add99 = add i32 %_ctt.1283, %land.ext323 %tobool100 = icmp eq i32 %and94, 0324 %tobool103 = icmp eq i32 %and95, 0325 %13 = select i1 %tobool100, i1 %tobool103, i1 false326 %land.ext105 = zext i1 %13 to i32327 %add106 = add i32 %_cff.1282, %land.ext105328 %14 = select i1 %tobool, i1 %tobool103, i1 false329 %land.ext112 = zext i1 %14 to i32330 %add113 = add i32 %_ctf.1281, %land.ext112331 %15 = select i1 %tobool100, i1 %tobool98, i1 false332 %land.ext119 = zext i1 %15 to i32333 %add120 = add i32 %_cft.1280, %land.ext119334 %inc = add nuw nsw i32 %shift.0277, 1335 %exitcond.not = icmp eq i32 %inc, 32336 br i1 %exitcond.not, label %while.end121, label %while.body93337 338while.end121: ; preds = %while.body93339 %incdec.ptr = getelementptr inbounds i32, ptr %pA.addr.1291, i64 1340 %incdec.ptr89 = getelementptr inbounds i32, ptr %pB.addr.1290, i64 1341 %sub = add nsw i32 %nbBoolBlock.1285, -32342 %cmp86 = icmp ugt i32 %sub, 31343 br i1 %cmp86, label %while.body88, label %while.end122344 345while.end122: ; preds = %while.end121, %while.end346 %nbBoolBlock.1.lcssa = phi i32 [ %and, %while.end ], [ %sub, %while.end121 ]347 %_cft.0.lcssa = phi i32 [ %conv84, %while.end ], [ %add120, %while.end121 ]348 %_ctf.0.lcssa = phi i32 [ %conv72, %while.end ], [ %add113, %while.end121 ]349 %_cff.0.lcssa = phi i32 [ %conv60, %while.end ], [ %add106, %while.end121 ]350 %_ctt.0.lcssa = phi i32 [ %conv48, %while.end ], [ %add99, %while.end121 ]351 %pB.addr.1.lcssa = phi ptr [ %pB.addr.0.lcssa, %while.end ], [ %incdec.ptr89, %while.end121 ]352 %pA.addr.1.lcssa = phi ptr [ %pA.addr.0.lcssa, %while.end ], [ %incdec.ptr, %while.end121 ]353 %cmp130.not299 = icmp eq i32 %nbBoolBlock.1.lcssa, 0354 br i1 %cmp130.not299, label %while.end166, label %while.body132.preheader355 356while.body132.preheader: ; preds = %while.end122357 %16 = load i32, ptr %pB.addr.1.lcssa, align 4358 %sub125 = sub nuw nsw i32 32, %nbBoolBlock.1.lcssa359 %shr128 = lshr i32 %16, %sub125360 %17 = load i32, ptr %pA.addr.1.lcssa, align 4361 %shr126 = lshr i32 %17, %sub125362 br label %while.body132363 364while.body132: ; preds = %while.body132.preheader, %while.body132365 %_ctt.2306 = phi i32 [ %add142, %while.body132 ], [ %_ctt.0.lcssa, %while.body132.preheader ]366 %_cff.2305 = phi i32 [ %add150, %while.body132 ], [ %_cff.0.lcssa, %while.body132.preheader ]367 %_ctf.2304 = phi i32 [ %add157, %while.body132 ], [ %_ctf.0.lcssa, %while.body132.preheader ]368 %_cft.2303 = phi i32 [ %add164, %while.body132 ], [ %_cft.0.lcssa, %while.body132.preheader ]369 %nbBoolBlock.2302 = phi i32 [ %dec165, %while.body132 ], [ %nbBoolBlock.1.lcssa, %while.body132.preheader ]370 %a.1301 = phi i32 [ %shr135, %while.body132 ], [ %shr126, %while.body132.preheader ]371 %b.1300 = phi i32 [ %shr136, %while.body132 ], [ %shr128, %while.body132.preheader ]372 %and133 = and i32 %a.1301, 1373 %and134 = and i32 %b.1300, 1374 %shr135 = lshr i32 %a.1301, 1375 %shr136 = lshr i32 %b.1300, 1376 %tobool137 = icmp ne i32 %and133, 0377 %tobool139 = icmp ne i32 %and134, 0378 %18 = select i1 %tobool137, i1 %tobool139, i1 false379 %land.ext141 = zext i1 %18 to i32380 %add142 = add i32 %_ctt.2306, %land.ext141381 %tobool144 = icmp eq i32 %and133, 0382 %tobool147 = icmp eq i32 %and134, 0383 %19 = select i1 %tobool144, i1 %tobool147, i1 false384 %land.ext149 = zext i1 %19 to i32385 %add150 = add i32 %_cff.2305, %land.ext149386 %20 = select i1 %tobool137, i1 %tobool147, i1 false387 %land.ext156 = zext i1 %20 to i32388 %add157 = add i32 %_ctf.2304, %land.ext156389 %21 = select i1 %tobool144, i1 %tobool139, i1 false390 %land.ext163 = zext i1 %21 to i32391 %add164 = add i32 %_cft.2303, %land.ext163392 %dec165 = add nsw i32 %nbBoolBlock.2302, -1393 %cmp130.not = icmp eq i32 %dec165, 0394 br i1 %cmp130.not, label %while.end166, label %while.body132395 396while.end166: ; preds = %while.body132, %while.end122397 %_cft.2.lcssa = phi i32 [ %_cft.0.lcssa, %while.end122 ], [ %add164, %while.body132 ]398 %_ctf.2.lcssa = phi i32 [ %_ctf.0.lcssa, %while.end122 ], [ %add157, %while.body132 ]399 %_cff.2.lcssa = phi i32 [ %_cff.0.lcssa, %while.end122 ], [ %add150, %while.body132 ]400 %_ctt.2.lcssa = phi i32 [ %_ctt.0.lcssa, %while.end122 ], [ %add142, %while.body132 ]401 store i32 %_ctt.2.lcssa, ptr %cTT, align 4402 store i32 %_cff.2.lcssa, ptr %cFF, align 4403 store i32 %_ctf.2.lcssa, ptr %cTF, align 4404 store i32 %_cft.2.lcssa, ptr %cFT, align 4405 ret void406}407 408define void @scalar(ptr nocapture noundef readonly %pA, ptr nocapture noundef readonly %pB, i32 noundef %numberOfBools, ptr nocapture noundef writeonly %cTT, ptr nocapture noundef writeonly %cFF, ptr nocapture noundef writeonly %cTF, ptr nocapture noundef writeonly %cFT) {409; CHECK-LABEL: @scalar(410; CHECK-NEXT: entry:411; CHECK-NEXT: [[CMP117:%.*]] = icmp ugt i32 [[NUMBEROFBOOLS:%.*]], 31412; CHECK-NEXT: br i1 [[CMP117]], label [[WHILE_BODY:%.*]], label [[WHILE_END29:%.*]]413; CHECK: while.body:414; CHECK-NEXT: [[_CFT_0124:%.*]] = phi i32 [ [[ADD28:%.*]], [[WHILE_END:%.*]] ], [ 0, [[ENTRY:%.*]] ]415; CHECK-NEXT: [[_CTF_0123:%.*]] = phi i32 [ [[ADD21:%.*]], [[WHILE_END]] ], [ 0, [[ENTRY]] ]416; CHECK-NEXT: [[_CFF_0122:%.*]] = phi i32 [ [[ADD14:%.*]], [[WHILE_END]] ], [ 0, [[ENTRY]] ]417; CHECK-NEXT: [[_CTT_0121:%.*]] = phi i32 [ [[ADD:%.*]], [[WHILE_END]] ], [ 0, [[ENTRY]] ]418; CHECK-NEXT: [[PA_ADDR_0120:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[WHILE_END]] ], [ [[PA:%.*]], [[ENTRY]] ]419; CHECK-NEXT: [[PB_ADDR_0119:%.*]] = phi ptr [ [[INCDEC_PTR1:%.*]], [[WHILE_END]] ], [ [[PB:%.*]], [[ENTRY]] ]420; CHECK-NEXT: [[NUMBEROFBOOLS_ADDR_0118:%.*]] = phi i32 [ [[SUB:%.*]], [[WHILE_END]] ], [ [[NUMBEROFBOOLS]], [[ENTRY]] ]421; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PA_ADDR_0120]], align 4422; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[PB_ADDR_0119]], align 4423; CHECK-NEXT: br label [[WHILE_BODY4:%.*]]424; CHECK: while.body4:425; CHECK-NEXT: [[SHIFT_0116:%.*]] = phi i32 [ 0, [[WHILE_BODY]] ], [ [[INC:%.*]], [[WHILE_BODY4]] ]426; CHECK-NEXT: [[B_0115:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY]] ], [ [[SHR6:%.*]], [[WHILE_BODY4]] ]427; CHECK-NEXT: [[A_0114:%.*]] = phi i32 [ [[TMP0]], [[WHILE_BODY]] ], [ [[SHR:%.*]], [[WHILE_BODY4]] ]428; CHECK-NEXT: [[_CFT_1113:%.*]] = phi i32 [ [[_CFT_0124]], [[WHILE_BODY]] ], [ [[ADD28]], [[WHILE_BODY4]] ]429; CHECK-NEXT: [[_CTF_1112:%.*]] = phi i32 [ [[_CTF_0123]], [[WHILE_BODY]] ], [ [[ADD21]], [[WHILE_BODY4]] ]430; CHECK-NEXT: [[_CFF_1111:%.*]] = phi i32 [ [[_CFF_0122]], [[WHILE_BODY]] ], [ [[ADD14]], [[WHILE_BODY4]] ]431; CHECK-NEXT: [[_CTT_1110:%.*]] = phi i32 [ [[_CTT_0121]], [[WHILE_BODY]] ], [ [[ADD]], [[WHILE_BODY4]] ]432; CHECK-NEXT: [[AND:%.*]] = and i32 [[A_0114]], 1433; CHECK-NEXT: [[AND5:%.*]] = and i32 [[B_0115]], 1434; CHECK-NEXT: [[SHR]] = lshr i32 [[A_0114]], 1435; CHECK-NEXT: [[SHR6]] = lshr i32 [[B_0115]], 1436; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[AND]], 0437; CHECK-NEXT: [[TOBOOL7:%.*]] = icmp ne i32 [[AND5]], 0438; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TOBOOL]], i1 [[TOBOOL7]], i1 false439; CHECK-NEXT: [[LAND_EXT:%.*]] = zext i1 [[TMP2]] to i32440; CHECK-NEXT: [[ADD]] = add i32 [[_CTT_1110]], [[LAND_EXT]]441; CHECK-NEXT: [[TOBOOL8:%.*]] = icmp eq i32 [[AND]], 0442; CHECK-NEXT: [[TOBOOL11:%.*]] = icmp eq i32 [[AND5]], 0443; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TOBOOL8]], i1 [[TOBOOL11]], i1 false444; CHECK-NEXT: [[LAND_EXT13:%.*]] = zext i1 [[TMP3]] to i32445; CHECK-NEXT: [[ADD14]] = add i32 [[_CFF_1111]], [[LAND_EXT13]]446; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TOBOOL]], i1 [[TOBOOL11]], i1 false447; CHECK-NEXT: [[LAND_EXT20:%.*]] = zext i1 [[TMP4]] to i32448; CHECK-NEXT: [[ADD21]] = add i32 [[_CTF_1112]], [[LAND_EXT20]]449; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TOBOOL8]], i1 [[TOBOOL7]], i1 false450; CHECK-NEXT: [[LAND_EXT27:%.*]] = zext i1 [[TMP5]] to i32451; CHECK-NEXT: [[ADD28]] = add i32 [[_CFT_1113]], [[LAND_EXT27]]452; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[SHIFT_0116]], 1453; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], 32454; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[WHILE_END]], label [[WHILE_BODY4]]455; CHECK: while.end:456; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i32, ptr [[PA_ADDR_0120]], i64 1457; CHECK-NEXT: [[INCDEC_PTR1]] = getelementptr inbounds i32, ptr [[PB_ADDR_0119]], i64 1458; CHECK-NEXT: [[SUB]] = add i32 [[NUMBEROFBOOLS_ADDR_0118]], -32459; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[SUB]], 31460; CHECK-NEXT: br i1 [[CMP]], label [[WHILE_BODY]], label [[WHILE_END29]]461; CHECK: while.end29:462; CHECK-NEXT: [[NUMBEROFBOOLS_ADDR_0_LCSSA:%.*]] = phi i32 [ [[NUMBEROFBOOLS]], [[ENTRY]] ], [ [[SUB]], [[WHILE_END]] ]463; CHECK-NEXT: [[PB_ADDR_0_LCSSA:%.*]] = phi ptr [ [[PB]], [[ENTRY]] ], [ [[INCDEC_PTR1]], [[WHILE_END]] ]464; CHECK-NEXT: [[PA_ADDR_0_LCSSA:%.*]] = phi ptr [ [[PA]], [[ENTRY]] ], [ [[INCDEC_PTR]], [[WHILE_END]] ]465; CHECK-NEXT: [[_CTT_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD]], [[WHILE_END]] ]466; CHECK-NEXT: [[_CFF_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD14]], [[WHILE_END]] ]467; CHECK-NEXT: [[_CTF_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD21]], [[WHILE_END]] ]468; CHECK-NEXT: [[_CFT_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD28]], [[WHILE_END]] ]469; CHECK-NEXT: [[CMP37_NOT131:%.*]] = icmp eq i32 [[NUMBEROFBOOLS_ADDR_0_LCSSA]], 0470; CHECK-NEXT: br i1 [[CMP37_NOT131]], label [[WHILE_END71:%.*]], label [[WHILE_BODY38_PREHEADER:%.*]]471; CHECK: while.body38.preheader:472; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[PB_ADDR_0_LCSSA]], align 4473; CHECK-NEXT: [[SUB32:%.*]] = sub nuw nsw i32 32, [[NUMBEROFBOOLS_ADDR_0_LCSSA]]474; CHECK-NEXT: [[SHR35:%.*]] = lshr i32 [[TMP6]], [[SUB32]]475; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[PA_ADDR_0_LCSSA]], align 4476; CHECK-NEXT: [[SHR33:%.*]] = lshr i32 [[TMP7]], [[SUB32]]477; CHECK-NEXT: br label [[WHILE_BODY38:%.*]]478; CHECK: while.body38:479; CHECK-NEXT: [[B_1138:%.*]] = phi i32 [ [[SHR42:%.*]], [[WHILE_BODY38]] ], [ [[SHR35]], [[WHILE_BODY38_PREHEADER]] ]480; CHECK-NEXT: [[A_1137:%.*]] = phi i32 [ [[SHR41:%.*]], [[WHILE_BODY38]] ], [ [[SHR33]], [[WHILE_BODY38_PREHEADER]] ]481; CHECK-NEXT: [[_CFT_2136:%.*]] = phi i32 [ [[ADD70:%.*]], [[WHILE_BODY38]] ], [ [[_CFT_0_LCSSA]], [[WHILE_BODY38_PREHEADER]] ]482; CHECK-NEXT: [[_CTF_2135:%.*]] = phi i32 [ [[ADD63:%.*]], [[WHILE_BODY38]] ], [ [[_CTF_0_LCSSA]], [[WHILE_BODY38_PREHEADER]] ]483; CHECK-NEXT: [[_CFF_2134:%.*]] = phi i32 [ [[ADD56:%.*]], [[WHILE_BODY38]] ], [ [[_CFF_0_LCSSA]], [[WHILE_BODY38_PREHEADER]] ]484; CHECK-NEXT: [[_CTT_2133:%.*]] = phi i32 [ [[ADD48:%.*]], [[WHILE_BODY38]] ], [ [[_CTT_0_LCSSA]], [[WHILE_BODY38_PREHEADER]] ]485; CHECK-NEXT: [[NUMBEROFBOOLS_ADDR_1132:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY38]] ], [ [[NUMBEROFBOOLS_ADDR_0_LCSSA]], [[WHILE_BODY38_PREHEADER]] ]486; CHECK-NEXT: [[AND39:%.*]] = and i32 [[A_1137]], 1487; CHECK-NEXT: [[AND40:%.*]] = and i32 [[B_1138]], 1488; CHECK-NEXT: [[SHR41]] = lshr i32 [[A_1137]], 1489; CHECK-NEXT: [[SHR42]] = lshr i32 [[B_1138]], 1490; CHECK-NEXT: [[TOBOOL43:%.*]] = icmp ne i32 [[AND39]], 0491; CHECK-NEXT: [[TOBOOL45:%.*]] = icmp ne i32 [[AND40]], 0492; CHECK-NEXT: [[TMP8:%.*]] = select i1 [[TOBOOL43]], i1 [[TOBOOL45]], i1 false493; CHECK-NEXT: [[LAND_EXT47:%.*]] = zext i1 [[TMP8]] to i32494; CHECK-NEXT: [[ADD48]] = add i32 [[_CTT_2133]], [[LAND_EXT47]]495; CHECK-NEXT: [[TOBOOL50:%.*]] = icmp eq i32 [[AND39]], 0496; CHECK-NEXT: [[TOBOOL53:%.*]] = icmp eq i32 [[AND40]], 0497; CHECK-NEXT: [[TMP9:%.*]] = select i1 [[TOBOOL50]], i1 [[TOBOOL53]], i1 false498; CHECK-NEXT: [[LAND_EXT55:%.*]] = zext i1 [[TMP9]] to i32499; CHECK-NEXT: [[ADD56]] = add i32 [[_CFF_2134]], [[LAND_EXT55]]500; CHECK-NEXT: [[TMP10:%.*]] = select i1 [[TOBOOL43]], i1 [[TOBOOL53]], i1 false501; CHECK-NEXT: [[LAND_EXT62:%.*]] = zext i1 [[TMP10]] to i32502; CHECK-NEXT: [[ADD63]] = add i32 [[_CTF_2135]], [[LAND_EXT62]]503; CHECK-NEXT: [[TMP11:%.*]] = select i1 [[TOBOOL50]], i1 [[TOBOOL45]], i1 false504; CHECK-NEXT: [[LAND_EXT69:%.*]] = zext i1 [[TMP11]] to i32505; CHECK-NEXT: [[ADD70]] = add i32 [[_CFT_2136]], [[LAND_EXT69]]506; CHECK-NEXT: [[DEC]] = add nsw i32 [[NUMBEROFBOOLS_ADDR_1132]], -1507; CHECK-NEXT: [[CMP37_NOT:%.*]] = icmp eq i32 [[DEC]], 0508; CHECK-NEXT: br i1 [[CMP37_NOT]], label [[WHILE_END71]], label [[WHILE_BODY38]]509; CHECK: while.end71:510; CHECK-NEXT: [[_CTT_2_LCSSA:%.*]] = phi i32 [ [[_CTT_0_LCSSA]], [[WHILE_END29]] ], [ [[ADD48]], [[WHILE_BODY38]] ]511; CHECK-NEXT: [[_CFF_2_LCSSA:%.*]] = phi i32 [ [[_CFF_0_LCSSA]], [[WHILE_END29]] ], [ [[ADD56]], [[WHILE_BODY38]] ]512; CHECK-NEXT: [[_CTF_2_LCSSA:%.*]] = phi i32 [ [[_CTF_0_LCSSA]], [[WHILE_END29]] ], [ [[ADD63]], [[WHILE_BODY38]] ]513; CHECK-NEXT: [[_CFT_2_LCSSA:%.*]] = phi i32 [ [[_CFT_0_LCSSA]], [[WHILE_END29]] ], [ [[ADD70]], [[WHILE_BODY38]] ]514; CHECK-NEXT: store i32 [[_CTT_2_LCSSA]], ptr [[CTT:%.*]], align 4515; CHECK-NEXT: store i32 [[_CFF_2_LCSSA]], ptr [[CFF:%.*]], align 4516; CHECK-NEXT: store i32 [[_CTF_2_LCSSA]], ptr [[CTF:%.*]], align 4517; CHECK-NEXT: store i32 [[_CFT_2_LCSSA]], ptr [[CFT:%.*]], align 4518; CHECK-NEXT: ret void519;520entry:521 %cmp117 = icmp ugt i32 %numberOfBools, 31522 br i1 %cmp117, label %while.body, label %while.end29523 524while.body: ; preds = %entry, %while.end525 %_cft.0124 = phi i32 [ %add28, %while.end ], [ 0, %entry ]526 %_ctf.0123 = phi i32 [ %add21, %while.end ], [ 0, %entry ]527 %_cff.0122 = phi i32 [ %add14, %while.end ], [ 0, %entry ]528 %_ctt.0121 = phi i32 [ %add, %while.end ], [ 0, %entry ]529 %pA.addr.0120 = phi ptr [ %incdec.ptr, %while.end ], [ %pA, %entry ]530 %pB.addr.0119 = phi ptr [ %incdec.ptr1, %while.end ], [ %pB, %entry ]531 %numberOfBools.addr.0118 = phi i32 [ %sub, %while.end ], [ %numberOfBools, %entry ]532 %0 = load i32, ptr %pA.addr.0120, align 4533 %1 = load i32, ptr %pB.addr.0119, align 4534 br label %while.body4535 536while.body4: ; preds = %while.body, %while.body4537 %shift.0116 = phi i32 [ 0, %while.body ], [ %inc, %while.body4 ]538 %b.0115 = phi i32 [ %1, %while.body ], [ %shr6, %while.body4 ]539 %a.0114 = phi i32 [ %0, %while.body ], [ %shr, %while.body4 ]540 %_cft.1113 = phi i32 [ %_cft.0124, %while.body ], [ %add28, %while.body4 ]541 %_ctf.1112 = phi i32 [ %_ctf.0123, %while.body ], [ %add21, %while.body4 ]542 %_cff.1111 = phi i32 [ %_cff.0122, %while.body ], [ %add14, %while.body4 ]543 %_ctt.1110 = phi i32 [ %_ctt.0121, %while.body ], [ %add, %while.body4 ]544 %and = and i32 %a.0114, 1545 %and5 = and i32 %b.0115, 1546 %shr = lshr i32 %a.0114, 1547 %shr6 = lshr i32 %b.0115, 1548 %tobool = icmp ne i32 %and, 0549 %tobool7 = icmp ne i32 %and5, 0550 %2 = select i1 %tobool, i1 %tobool7, i1 false551 %land.ext = zext i1 %2 to i32552 %add = add i32 %_ctt.1110, %land.ext553 %tobool8 = icmp eq i32 %and, 0554 %tobool11 = icmp eq i32 %and5, 0555 %3 = select i1 %tobool8, i1 %tobool11, i1 false556 %land.ext13 = zext i1 %3 to i32557 %add14 = add i32 %_cff.1111, %land.ext13558 %4 = select i1 %tobool, i1 %tobool11, i1 false559 %land.ext20 = zext i1 %4 to i32560 %add21 = add i32 %_ctf.1112, %land.ext20561 %5 = select i1 %tobool8, i1 %tobool7, i1 false562 %land.ext27 = zext i1 %5 to i32563 %add28 = add i32 %_cft.1113, %land.ext27564 %inc = add nuw nsw i32 %shift.0116, 1565 %exitcond.not = icmp eq i32 %inc, 32566 br i1 %exitcond.not, label %while.end, label %while.body4567 568while.end: ; preds = %while.body4569 %incdec.ptr = getelementptr inbounds i32, ptr %pA.addr.0120, i64 1570 %incdec.ptr1 = getelementptr inbounds i32, ptr %pB.addr.0119, i64 1571 %sub = add i32 %numberOfBools.addr.0118, -32572 %cmp = icmp ugt i32 %sub, 31573 br i1 %cmp, label %while.body, label %while.end29574 575while.end29: ; preds = %while.end, %entry576 %numberOfBools.addr.0.lcssa = phi i32 [ %numberOfBools, %entry ], [ %sub, %while.end ]577 %pB.addr.0.lcssa = phi ptr [ %pB, %entry ], [ %incdec.ptr1, %while.end ]578 %pA.addr.0.lcssa = phi ptr [ %pA, %entry ], [ %incdec.ptr, %while.end ]579 %_ctt.0.lcssa = phi i32 [ 0, %entry ], [ %add, %while.end ]580 %_cff.0.lcssa = phi i32 [ 0, %entry ], [ %add14, %while.end ]581 %_ctf.0.lcssa = phi i32 [ 0, %entry ], [ %add21, %while.end ]582 %_cft.0.lcssa = phi i32 [ 0, %entry ], [ %add28, %while.end ]583 %cmp37.not131 = icmp eq i32 %numberOfBools.addr.0.lcssa, 0584 br i1 %cmp37.not131, label %while.end71, label %while.body38.preheader585 586while.body38.preheader: ; preds = %while.end29587 %6 = load i32, ptr %pB.addr.0.lcssa, align 4588 %sub32 = sub nuw nsw i32 32, %numberOfBools.addr.0.lcssa589 %shr35 = lshr i32 %6, %sub32590 %7 = load i32, ptr %pA.addr.0.lcssa, align 4591 %shr33 = lshr i32 %7, %sub32592 br label %while.body38593 594while.body38: ; preds = %while.body38.preheader, %while.body38595 %b.1138 = phi i32 [ %shr42, %while.body38 ], [ %shr35, %while.body38.preheader ]596 %a.1137 = phi i32 [ %shr41, %while.body38 ], [ %shr33, %while.body38.preheader ]597 %_cft.2136 = phi i32 [ %add70, %while.body38 ], [ %_cft.0.lcssa, %while.body38.preheader ]598 %_ctf.2135 = phi i32 [ %add63, %while.body38 ], [ %_ctf.0.lcssa, %while.body38.preheader ]599 %_cff.2134 = phi i32 [ %add56, %while.body38 ], [ %_cff.0.lcssa, %while.body38.preheader ]600 %_ctt.2133 = phi i32 [ %add48, %while.body38 ], [ %_ctt.0.lcssa, %while.body38.preheader ]601 %numberOfBools.addr.1132 = phi i32 [ %dec, %while.body38 ], [ %numberOfBools.addr.0.lcssa, %while.body38.preheader ]602 %and39 = and i32 %a.1137, 1603 %and40 = and i32 %b.1138, 1604 %shr41 = lshr i32 %a.1137, 1605 %shr42 = lshr i32 %b.1138, 1606 %tobool43 = icmp ne i32 %and39, 0607 %tobool45 = icmp ne i32 %and40, 0608 %8 = select i1 %tobool43, i1 %tobool45, i1 false609 %land.ext47 = zext i1 %8 to i32610 %add48 = add i32 %_ctt.2133, %land.ext47611 %tobool50 = icmp eq i32 %and39, 0612 %tobool53 = icmp eq i32 %and40, 0613 %9 = select i1 %tobool50, i1 %tobool53, i1 false614 %land.ext55 = zext i1 %9 to i32615 %add56 = add i32 %_cff.2134, %land.ext55616 %10 = select i1 %tobool43, i1 %tobool53, i1 false617 %land.ext62 = zext i1 %10 to i32618 %add63 = add i32 %_ctf.2135, %land.ext62619 %11 = select i1 %tobool50, i1 %tobool45, i1 false620 %land.ext69 = zext i1 %11 to i32621 %add70 = add i32 %_cft.2136, %land.ext69622 %dec = add nsw i32 %numberOfBools.addr.1132, -1623 %cmp37.not = icmp eq i32 %dec, 0624 br i1 %cmp37.not, label %while.end71, label %while.body38625 626while.end71: ; preds = %while.body38, %while.end29627 %_ctt.2.lcssa = phi i32 [ %_ctt.0.lcssa, %while.end29 ], [ %add48, %while.body38 ]628 %_cff.2.lcssa = phi i32 [ %_cff.0.lcssa, %while.end29 ], [ %add56, %while.body38 ]629 %_ctf.2.lcssa = phi i32 [ %_ctf.0.lcssa, %while.end29 ], [ %add63, %while.body38 ]630 %_cft.2.lcssa = phi i32 [ %_cft.0.lcssa, %while.end29 ], [ %add70, %while.body38 ]631 store i32 %_ctt.2.lcssa, ptr %cTT, align 4632 store i32 %_cff.2.lcssa, ptr %cFF, align 4633 store i32 %_ctf.2.lcssa, ptr %cTF, align 4634 store i32 %_cft.2.lcssa, ptr %cFT, align 4635 ret void636}637 638; FIXME: This should not be vectorizing (further) with expensive shuffles.639; The old cost of the or+extract should be 2*1 (or) + 4*2 (extract). The new640; cost should be 1*1 (or) + 2*2 (extract) + at least 4 (shuffles).641define i1 @tryMapToRange(ptr %values, ptr %result, <2 x i64> %hi, <2 x i64> %lo) {642; CHECK-LABEL: @tryMapToRange(643; CHECK-NEXT: [[L:%.*]] = load <2 x i64>, ptr [[VALUES:%.*]], align 8644; CHECK-NEXT: [[C1:%.*]] = icmp sgt <2 x i64> [[L]], [[HI:%.*]]645; CHECK-NEXT: [[S1:%.*]] = sext <2 x i1> [[C1]] to <2 x i64>646; CHECK-NEXT: [[BC1:%.*]] = bitcast <2 x i64> [[S1]] to <16 x i8>647; CHECK-NEXT: [[A1:%.*]] = and <16 x i8> [[BC1]], <i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>648; CHECK-NEXT: [[TMP5:%.*]] = extractelement <16 x i8> [[A1]], i64 0649; CHECK-NEXT: [[TMP4:%.*]] = extractelement <16 x i8> [[A1]], i64 8650; CHECK-NEXT: [[C2:%.*]] = icmp slt <2 x i64> [[L]], [[LO:%.*]]651; CHECK-NEXT: [[S2:%.*]] = sext <2 x i1> [[C2]] to <2 x i64>652; CHECK-NEXT: [[BC2:%.*]] = bitcast <2 x i64> [[S2]] to <16 x i8>653; CHECK-NEXT: [[A2:%.*]] = and <16 x i8> [[BC2]], <i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>654; CHECK-NEXT: [[E3:%.*]] = extractelement <16 x i8> [[A2]], i64 0655; CHECK-NEXT: [[E4:%.*]] = extractelement <16 x i8> [[A2]], i64 8656; CHECK-NEXT: [[REASS_SUB:%.*]] = sub <2 x i64> [[L]], [[LO]]657; CHECK-NEXT: [[ADD_I_I_I_I_I_I:%.*]] = add <2 x i64> [[REASS_SUB]], splat (i64 1)658; CHECK-NEXT: store <2 x i64> [[ADD_I_I_I_I_I_I]], ptr [[RESULT:%.*]], align 8659; CHECK-NEXT: [[O3:%.*]] = or i8 [[TMP4]], [[TMP5]]660; CHECK-NEXT: [[O2:%.*]] = or i8 [[E4]], [[E3]]661; CHECK-NEXT: [[O4:%.*]] = or i8 [[O3]], [[O2]]662; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[O4]], 0663; CHECK-NEXT: ret i1 [[C]]664;665 %l = load <2 x i64>, ptr %values, align 8666 %c1 = icmp sgt <2 x i64> %l, %hi667 %s1 = sext <2 x i1> %c1 to <2 x i64>668 %bc1 = bitcast <2 x i64> %s1 to <16 x i8>669 %a1 = and <16 x i8> %bc1, <i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>670 %e1 = extractelement <16 x i8> %a1, i64 0671 %e2 = extractelement <16 x i8> %a1, i64 8672 %c2 = icmp slt <2 x i64> %l, %lo673 %s2 = sext <2 x i1> %c2 to <2 x i64>674 %bc2 = bitcast <2 x i64> %s2 to <16 x i8>675 %a2 = and <16 x i8> %bc2, <i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 1, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>676 %e3 = extractelement <16 x i8> %a2, i64 0677 %e4 = extractelement <16 x i8> %a2, i64 8678 %reass.sub = sub <2 x i64> %l, %lo679 %add.i.i.i.i.i.i = add <2 x i64> %reass.sub, splat (i64 1)680 store <2 x i64> %add.i.i.i.i.i.i, ptr %result, align 8681 %o1 = or i8 %e2, %e1682 %o2 = or i8 %e4, %e3683 %o3 = or i8 %o1, %o2684 %c = icmp eq i8 %o3, 0685 ret i1 %c686}687 688 689declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>) #1690declare <8 x i16> @llvm.aarch64.neon.uaddlp.v8i16.v16i8(<16 x i8>) #2691declare <4 x i32> @llvm.aarch64.neon.uaddlp.v4i32.v8i16(<8 x i16>) #2692declare <2 x i64> @llvm.aarch64.neon.uaddlp.v2i64.v4i32(<4 x i32>) #2693