19cf67f6eSNikita Popov; RUN: opt -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -S \ 2846cdf01SMel Chen; RUN: < %s | FileCheck %s 39cf67f6eSNikita Popov; RUN: opt -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 \ 4846cdf01SMel Chen; RUN: -scalable-vectorization=on -S < %s | FileCheck %s -check-prefix=SCALABLE 5846cdf01SMel Chen 6846cdf01SMel Chentarget triple = "riscv64" 7846cdf01SMel Chen 89cf67f6eSNikita Popovdefine i32 @select_icmp(i32 %x, i32 %y, ptr nocapture readonly %c, i64 %n) #0 { 9bccb7ed8SFlorian Hahn; CHECK-LABEL: @select_icmp 10846cdf01SMel Chen; CHECK: vector.ph: 11bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, 4 12bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 13bccb7ed8SFlorian Hahn; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[X:%.*]], i64 0 14846cdf01SMel Chen; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer 15846cdf01SMel Chen; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 16846cdf01SMel Chen; CHECK: vector.body: 17bccb7ed8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 18bccb7ed8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ] 19846cdf01SMel Chen; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 20bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[C:%.*]], i64 [[TMP0]] 219cf67f6eSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 229cf67f6eSNikita Popov; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4 23bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP4:%.*]] = icmp slt <4 x i32> [[WIDE_LOAD]], [[BROADCAST_SPLAT]] 2438fffa63SPaul Walker; CHECK-NEXT: [[NOT:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true) 25bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP5]] = or <4 x i1> [[VEC_PHI]], [[NOT]] 26846cdf01SMel Chen; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 27bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 28bccb7ed8SFlorian Hahn; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 29846cdf01SMel Chen; CHECK: middle.block: 30bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]]) 31bccb7ed8SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[TMP7]] 32bccb7ed8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 %y, i32 0 3399d6c6d9SFlorian Hahn; CHECK-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 34846cdf01SMel Chen; 35bccb7ed8SFlorian Hahn; SCALABLE-LABEL: @select_icmp 36846cdf01SMel Chen; SCALABLE: vector.ph: 37846cdf01SMel Chen; SCALABLE-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64() 38846cdf01SMel Chen; SCALABLE-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 4 39bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, [[TMP3]] 40bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 41bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP10:%.*]] = call i64 @llvm.vscale.i64() 42bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP11:%.*]] = mul i64 [[TMP10]], 4 43bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[X:%.*]], i64 0 44846cdf01SMel Chen; SCALABLE-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[BROADCAST_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 45846cdf01SMel Chen; SCALABLE-NEXT: br label [[VECTOR_BODY:%.*]] 46846cdf01SMel Chen; SCALABLE: vector.body: 47bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 48bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 49bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0 50bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[C:%.*]], i64 [[TMP4]] 51bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i32 0 52bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP6]], align 4 53bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP8:%.*]] = icmp slt <vscale x 4 x i32> [[WIDE_LOAD]], [[BROADCAST_SPLAT]] 54*56c091eaSPaul Walker; SCALABLE-NEXT: [[NOT:%.*]] = xor <vscale x 4 x i1> [[TMP8]], splat (i1 true) 55bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP9]] = or <vscale x 4 x i1> [[VEC_PHI]], [[NOT]] 56bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP11]] 57bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 58bccb7ed8SFlorian Hahn; SCALABLE-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 59846cdf01SMel Chen; SCALABLE: middle.block: 60bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP13:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]]) 61bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[FR:%.*]] = freeze i1 [[TMP13]] 62bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 %y, i32 0 6399d6c6d9SFlorian Hahn; SCALABLE-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 64846cdf01SMel Chen; 65846cdf01SMel Chenentry: 66846cdf01SMel Chen br label %for.body 67846cdf01SMel Chen 68846cdf01SMel Chenfor.body: 69846cdf01SMel Chen %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 70846cdf01SMel Chen %a = phi i32 [ 0, %entry], [ %cond, %for.body ] 719cf67f6eSNikita Popov %arrayidx = getelementptr inbounds i32, ptr %c, i64 %indvars.iv 729cf67f6eSNikita Popov %0 = load i32, ptr %arrayidx, align 4 73846cdf01SMel Chen %cmp1 = icmp slt i32 %0, %x 74846cdf01SMel Chen %cond = select i1 %cmp1, i32 %a, i32 %y 75846cdf01SMel Chen %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 76846cdf01SMel Chen %exitcond.not = icmp eq i64 %indvars.iv.next, %n 77846cdf01SMel Chen br i1 %exitcond.not, label %for.end, label %for.body 78846cdf01SMel Chen 79846cdf01SMel Chenfor.end: 80846cdf01SMel Chen ret i32 %cond 81846cdf01SMel Chen} 82846cdf01SMel Chen 839cf67f6eSNikita Popovdefine i32 @select_fcmp(float %x, i32 %y, ptr nocapture readonly %c, i64 %n) #0 { 84bccb7ed8SFlorian Hahn; CHECK-LABEL: @select_fcmp 85846cdf01SMel Chen; CHECK: vector.ph: 86bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, 4 87bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 88bccb7ed8SFlorian Hahn; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[X:%.*]], i64 0 89846cdf01SMel Chen; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer 90846cdf01SMel Chen; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 91846cdf01SMel Chen; CHECK: vector.body: 92bccb7ed8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 93bccb7ed8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ] 94846cdf01SMel Chen; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 95bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[C:%.*]], i64 [[TMP0]] 969cf67f6eSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 0 979cf67f6eSNikita Popov; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP2]], align 4 98bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP4:%.*]] = fcmp fast olt <4 x float> [[WIDE_LOAD]], [[BROADCAST_SPLAT]] 9938fffa63SPaul Walker; CHECK-NEXT: [[NOT:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true) 100bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP5]] = or <4 x i1> [[VEC_PHI]], [[NOT]] 101846cdf01SMel Chen; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 102bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 103bccb7ed8SFlorian Hahn; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 104846cdf01SMel Chen; CHECK: middle.block: 105bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]]) 106bccb7ed8SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[TMP7]] 107bccb7ed8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 %y, i32 0 10899d6c6d9SFlorian Hahn; CHECK-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 109846cdf01SMel Chen; 110bccb7ed8SFlorian Hahn; SCALABLE-LABEL: @select_fcmp 111846cdf01SMel Chen; SCALABLE: vector.ph: 112846cdf01SMel Chen; SCALABLE-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64() 113846cdf01SMel Chen; SCALABLE-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 4 114bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, [[TMP3]] 115bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 116bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP10:%.*]] = call i64 @llvm.vscale.i64() 117bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP11:%.*]] = mul i64 [[TMP10]], 4 118bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 4 x float> poison, float [[X:%.*]], i64 0 119846cdf01SMel Chen; SCALABLE-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 4 x float> [[BROADCAST_SPLATINSERT]], <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 120846cdf01SMel Chen; SCALABLE-NEXT: br label [[VECTOR_BODY:%.*]] 121846cdf01SMel Chen; SCALABLE: vector.body: 122bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 123bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 124bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0 125bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[C:%.*]], i64 [[TMP4]] 126bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP5]], i32 0 127bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x float>, ptr [[TMP6]], align 4 128bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP8:%.*]] = fcmp fast olt <vscale x 4 x float> [[WIDE_LOAD]], [[BROADCAST_SPLAT]] 129*56c091eaSPaul Walker; SCALABLE-NEXT: [[NOT:%.*]] = xor <vscale x 4 x i1> [[TMP8]], splat (i1 true) 130bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP9]] = or <vscale x 4 x i1> [[VEC_PHI]], [[NOT]] 131bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP11]] 132bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 133bccb7ed8SFlorian Hahn; SCALABLE-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 134846cdf01SMel Chen; SCALABLE: middle.block: 135bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP13:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]]) 136bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[FR:%.*]] = freeze i1 [[TMP13]] 137bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 %y, i32 0 13899d6c6d9SFlorian Hahn; SCALABLE-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 139846cdf01SMel Chen; 140846cdf01SMel Chenentry: 141846cdf01SMel Chen br label %for.body 142846cdf01SMel Chen 143846cdf01SMel Chenfor.body: 144846cdf01SMel Chen %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 145846cdf01SMel Chen %a = phi i32 [ 0, %entry], [ %cond, %for.body ] 1469cf67f6eSNikita Popov %arrayidx = getelementptr inbounds float, ptr %c, i64 %indvars.iv 1479cf67f6eSNikita Popov %0 = load float, ptr %arrayidx, align 4 148846cdf01SMel Chen %cmp1 = fcmp fast olt float %0, %x 149846cdf01SMel Chen %cond = select i1 %cmp1, i32 %a, i32 %y 150846cdf01SMel Chen %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 151846cdf01SMel Chen %exitcond.not = icmp eq i64 %indvars.iv.next, %n 152846cdf01SMel Chen br i1 %exitcond.not, label %for.end, label %for.body 153846cdf01SMel Chen 154846cdf01SMel Chenfor.end: 155846cdf01SMel Chen ret i32 %cond 156846cdf01SMel Chen} 157846cdf01SMel Chen 1589cf67f6eSNikita Popovdefine i32 @select_const_i32_from_icmp(ptr nocapture readonly %v, i64 %n) #0 { 159bccb7ed8SFlorian Hahn; CHECK-LABEL: @select_const_i32_from_icmp 160846cdf01SMel Chen; CHECK: vector.ph: 161bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, 4 162bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 163846cdf01SMel Chen; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 164846cdf01SMel Chen; CHECK: vector.body: 165bccb7ed8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 166bccb7ed8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ] 167846cdf01SMel Chen; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 168bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[V:%.*]], i64 [[TMP0]] 1699cf67f6eSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 1709cf67f6eSNikita Popov; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4 17138fffa63SPaul Walker; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <4 x i32> [[WIDE_LOAD]], splat (i32 3) 17238fffa63SPaul Walker; CHECK-NEXT: [[NOT:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true) 173bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP5]] = or <4 x i1> [[VEC_PHI]], [[NOT]] 174846cdf01SMel Chen; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 175846cdf01SMel Chen; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 176846cdf01SMel Chen; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 177846cdf01SMel Chen; CHECK: middle.block: 178bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]]) 179bccb7ed8SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[TMP7]] 180bccb7ed8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 7, i32 3 18199d6c6d9SFlorian Hahn; CHECK-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 182846cdf01SMel Chen; 183bccb7ed8SFlorian Hahn; SCALABLE-LABEL: @select_const_i32_from_icmp 184846cdf01SMel Chen; SCALABLE: vector.ph: 185846cdf01SMel Chen; SCALABLE-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64() 186846cdf01SMel Chen; SCALABLE-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 4 187bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, [[TMP3]] 188bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 1895ea6a3fcSFlorian Hahn; SCALABLE-NEXT: [[TMP10:%.*]] = call i64 @llvm.vscale.i64() 1905ea6a3fcSFlorian Hahn; SCALABLE-NEXT: [[TMP11:%.*]] = mul i64 [[TMP10]], 4 191846cdf01SMel Chen; SCALABLE-NEXT: br label [[VECTOR_BODY:%.*]] 192846cdf01SMel Chen; SCALABLE: vector.body: 193bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 194bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 195846cdf01SMel Chen; SCALABLE-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0 196bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[V:%.*]], i64 [[TMP4]] 1979cf67f6eSNikita Popov; SCALABLE-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i32 0 1989cf67f6eSNikita Popov; SCALABLE-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP6]], align 4 199*56c091eaSPaul Walker; SCALABLE-NEXT: [[TMP8:%.*]] = icmp eq <vscale x 4 x i32> [[WIDE_LOAD]], splat (i32 3) 200*56c091eaSPaul Walker; SCALABLE-NEXT: [[NOT:%.*]] = xor <vscale x 4 x i1> [[TMP8]], splat (i1 true) 201bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP9]] = or <vscale x 4 x i1> [[VEC_PHI]], [[NOT]] 202846cdf01SMel Chen; SCALABLE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP11]] 203846cdf01SMel Chen; SCALABLE-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 204846cdf01SMel Chen; SCALABLE-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 205846cdf01SMel Chen; SCALABLE: middle.block: 206bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP13:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]]) 207bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[FR:%.*]] = freeze i1 [[TMP13]] 208bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 7, i32 3 20999d6c6d9SFlorian Hahn; SCALABLE-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 210846cdf01SMel Chen; 211846cdf01SMel Chenentry: 212846cdf01SMel Chen br label %for.body 213846cdf01SMel Chen 214846cdf01SMel Chenfor.body: ; preds = %entry, %for.body 215846cdf01SMel Chen %0 = phi i64 [ 0, %entry ], [ %6, %for.body ] 216846cdf01SMel Chen %1 = phi i32 [ 3, %entry ], [ %5, %for.body ] 2179cf67f6eSNikita Popov %2 = getelementptr inbounds i32, ptr %v, i64 %0 2189cf67f6eSNikita Popov %3 = load i32, ptr %2, align 4 219846cdf01SMel Chen %4 = icmp eq i32 %3, 3 220846cdf01SMel Chen %5 = select i1 %4, i32 %1, i32 7 221846cdf01SMel Chen %6 = add nuw nsw i64 %0, 1 222846cdf01SMel Chen %7 = icmp eq i64 %6, %n 223846cdf01SMel Chen br i1 %7, label %exit, label %for.body 224846cdf01SMel Chen 225846cdf01SMel Chenexit: ; preds = %for.body 226846cdf01SMel Chen ret i32 %5 227846cdf01SMel Chen} 228846cdf01SMel Chen 2299cf67f6eSNikita Popovdefine i32 @select_i32_from_icmp(ptr nocapture readonly %v, i32 %a, i32 %b, i64 %n) #0 { 230bccb7ed8SFlorian Hahn; CHECK-LABEL: @select_i32_from_icmp 231846cdf01SMel Chen; CHECK: vector.ph: 232bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, 4 233bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 234846cdf01SMel Chen; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 235846cdf01SMel Chen; CHECK: vector.body: 236bccb7ed8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 237bccb7ed8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ] 238846cdf01SMel Chen; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 239bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[V:%.*]], i64 [[TMP0]] 2409cf67f6eSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 2419cf67f6eSNikita Popov; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4 24238fffa63SPaul Walker; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <4 x i32> [[WIDE_LOAD]], splat (i32 3) 24338fffa63SPaul Walker; CHECK-NEXT: [[NOT:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true) 244bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP5]] = or <4 x i1> [[VEC_PHI]], [[NOT]] 245846cdf01SMel Chen; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 246846cdf01SMel Chen; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 247846cdf01SMel Chen; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]] 248846cdf01SMel Chen; CHECK: middle.block: 249bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]]) 250bccb7ed8SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[TMP7]] 251bccb7ed8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 %b, i32 %a 25299d6c6d9SFlorian Hahn; CHECK-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 253846cdf01SMel Chen; 254bccb7ed8SFlorian Hahn; SCALABLE-LABEL: @select_i32_from_icmp 255846cdf01SMel Chen; SCALABLE: vector.ph: 256846cdf01SMel Chen; SCALABLE-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64() 257846cdf01SMel Chen; SCALABLE-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 4 258bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, [[TMP3]] 259bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 260a5891fa4SFlorian Hahn; SCALABLE-NEXT: [[TMP10:%.*]] = call i64 @llvm.vscale.i64() 261a5891fa4SFlorian Hahn; SCALABLE-NEXT: [[TMP11:%.*]] = mul i64 [[TMP10]], 4 262846cdf01SMel Chen; SCALABLE-NEXT: br label [[VECTOR_BODY:%.*]] 263846cdf01SMel Chen; SCALABLE: vector.body: 264bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 265bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 266846cdf01SMel Chen; SCALABLE-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0 267bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[V:%.*]], i64 [[TMP4]] 2689cf67f6eSNikita Popov; SCALABLE-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i32 0 2699cf67f6eSNikita Popov; SCALABLE-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP6]], align 4 270*56c091eaSPaul Walker; SCALABLE-NEXT: [[TMP8:%.*]] = icmp eq <vscale x 4 x i32> [[WIDE_LOAD]], splat (i32 3) 271*56c091eaSPaul Walker; SCALABLE-NEXT: [[NOT:%.*]] = xor <vscale x 4 x i1> [[TMP8]], splat (i1 true) 272bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP9]] = or <vscale x 4 x i1> [[VEC_PHI]], [[NOT]] 273846cdf01SMel Chen; SCALABLE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP11]] 274846cdf01SMel Chen; SCALABLE-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 275846cdf01SMel Chen; SCALABLE-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]] 276846cdf01SMel Chen; SCALABLE: middle.block: 277bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP13:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]]) 278bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[FR:%.*]] = freeze i1 [[TMP13]] 279bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 %b, i32 %a 28099d6c6d9SFlorian Hahn; SCALABLE-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 281846cdf01SMel Chen; 282846cdf01SMel Chenentry: 283846cdf01SMel Chen br label %for.body 284846cdf01SMel Chen 285846cdf01SMel Chenfor.body: ; preds = %entry, %for.body 286846cdf01SMel Chen %0 = phi i64 [ 0, %entry ], [ %6, %for.body ] 287846cdf01SMel Chen %1 = phi i32 [ %a, %entry ], [ %5, %for.body ] 2889cf67f6eSNikita Popov %2 = getelementptr inbounds i32, ptr %v, i64 %0 2899cf67f6eSNikita Popov %3 = load i32, ptr %2, align 4 290846cdf01SMel Chen %4 = icmp eq i32 %3, 3 291846cdf01SMel Chen %5 = select i1 %4, i32 %1, i32 %b 292846cdf01SMel Chen %6 = add nuw nsw i64 %0, 1 293846cdf01SMel Chen %7 = icmp eq i64 %6, %n 294846cdf01SMel Chen br i1 %7, label %exit, label %for.body 295846cdf01SMel Chen 296846cdf01SMel Chenexit: ; preds = %for.body 297846cdf01SMel Chen ret i32 %5 298846cdf01SMel Chen} 299846cdf01SMel Chen 3009cf67f6eSNikita Popovdefine i32 @select_const_i32_from_fcmp(ptr nocapture readonly %v, i64 %n) #0 { 301bccb7ed8SFlorian Hahn; CHECK-LABEL: @select_const_i32_from_fcmp 302846cdf01SMel Chen; CHECK: vector.ph: 303bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, 4 304bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 305846cdf01SMel Chen; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 306846cdf01SMel Chen; CHECK: vector.body: 307bccb7ed8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 308bccb7ed8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ] 309846cdf01SMel Chen; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 310bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[V:%.*]], i64 [[TMP0]] 3119cf67f6eSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 0 3129cf67f6eSNikita Popov; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP2]], align 4 31338fffa63SPaul Walker; CHECK-NEXT: [[TMP4:%.*]] = fcmp fast ueq <4 x float> [[WIDE_LOAD]], splat (float 3.000000e+00) 31438fffa63SPaul Walker; CHECK-NEXT: [[NOT:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true) 315bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP5]] = or <4 x i1> [[VEC_PHI]], [[NOT]] 316846cdf01SMel Chen; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 317846cdf01SMel Chen; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 318846cdf01SMel Chen; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]] 319846cdf01SMel Chen; CHECK: middle.block: 320bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]]) 321bccb7ed8SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[TMP7]] 322bccb7ed8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 1, i32 2 32399d6c6d9SFlorian Hahn; CHECK-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 324846cdf01SMel Chen; 325bccb7ed8SFlorian Hahn; SCALABLE-LABEL: @select_const_i32_from_fcmp 326846cdf01SMel Chen; SCALABLE: vector.ph: 327846cdf01SMel Chen; SCALABLE-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64() 328846cdf01SMel Chen; SCALABLE-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 4 329bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, [[TMP3]] 330bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 3315ea6a3fcSFlorian Hahn; SCALABLE-NEXT: [[TMP10:%.*]] = call i64 @llvm.vscale.i64() 3325ea6a3fcSFlorian Hahn; SCALABLE-NEXT: [[TMP11:%.*]] = mul i64 [[TMP10]], 4 333846cdf01SMel Chen; SCALABLE-NEXT: br label [[VECTOR_BODY:%.*]] 334846cdf01SMel Chen; SCALABLE: vector.body: 335bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 336bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ] 337846cdf01SMel Chen; SCALABLE-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0 338bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[V:%.*]], i64 [[TMP4]] 3399cf67f6eSNikita Popov; SCALABLE-NEXT: [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP5]], i32 0 3409cf67f6eSNikita Popov; SCALABLE-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x float>, ptr [[TMP6]], align 4 341*56c091eaSPaul Walker; SCALABLE-NEXT: [[TMP8:%.*]] = fcmp fast ueq <vscale x 4 x float> [[WIDE_LOAD]], splat (float 3.000000e+00) 342*56c091eaSPaul Walker; SCALABLE-NEXT: [[NOT:%.*]] = xor <vscale x 4 x i1> [[TMP8]], splat (i1 true) 343bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP9]] = or <vscale x 4 x i1> [[VEC_PHI]], [[NOT]] 344846cdf01SMel Chen; SCALABLE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP11]] 345846cdf01SMel Chen; SCALABLE-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 346846cdf01SMel Chen; SCALABLE-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]] 347846cdf01SMel Chen; SCALABLE: middle.block: 348bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP13:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[TMP9]]) 349bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[FR:%.*]] = freeze i1 [[TMP13]] 350bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 1, i32 2 35199d6c6d9SFlorian Hahn; SCALABLE-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 352846cdf01SMel Chen; 353846cdf01SMel Chenentry: 354846cdf01SMel Chen br label %for.body 355846cdf01SMel Chen 356846cdf01SMel Chenfor.body: ; preds = %entry, %for.body 357846cdf01SMel Chen %0 = phi i64 [ 0, %entry ], [ %6, %for.body ] 358846cdf01SMel Chen %1 = phi i32 [ 2, %entry ], [ %5, %for.body ] 3599cf67f6eSNikita Popov %2 = getelementptr inbounds float, ptr %v, i64 %0 3609cf67f6eSNikita Popov %3 = load float, ptr %2, align 4 361846cdf01SMel Chen %4 = fcmp fast ueq float %3, 3.0 362846cdf01SMel Chen %5 = select i1 %4, i32 %1, i32 1 363846cdf01SMel Chen %6 = add nuw nsw i64 %0, 1 364846cdf01SMel Chen %7 = icmp eq i64 %6, %n 365846cdf01SMel Chen br i1 %7, label %exit, label %for.body 366846cdf01SMel Chen 367846cdf01SMel Chenexit: ; preds = %for.body 368846cdf01SMel Chen ret i32 %5 369846cdf01SMel Chen} 370846cdf01SMel Chen 3719cf67f6eSNikita Popovdefine float @select_const_f32_from_icmp(ptr nocapture readonly %v, i64 %n) #0 { 372bccb7ed8SFlorian Hahn; CHECK-LABEL: @select_const_f32_from_icmp 373bccb7ed8SFlorian Hahn; CHECK-NOT: vector.body 374846cdf01SMel Chen; 375bccb7ed8SFlorian Hahn; SCALABLE-LABEL: @select_const_f32_from_icmp 376bccb7ed8SFlorian Hahn; SCALABLE-NOT: vector.body 377846cdf01SMel Chen; 378846cdf01SMel Chenentry: 379846cdf01SMel Chen br label %for.body 380846cdf01SMel Chen 381846cdf01SMel Chenfor.body: ; preds = %entry, %for.body 382846cdf01SMel Chen %0 = phi i64 [ 0, %entry ], [ %6, %for.body ] 383846cdf01SMel Chen %1 = phi fast float [ 3.0, %entry ], [ %5, %for.body ] 3849cf67f6eSNikita Popov %2 = getelementptr inbounds i32, ptr %v, i64 %0 3859cf67f6eSNikita Popov %3 = load i32, ptr %2, align 4 386846cdf01SMel Chen %4 = icmp eq i32 %3, 3 387846cdf01SMel Chen %5 = select fast i1 %4, float %1, float 7.0 388846cdf01SMel Chen %6 = add nuw nsw i64 %0, 1 389846cdf01SMel Chen %7 = icmp eq i64 %6, %n 390846cdf01SMel Chen br i1 %7, label %exit, label %for.body 391846cdf01SMel Chen 392846cdf01SMel Chenexit: ; preds = %for.body 393846cdf01SMel Chen ret float %5 394846cdf01SMel Chen} 395846cdf01SMel Chen 3969cf67f6eSNikita Popovdefine i32 @pred_select_const_i32_from_icmp(ptr noalias nocapture readonly %src1, ptr noalias nocapture readonly %src2, i64 %n) #0 { 397bccb7ed8SFlorian Hahn; CHECK-LABEL: @pred_select_const_i32_from_icmp 398846cdf01SMel Chen; CHECK: vector.ph: 399bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, 4 400bccb7ed8SFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 401846cdf01SMel Chen; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 402846cdf01SMel Chen; CHECK: vector.body: 403bccb7ed8SFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 404bccb7ed8SFlorian Hahn; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[PREDPHI:%.*]], [[VECTOR_BODY]] ] 405846cdf01SMel Chen; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 406bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC1:%.*]], i64 [[TMP0]] 4079cf67f6eSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0 4089cf67f6eSNikita Popov; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4 40938fffa63SPaul Walker; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt <4 x i32> [[WIDE_LOAD]], splat (i32 35) 410bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i32, ptr [[SRC2:%.*]], i64 [[TMP0]] 411bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i32, ptr [[TMP5]], i32 0 412bccb7ed8SFlorian Hahn; CHECK-NEXT: [[WIDE_MASKED_LOAD:%.*]] = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr [[TMP6]], i32 4, <4 x i1> [[TMP4]], <4 x i32> poison) 41338fffa63SPaul Walker; CHECK-NEXT: [[TMP8:%.*]] = icmp eq <4 x i32> [[WIDE_MASKED_LOAD]], splat (i32 2) 414bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP9:%.*]] = or <4 x i1> [[VEC_PHI]], [[TMP8]] 415bccb7ed8SFlorian Hahn; CHECK-NEXT: [[PREDPHI]] = select <4 x i1> [[TMP4]], <4 x i1> [[TMP9]], <4 x i1> [[VEC_PHI]] 416846cdf01SMel Chen; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 417bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 418bccb7ed8SFlorian Hahn; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]] 419846cdf01SMel Chen; CHECK: middle.block: 420bccb7ed8SFlorian Hahn; CHECK-NEXT: [[TMP12:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[PREDPHI]]) 421bccb7ed8SFlorian Hahn; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[TMP12]] 422bccb7ed8SFlorian Hahn; CHECK-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 1, i32 0 42399d6c6d9SFlorian Hahn; CHECK-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 424846cdf01SMel Chen; 425bccb7ed8SFlorian Hahn; SCALABLE-LABEL: @pred_select_const_i32_from_icmp 426846cdf01SMel Chen; SCALABLE: vector.ph: 427846cdf01SMel Chen; SCALABLE-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64() 428846cdf01SMel Chen; SCALABLE-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 4 429bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_MOD_VF:%.*]] = urem i64 %n, [[TMP3]] 430bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[N_VEC:%.*]] = sub i64 %n, [[N_MOD_VF]] 431bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP15:%.*]] = call i64 @llvm.vscale.i64() 432bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP16:%.*]] = mul i64 [[TMP15]], 4 433846cdf01SMel Chen; SCALABLE-NEXT: br label [[VECTOR_BODY:%.*]] 434846cdf01SMel Chen; SCALABLE: vector.body: 435bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 436bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[PREDPHI:%.*]], [[VECTOR_BODY]] ] 437bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0 438bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[SRC1:%.*]], i64 [[TMP4]] 439bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i32 0 440bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP6]], align 4 441*56c091eaSPaul Walker; SCALABLE-NEXT: [[TMP8:%.*]] = icmp sgt <vscale x 4 x i32> [[WIDE_LOAD]], splat (i32 35) 442bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP9:%.*]] = getelementptr i32, ptr [[SRC2:%.*]], i64 [[TMP4]] 443bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP10:%.*]] = getelementptr i32, ptr [[TMP9]], i32 0 444bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[WIDE_MASKED_LOAD:%.*]] = call <vscale x 4 x i32> @llvm.masked.load.nxv4i32.p0(ptr [[TMP10]], i32 4, <vscale x 4 x i1> [[TMP8]], <vscale x 4 x i32> poison) 445*56c091eaSPaul Walker; SCALABLE-NEXT: [[TMP12:%.*]] = icmp eq <vscale x 4 x i32> [[WIDE_MASKED_LOAD]], splat (i32 2) 446bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP13:%.*]] = or <vscale x 4 x i1> [[VEC_PHI]], [[TMP12]] 447bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[PREDPHI]] = select <vscale x 4 x i1> [[TMP8]], <vscale x 4 x i1> [[TMP13]], <vscale x 4 x i1> [[VEC_PHI]] 448bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP16]] 449bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 450bccb7ed8SFlorian Hahn; SCALABLE-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]] 451846cdf01SMel Chen; SCALABLE: middle.block: 452bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> [[PREDPHI]]) 453bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[FR:%.*]] = freeze i1 [[TMP18]] 454bccb7ed8SFlorian Hahn; SCALABLE-NEXT: [[RDX_SELECT:%.*]] = select i1 [[FR]], i32 1, i32 0 45599d6c6d9SFlorian Hahn; SCALABLE-NEXT: %cmp.n = icmp eq i64 %n, %n.vec 456846cdf01SMel Chen; 457846cdf01SMel Chenentry: 458846cdf01SMel Chen br label %for.body 459846cdf01SMel Chen 460846cdf01SMel Chenfor.body: ; preds = %entry, %for.inc 461846cdf01SMel Chen %i.013 = phi i64 [ %inc, %for.inc ], [ 0, %entry ] 462846cdf01SMel Chen %r.012 = phi i32 [ %r.1, %for.inc ], [ 0, %entry ] 4639cf67f6eSNikita Popov %arrayidx = getelementptr inbounds i32, ptr %src1, i64 %i.013 4649cf67f6eSNikita Popov %0 = load i32, ptr %arrayidx, align 4 465846cdf01SMel Chen %cmp1 = icmp sgt i32 %0, 35 466846cdf01SMel Chen br i1 %cmp1, label %if.then, label %for.inc 467846cdf01SMel Chen 468846cdf01SMel Chenif.then: ; preds = %for.body 4699cf67f6eSNikita Popov %arrayidx2 = getelementptr inbounds i32, ptr %src2, i64 %i.013 4709cf67f6eSNikita Popov %1 = load i32, ptr %arrayidx2, align 4 471846cdf01SMel Chen %cmp3 = icmp eq i32 %1, 2 472846cdf01SMel Chen %spec.select = select i1 %cmp3, i32 1, i32 %r.012 473846cdf01SMel Chen br label %for.inc 474846cdf01SMel Chen 475846cdf01SMel Chenfor.inc: ; preds = %if.then, %for.body 476846cdf01SMel Chen %r.1 = phi i32 [ %r.012, %for.body ], [ %spec.select, %if.then ] 477846cdf01SMel Chen %inc = add nuw nsw i64 %i.013, 1 478846cdf01SMel Chen %exitcond.not = icmp eq i64 %inc, %n 479846cdf01SMel Chen br i1 %exitcond.not, label %for.end.loopexit, label %for.body 480846cdf01SMel Chen 481846cdf01SMel Chenfor.end.loopexit: ; preds = %for.inc 482846cdf01SMel Chen %r.1.lcssa = phi i32 [ %r.1, %for.inc ] 483846cdf01SMel Chen ret i32 %r.1.lcssa 484846cdf01SMel Chen} 485846cdf01SMel Chen 486846cdf01SMel Chenattributes #0 = { "target-features"="+f,+v" } 487