xref: /llvm-project/llvm/test/Transforms/LoopVectorize/select-cmp-multiuse.ll (revision 4ad0fdd1631eeae432714c03ede01a10dc00025d)
131d4c975SDinar Temirbulatov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
231d4c975SDinar Temirbulatov; RUN: opt -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -S < %s | FileCheck %s --check-prefix=CHECK-VF4-IC1 --check-prefix=CHECK
331d4c975SDinar Temirbulatov; RUN: opt -passes=loop-vectorize -force-vector-interleave=2 -force-vector-width=4 -S < %s | FileCheck %s --check-prefix=CHECK-VF4-IC2 --check-prefix=CHECK
431d4c975SDinar Temirbulatov; RUN: opt -passes=loop-vectorize -force-vector-interleave=2 -force-vector-width=1 -S < %s | FileCheck %s --check-prefix=CHECK-VF1-IC2 --check-prefix=CHECK
531d4c975SDinar Temirbulatov
631d4c975SDinar Temirbulatov
731d4c975SDinar Temirbulatov; int multi_user_cmp(float* a, long long n) {
831d4c975SDinar Temirbulatov;   _Bool any = 0;
931d4c975SDinar Temirbulatov;   _Bool all = 1;
1031d4c975SDinar Temirbulatov;   for (long long i = 0; i < n; i++) {
1131d4c975SDinar Temirbulatov;     if (a[i] < 0.0f) {
1231d4c975SDinar Temirbulatov;       any = 1;
1331d4c975SDinar Temirbulatov;     } else {
1431d4c975SDinar Temirbulatov;       all = 0;
1531d4c975SDinar Temirbulatov;     }
1631d4c975SDinar Temirbulatov;   }
1731d4c975SDinar Temirbulatov;   return all ? 1 : any ? 2 : 3;
1831d4c975SDinar Temirbulatov; }
1931d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp(ptr readonly %a, i64 noundef %n) {
2031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp(
2131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
2231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
2331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 4
2431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
2531d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.ph:
2631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 4
2731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
2831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[VECTOR_BODY:%.*]]
2931d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.body:
3031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
3131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ]
3231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI1:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP4:%.*]], [[VECTOR_BODY]] ]
3331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
3431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
3531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 0
3631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP2]], align 4
3731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP3:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD]], zeroinitializer
3831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP4]] = or <4 x i1> [[VEC_PHI1]], [[TMP3]]
3938fffa63SPaul Walker; CHECK-VF4-IC1-NEXT:    [[TMP5:%.*]] = xor <4 x i1> [[TMP3]], splat (i1 true)
4031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP6]] = or <4 x i1> [[VEC_PHI]], [[TMP5]]
4131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
4231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
4331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
4431d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       middle.block:
4531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
4631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP9:%.*]] = freeze i1 [[TMP8]]
4731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP9]], i1 false, i1 true
4831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP10:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
4931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP11:%.*]] = freeze i1 [[TMP10]]
5031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT2:%.*]] = select i1 [[TMP11]], i1 true, i1 false
5131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
5231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
5331d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       scalar.ph:
5431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
5531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
5631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX3:%.*]] = phi i1 [ [[RDX_SELECT2]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
5731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
5831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
5931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
6031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
6131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX3]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
6231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
6331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
6431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
6531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
6631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
6731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
6831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
6931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
7031d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
7131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT2]], [[MIDDLE_BLOCK]] ]
7231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
7331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP12:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
7431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP13:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP12]]
7531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP13]]
7631d4c975SDinar Temirbulatov;
7731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp(
7831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
7931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
8031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 8
8131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
8231d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.ph:
8331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 8
8431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
8531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
8631d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.body:
8731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
8831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP12:%.*]], [[VECTOR_BODY]] ]
8931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI1:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[VECTOR_BODY]] ]
9031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP8:%.*]], [[VECTOR_BODY]] ]
9131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ]
9231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
9331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
9431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 0
9531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 4
9631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP4]], align 4
9731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD4:%.*]] = load <4 x float>, ptr [[TMP5]], align 4
9831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP6:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD]], zeroinitializer
9931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP7:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD4]], zeroinitializer
10031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP8]] = or <4 x i1> [[VEC_PHI2]], [[TMP6]]
10131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP9]] = or <4 x i1> [[VEC_PHI3]], [[TMP7]]
10238fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP10:%.*]] = xor <4 x i1> [[TMP6]], splat (i1 true)
10338fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP11:%.*]] = xor <4 x i1> [[TMP7]], splat (i1 true)
10431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP12]] = or <4 x i1> [[VEC_PHI]], [[TMP10]]
10531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP13]] = or <4 x i1> [[VEC_PHI1]], [[TMP11]]
10631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
10731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
10831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
10931d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       middle.block:
11031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX:%.*]] = or <4 x i1> [[TMP13]], [[TMP12]]
11131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX]])
11231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP16:%.*]] = freeze i1 [[TMP15]]
11331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP16]], i1 false, i1 true
11431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX5:%.*]] = or <4 x i1> [[TMP9]], [[TMP8]]
11531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX5]])
11631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP18:%.*]] = freeze i1 [[TMP17]]
11731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT6:%.*]] = select i1 [[TMP18]], i1 true, i1 false
11831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
11931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
12031d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       scalar.ph:
12131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
12231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
12331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX7:%.*]] = phi i1 [ [[RDX_SELECT6]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
12431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
12531d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
12631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
12731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
12831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX7]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
12931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
13031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
13131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
13231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
13331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
13431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
13531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
13631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
13731d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
13831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT6]], [[MIDDLE_BLOCK]] ]
13931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
14031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP19:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
14131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP20:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP19]]
14231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP20]]
14331d4c975SDinar Temirbulatov;
14431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp(
14531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
14631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
14731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
14831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
14931d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.ph:
15031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
15131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
15231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
15331d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.body:
15431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
15531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP12:%.*]], [[VECTOR_BODY]] ]
15631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI1:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[VECTOR_BODY]] ]
15731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP8:%.*]], [[VECTOR_BODY]] ]
15831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ]
15931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
16031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1
16131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
16231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP1]]
16331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP4:%.*]] = load float, ptr [[TMP2]], align 4
16431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP5:%.*]] = load float, ptr [[TMP3]], align 4
16531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP6:%.*]] = fcmp olt float [[TMP4]], 0.000000e+00
16631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP7:%.*]] = fcmp olt float [[TMP5]], 0.000000e+00
16731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP8]] = or i1 [[VEC_PHI2]], [[TMP6]]
16831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP9]] = or i1 [[VEC_PHI3]], [[TMP7]]
16931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP10:%.*]] = xor i1 [[TMP6]], true
17031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP11:%.*]] = xor i1 [[TMP7]], true
17131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP12]] = or i1 [[VEC_PHI]], [[TMP10]]
17231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP13]] = or i1 [[VEC_PHI1]], [[TMP11]]
17331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
17431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
17531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
17631d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       middle.block:
17731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX:%.*]] = or i1 [[TMP13]], [[TMP12]]
17831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP15:%.*]] = freeze i1 [[BIN_RDX]]
17931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP15]], i1 false, i1 true
18031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX4:%.*]] = or i1 [[TMP9]], [[TMP8]]
18131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP16:%.*]] = freeze i1 [[BIN_RDX4]]
18231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT5:%.*]] = select i1 [[TMP16]], i1 true, i1 false
18331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
18431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
18531d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       scalar.ph:
18631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
18731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
18831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX6:%.*]] = phi i1 [ [[RDX_SELECT5]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
18931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
19031d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
19131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
19231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
19331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX6]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
19431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
19531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
19631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
19731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
19831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
19931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
20031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
20131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
20231d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
20331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT5]], [[MIDDLE_BLOCK]] ]
20431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
20531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP17:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
20631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP18:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP17]]
20731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP18]]
20831d4c975SDinar Temirbulatov;
20931d4c975SDinar Temirbulatoventry:
21031d4c975SDinar Temirbulatov  br label %for.body
21131d4c975SDinar Temirbulatov
21231d4c975SDinar Temirbulatovfor.body:
21331d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
21431d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
21531d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
21631d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
21731d4c975SDinar Temirbulatov  %load1 = load float, ptr %arrayidx, align 4
21831d4c975SDinar Temirbulatov  %cmp1 = fcmp olt float %load1, 0.000000e+00
21931d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
22031d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
22131d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
22231d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
22331d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
22431d4c975SDinar Temirbulatov
22531d4c975SDinar Temirbulatovexit:
22631d4c975SDinar Temirbulatov  %0 = select i1 %.any.0.off0, i32 2, i32 3
22731d4c975SDinar Temirbulatov  %1 = select i1 %all.0.off0., i32 1, i32 %0
22831d4c975SDinar Temirbulatov  ret i32 %1
22931d4c975SDinar Temirbulatov}
23031d4c975SDinar Temirbulatov
23131d4c975SDinar Temirbulatov;int multi_user_cmp_int(int* a, long long n) {
23231d4c975SDinar Temirbulatov;  _Bool any = 0;
23331d4c975SDinar Temirbulatov;  _Bool all = 1;
23431d4c975SDinar Temirbulatov;  for (long long i = 0; i < n; i++) {
23531d4c975SDinar Temirbulatov;    if (a[i] < 0) {
23631d4c975SDinar Temirbulatov;      any = 1;
23731d4c975SDinar Temirbulatov;    } else {
23831d4c975SDinar Temirbulatov;      all = 0;
23931d4c975SDinar Temirbulatov;    }
24031d4c975SDinar Temirbulatov;  }
24131d4c975SDinar Temirbulatov;  return all ? 1 : any ? 2 : 3;
24231d4c975SDinar Temirbulatov;}
24331d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_int(ptr readonly %a, i64 noundef %n) {
24431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_int(
24531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
24631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
24731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 4
24831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
24931d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.ph:
25031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 4
25131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
25231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[VECTOR_BODY:%.*]]
25331d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.body:
25431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
25531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ]
25631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI1:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP4:%.*]], [[VECTOR_BODY]] ]
25731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
25831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
25931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0
26031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP2]], align 4
26131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP3:%.*]] = icmp slt <4 x i32> [[WIDE_LOAD]], zeroinitializer
26231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP4]] = or <4 x i1> [[VEC_PHI1]], [[TMP3]]
26338fffa63SPaul Walker; CHECK-VF4-IC1-NEXT:    [[TMP5:%.*]] = xor <4 x i1> [[TMP3]], splat (i1 true)
26431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP6]] = or <4 x i1> [[VEC_PHI]], [[TMP5]]
26531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
26631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
26731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
26831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       middle.block:
26931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP8:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
27031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP9:%.*]] = freeze i1 [[TMP8]]
27131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP9]], i1 false, i1 true
27231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP10:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
27331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP11:%.*]] = freeze i1 [[TMP10]]
27431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT2:%.*]] = select i1 [[TMP11]], i1 true, i1 false
27531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
27631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
27731d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       scalar.ph:
27831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
27931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
28031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX3:%.*]] = phi i1 [ [[RDX_SELECT2]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
28131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
28231d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
28331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
28431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
28531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX3]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
28631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
28731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
28831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 0
28931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
29031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
29131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
29231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
29331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
29431d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
29531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT2]], [[MIDDLE_BLOCK]] ]
29631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
29731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP12:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
29831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP13:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP12]]
29931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP13]]
30031d4c975SDinar Temirbulatov;
30131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_int(
30231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
30331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
30431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 8
30531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
30631d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.ph:
30731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 8
30831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
30931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
31031d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.body:
31131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
31231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP12:%.*]], [[VECTOR_BODY]] ]
31331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI1:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[VECTOR_BODY]] ]
31431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP8:%.*]], [[VECTOR_BODY]] ]
31531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ]
31631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
31731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
31831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 0
31931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 4
32031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP4]], align 4
32131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr [[TMP5]], align 4
32231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP6:%.*]] = icmp slt <4 x i32> [[WIDE_LOAD]], zeroinitializer
32331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP7:%.*]] = icmp slt <4 x i32> [[WIDE_LOAD4]], zeroinitializer
32431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP8]] = or <4 x i1> [[VEC_PHI2]], [[TMP6]]
32531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP9]] = or <4 x i1> [[VEC_PHI3]], [[TMP7]]
32638fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP10:%.*]] = xor <4 x i1> [[TMP6]], splat (i1 true)
32738fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP11:%.*]] = xor <4 x i1> [[TMP7]], splat (i1 true)
32831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP12]] = or <4 x i1> [[VEC_PHI]], [[TMP10]]
32931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP13]] = or <4 x i1> [[VEC_PHI1]], [[TMP11]]
33031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
33131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
33231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
33331d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       middle.block:
33431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX:%.*]] = or <4 x i1> [[TMP13]], [[TMP12]]
33531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP15:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX]])
33631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP16:%.*]] = freeze i1 [[TMP15]]
33731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP16]], i1 false, i1 true
33831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX5:%.*]] = or <4 x i1> [[TMP9]], [[TMP8]]
33931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX5]])
34031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP18:%.*]] = freeze i1 [[TMP17]]
34131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT6:%.*]] = select i1 [[TMP18]], i1 true, i1 false
34231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
34331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
34431d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       scalar.ph:
34531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
34631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
34731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX7:%.*]] = phi i1 [ [[RDX_SELECT6]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
34831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
34931d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
35031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
35131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
35231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX7]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
35331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
35431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
35531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 0
35631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
35731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
35831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
35931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
36031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
36131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
36231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT6]], [[MIDDLE_BLOCK]] ]
36331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
36431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP19:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
36531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP20:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP19]]
36631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP20]]
36731d4c975SDinar Temirbulatov;
36831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_int(
36931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
37031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
37131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
37231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
37331d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.ph:
37431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
37531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
37631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
37731d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.body:
37831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
37931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP12:%.*]], [[VECTOR_BODY]] ]
38031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI1:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[VECTOR_BODY]] ]
38131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP8:%.*]], [[VECTOR_BODY]] ]
38231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ]
38331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
38431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1
38531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
38631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP1]]
38731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP4:%.*]] = load i32, ptr [[TMP2]], align 4
38831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP3]], align 4
38931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP6:%.*]] = icmp slt i32 [[TMP4]], 0
39031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP7:%.*]] = icmp slt i32 [[TMP5]], 0
39131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP8]] = or i1 [[VEC_PHI2]], [[TMP6]]
39231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP9]] = or i1 [[VEC_PHI3]], [[TMP7]]
39331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP10:%.*]] = xor i1 [[TMP6]], true
39431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP11:%.*]] = xor i1 [[TMP7]], true
39531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP12]] = or i1 [[VEC_PHI]], [[TMP10]]
39631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP13]] = or i1 [[VEC_PHI1]], [[TMP11]]
39731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
39831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
39931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
40031d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       middle.block:
40131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX:%.*]] = or i1 [[TMP13]], [[TMP12]]
40231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP15:%.*]] = freeze i1 [[BIN_RDX]]
40331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP15]], i1 false, i1 true
40431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX4:%.*]] = or i1 [[TMP9]], [[TMP8]]
40531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP16:%.*]] = freeze i1 [[BIN_RDX4]]
40631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT5:%.*]] = select i1 [[TMP16]], i1 true, i1 false
40731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
40831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
40931d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       scalar.ph:
41031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
41131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
41231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX6:%.*]] = phi i1 [ [[RDX_SELECT5]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
41331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
41431d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
41531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
41631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
41731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX6]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
41831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
41931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
42031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 0
42131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
42231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
42331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
42431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
42531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
42631d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
42731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT5]], [[MIDDLE_BLOCK]] ]
42831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
42931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP17:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
43031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP18:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP17]]
43131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP18]]
43231d4c975SDinar Temirbulatov;
43331d4c975SDinar Temirbulatoventry:
43431d4c975SDinar Temirbulatov  br label %for.body
43531d4c975SDinar Temirbulatov
43631d4c975SDinar Temirbulatovfor.body:
43731d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
43831d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
43931d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
44031d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
44131d4c975SDinar Temirbulatov  %load1 = load i32, ptr %arrayidx, align 4
44231d4c975SDinar Temirbulatov  %cmp1 = icmp slt i32 %load1, 0
44331d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
44431d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
44531d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
44631d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
44731d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
44831d4c975SDinar Temirbulatov
44931d4c975SDinar Temirbulatovexit:
45031d4c975SDinar Temirbulatov  %0 = select i1 %.any.0.off0, i32 2, i32 3
45131d4c975SDinar Temirbulatov  %1 = select i1 %all.0.off0., i32 1, i32 %0
45231d4c975SDinar Temirbulatov  ret i32 %1
45331d4c975SDinar Temirbulatov}
45431d4c975SDinar Temirbulatov
45531d4c975SDinar Temirbulatov; int multi_user_cmp_branch_use(float* a, int *b, long long n) {
45631d4c975SDinar Temirbulatov;   _Bool any = 0;
45731d4c975SDinar Temirbulatov;   _Bool all = 1;
45831d4c975SDinar Temirbulatov;   for (long long i = 0; i < n; i++) {
45931d4c975SDinar Temirbulatov;     _Bool c = a[i] < 0.0f;
46031d4c975SDinar Temirbulatov;     if (c) {
46131d4c975SDinar Temirbulatov;       any = 1;
46231d4c975SDinar Temirbulatov;     } else {
46331d4c975SDinar Temirbulatov;       all = 0;
46431d4c975SDinar Temirbulatov;     }
46531d4c975SDinar Temirbulatov;     if (c)
46631d4c975SDinar Temirbulatov;       b[i]++;
46731d4c975SDinar Temirbulatov;   }
46831d4c975SDinar Temirbulatov;  return all ? 1 : any ? 2 : 3;
46931d4c975SDinar Temirbulatov; }
47031d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_branch_use(ptr readonly %a, ptr %b, i64 noundef %n) {
47131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_branch_use(
47231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], ptr [[B:%.*]], i64 noundef [[N:%.*]]) {
47331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
47431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 4
47531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
47631d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.memcheck:
47731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = shl i64 [[N]], 2
47831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP0]]
47931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP0]]
48031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[B]], [[SCEVGEP1]]
48131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[A]], [[SCEVGEP]]
48231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
48331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
48431d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.ph:
48531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 4
48631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
48731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[VECTOR_BODY:%.*]]
48831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.body:
48931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE8:%.*]] ]
49031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP7:%.*]], [[PRED_STORE_CONTINUE8]] ]
49131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI2:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[PRED_STORE_CONTINUE8]] ]
49231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 0
49331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP1]]
49431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 0
49531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP3]], align 4, !alias.scope [[META6:![0-9]+]]
49631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP4:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD]], zeroinitializer
49731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP5]] = or <4 x i1> [[VEC_PHI2]], [[TMP4]]
49838fffa63SPaul Walker; CHECK-VF4-IC1-NEXT:    [[TMP6:%.*]] = xor <4 x i1> [[TMP4]], splat (i1 true)
49931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP7]] = or <4 x i1> [[VEC_PHI]], [[TMP6]]
50031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP8:%.*]] = extractelement <4 x i1> [[TMP4]], i32 0
50131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP8]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]
50231d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.if:
50331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP1]]
50431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 4, !alias.scope [[META9:![0-9]+]], !noalias [[META6]]
50531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP11:%.*]] = add nsw i32 [[TMP10]], 1
50631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    store i32 [[TMP11]], ptr [[TMP9]], align 4, !alias.scope [[META9]], !noalias [[META6]]
50731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[PRED_STORE_CONTINUE]]
50831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.continue:
50931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP13:%.*]] = extractelement <4 x i1> [[TMP4]], i32 1
51031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP13]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]]
51131d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.if3:
51231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP14:%.*]] = add i64 [[INDEX]], 1
51331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP14]]
51431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4, !alias.scope [[META9]], !noalias [[META6]]
51531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP17:%.*]] = add nsw i32 [[TMP16]], 1
51631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    store i32 [[TMP17]], ptr [[TMP15]], align 4, !alias.scope [[META9]], !noalias [[META6]]
51731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[PRED_STORE_CONTINUE4]]
51831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.continue4:
51931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP19:%.*]] = extractelement <4 x i1> [[TMP4]], i32 2
52031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP19]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6:%.*]]
52131d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.if5:
52231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP20:%.*]] = add i64 [[INDEX]], 2
52331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP21:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP20]]
52431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 4, !alias.scope [[META9]], !noalias [[META6]]
52531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP23:%.*]] = add nsw i32 [[TMP22]], 1
52631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    store i32 [[TMP23]], ptr [[TMP21]], align 4, !alias.scope [[META9]], !noalias [[META6]]
52731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[PRED_STORE_CONTINUE6]]
52831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.continue6:
52931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP25:%.*]] = extractelement <4 x i1> [[TMP4]], i32 3
53031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP25]], label [[PRED_STORE_IF7:%.*]], label [[PRED_STORE_CONTINUE8]]
53131d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.if7:
53231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP26:%.*]] = add i64 [[INDEX]], 3
53331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP27:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP26]]
53431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP28:%.*]] = load i32, ptr [[TMP27]], align 4, !alias.scope [[META9]], !noalias [[META6]]
53531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP29:%.*]] = add nsw i32 [[TMP28]], 1
53631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    store i32 [[TMP29]], ptr [[TMP27]], align 4, !alias.scope [[META9]], !noalias [[META6]]
53731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[PRED_STORE_CONTINUE8]]
53831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       pred.store.continue8:
53931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
54031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP31:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
54131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP31]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
54231d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       middle.block:
54331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP32:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP7]])
54431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP33:%.*]] = freeze i1 [[TMP32]]
54531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP33]], i1 false, i1 true
54631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP34:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP5]])
54731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP35:%.*]] = freeze i1 [[TMP34]]
54831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT9:%.*]] = select i1 [[TMP35]], i1 true, i1 false
54931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
55031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
55131d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       scalar.ph:
552*4ad0fdd1SFlorian Hahn; CHECK-VF4-IC1-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_MEMCHECK]] ], [ 0, [[ENTRY:%.*]] ]
553*4ad0fdd1SFlorian Hahn; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[VECTOR_MEMCHECK]] ], [ true, [[ENTRY]] ]
554*4ad0fdd1SFlorian Hahn; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX10:%.*]] = phi i1 [ [[RDX_SELECT9]], [[MIDDLE_BLOCK]] ], [ false, [[VECTOR_MEMCHECK]] ], [ false, [[ENTRY]] ]
55531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
55631d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
55731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END6:%.*]] ]
55831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[IF_END6]] ]
55931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX10]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[IF_END6]] ]
56031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
56131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
56231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
56331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
56431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
56531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[CMP1]], label [[IF_THEN3:%.*]], label [[IF_END6]]
56631d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       if.then3:
56731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDVARS_IV]]
56831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4
56931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INC:%.*]] = add nsw i32 [[LOAD2]], 1
57031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    store i32 [[INC]], ptr [[ARRAYIDX5]], align 4
57131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[IF_END6]]
57231d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       if.end6:
57331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
57431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
57531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
57631d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
57731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[IF_END6]] ], [ [[RDX_SELECT9]], [[MIDDLE_BLOCK]] ]
57831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[IF_END6]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
57931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP36:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
58031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP37:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP36]]
58131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP37]]
58231d4c975SDinar Temirbulatov;
58331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_branch_use(
58431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], ptr [[B:%.*]], i64 noundef [[N:%.*]]) {
58531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
58631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 8
58731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
58831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.memcheck:
58931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = shl i64 [[N]], 2
59031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP0]]
59131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP0]]
59231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[B]], [[SCEVGEP1]]
59331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[A]], [[SCEVGEP]]
59431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
59531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
59631d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.ph:
59731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 8
59831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
59931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
60031d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.body:
60131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE19:%.*]] ]
60231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[PRED_STORE_CONTINUE19]] ]
60331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP14:%.*]], [[PRED_STORE_CONTINUE19]] ]
60431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[PRED_STORE_CONTINUE19]] ]
60531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI4:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP10:%.*]], [[PRED_STORE_CONTINUE19]] ]
60631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 0
60731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP1]]
60831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, ptr [[TMP3]], i32 0
60931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP3]], i32 4
61031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP5]], align 4, !alias.scope [[META6:![0-9]+]]
61131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD5:%.*]] = load <4 x float>, ptr [[TMP6]], align 4, !alias.scope [[META6]]
61231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP7:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD]], zeroinitializer
61331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP8:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD5]], zeroinitializer
61431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP9]] = or <4 x i1> [[VEC_PHI3]], [[TMP7]]
61531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP10]] = or <4 x i1> [[VEC_PHI4]], [[TMP8]]
61638fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP11:%.*]] = xor <4 x i1> [[TMP7]], splat (i1 true)
61738fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP12:%.*]] = xor <4 x i1> [[TMP8]], splat (i1 true)
61831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP13]] = or <4 x i1> [[VEC_PHI]], [[TMP11]]
61931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP14]] = or <4 x i1> [[VEC_PHI2]], [[TMP12]]
62031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP15:%.*]] = extractelement <4 x i1> [[TMP7]], i32 0
62131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP15]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]
62231d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if:
62331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP1]]
62431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 4, !alias.scope [[META9:![0-9]+]], !noalias [[META6]]
62531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP18:%.*]] = add nsw i32 [[TMP17]], 1
62631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP18]], ptr [[TMP16]], align 4, !alias.scope [[META9]], !noalias [[META6]]
62731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE]]
62831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue:
62931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP20:%.*]] = extractelement <4 x i1> [[TMP7]], i32 1
63031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP20]], label [[PRED_STORE_IF6:%.*]], label [[PRED_STORE_CONTINUE7:%.*]]
63131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if6:
63231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP21:%.*]] = add i64 [[INDEX]], 1
63331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP22:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP21]]
63431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4, !alias.scope [[META9]], !noalias [[META6]]
63531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP24:%.*]] = add nsw i32 [[TMP23]], 1
63631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP24]], ptr [[TMP22]], align 4, !alias.scope [[META9]], !noalias [[META6]]
63731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE7]]
63831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue7:
63931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP26:%.*]] = extractelement <4 x i1> [[TMP7]], i32 2
64031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP26]], label [[PRED_STORE_IF8:%.*]], label [[PRED_STORE_CONTINUE9:%.*]]
64131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if8:
64231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP27:%.*]] = add i64 [[INDEX]], 2
64331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP28:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP27]]
64431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4, !alias.scope [[META9]], !noalias [[META6]]
64531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP30:%.*]] = add nsw i32 [[TMP29]], 1
64631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP30]], ptr [[TMP28]], align 4, !alias.scope [[META9]], !noalias [[META6]]
64731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE9]]
64831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue9:
64931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP32:%.*]] = extractelement <4 x i1> [[TMP7]], i32 3
65031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP32]], label [[PRED_STORE_IF10:%.*]], label [[PRED_STORE_CONTINUE11:%.*]]
65131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if10:
65231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP33:%.*]] = add i64 [[INDEX]], 3
65331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP34:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP33]]
65431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP35:%.*]] = load i32, ptr [[TMP34]], align 4, !alias.scope [[META9]], !noalias [[META6]]
65531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP36:%.*]] = add nsw i32 [[TMP35]], 1
65631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP36]], ptr [[TMP34]], align 4, !alias.scope [[META9]], !noalias [[META6]]
65731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE11]]
65831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue11:
65931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP38:%.*]] = extractelement <4 x i1> [[TMP8]], i32 0
66031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP38]], label [[PRED_STORE_IF12:%.*]], label [[PRED_STORE_CONTINUE13:%.*]]
66131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if12:
66253266f73SFlorian Hahn; CHECK-VF4-IC2-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 4
66331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP39:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP2]]
66431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP40:%.*]] = load i32, ptr [[TMP39]], align 4, !alias.scope [[META9]], !noalias [[META6]]
66531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP41:%.*]] = add nsw i32 [[TMP40]], 1
66631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP41]], ptr [[TMP39]], align 4, !alias.scope [[META9]], !noalias [[META6]]
66731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE13]]
66831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue13:
66931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP43:%.*]] = extractelement <4 x i1> [[TMP8]], i32 1
67031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP43]], label [[PRED_STORE_IF14:%.*]], label [[PRED_STORE_CONTINUE15:%.*]]
67131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if14:
67231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP44:%.*]] = add i64 [[INDEX]], 5
67331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP45:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP44]]
67431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP46:%.*]] = load i32, ptr [[TMP45]], align 4, !alias.scope [[META9]], !noalias [[META6]]
67531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP47:%.*]] = add nsw i32 [[TMP46]], 1
67631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP47]], ptr [[TMP45]], align 4, !alias.scope [[META9]], !noalias [[META6]]
67731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE15]]
67831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue15:
67931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP49:%.*]] = extractelement <4 x i1> [[TMP8]], i32 2
68031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP49]], label [[PRED_STORE_IF16:%.*]], label [[PRED_STORE_CONTINUE17:%.*]]
68131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if16:
68231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP50:%.*]] = add i64 [[INDEX]], 6
68331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP51:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP50]]
68431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP52:%.*]] = load i32, ptr [[TMP51]], align 4, !alias.scope [[META9]], !noalias [[META6]]
68531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP53:%.*]] = add nsw i32 [[TMP52]], 1
68631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP53]], ptr [[TMP51]], align 4, !alias.scope [[META9]], !noalias [[META6]]
68731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE17]]
68831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue17:
68931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP55:%.*]] = extractelement <4 x i1> [[TMP8]], i32 3
69031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP55]], label [[PRED_STORE_IF18:%.*]], label [[PRED_STORE_CONTINUE19]]
69131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.if18:
69231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP56:%.*]] = add i64 [[INDEX]], 7
69331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP57:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP56]]
69431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP58:%.*]] = load i32, ptr [[TMP57]], align 4, !alias.scope [[META9]], !noalias [[META6]]
69531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP59:%.*]] = add nsw i32 [[TMP58]], 1
69631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[TMP59]], ptr [[TMP57]], align 4, !alias.scope [[META9]], !noalias [[META6]]
69731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[PRED_STORE_CONTINUE19]]
69831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       pred.store.continue19:
69931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
70031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP61:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
70131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP61]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
70231d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       middle.block:
70331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX:%.*]] = or <4 x i1> [[TMP14]], [[TMP13]]
70431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP62:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX]])
70531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP63:%.*]] = freeze i1 [[TMP62]]
70631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP63]], i1 false, i1 true
70731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX20:%.*]] = or <4 x i1> [[TMP10]], [[TMP9]]
70831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP64:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX20]])
70931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP65:%.*]] = freeze i1 [[TMP64]]
71031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT21:%.*]] = select i1 [[TMP65]], i1 true, i1 false
71131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
71231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
71331d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       scalar.ph:
714*4ad0fdd1SFlorian Hahn; CHECK-VF4-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_MEMCHECK]] ], [ 0, [[ENTRY:%.*]] ]
715*4ad0fdd1SFlorian Hahn; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[VECTOR_MEMCHECK]] ], [ true, [[ENTRY]] ]
716*4ad0fdd1SFlorian Hahn; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX22:%.*]] = phi i1 [ [[RDX_SELECT21]], [[MIDDLE_BLOCK]] ], [ false, [[VECTOR_MEMCHECK]] ], [ false, [[ENTRY]] ]
71731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
71831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
71931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END6:%.*]] ]
72031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[IF_END6]] ]
72131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX22]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[IF_END6]] ]
72231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
72331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
72431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
72531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
72631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
72731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[CMP1]], label [[IF_THEN3:%.*]], label [[IF_END6]]
72831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       if.then3:
72931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDVARS_IV]]
73031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4
73131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INC:%.*]] = add nsw i32 [[LOAD2]], 1
73231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[INC]], ptr [[ARRAYIDX5]], align 4
73331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[IF_END6]]
73431d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       if.end6:
73531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
73631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
73731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
73831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
73931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[IF_END6]] ], [ [[RDX_SELECT21]], [[MIDDLE_BLOCK]] ]
74031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[IF_END6]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
74131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP66:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
74231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP67:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP66]]
74331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP67]]
74431d4c975SDinar Temirbulatov;
74531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_branch_use(
74631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], ptr [[B:%.*]], i64 noundef [[N:%.*]]) {
74731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
74831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
74931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
75031d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.memcheck:
75131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = shl i64 [[N]], 2
75231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP0]]
75331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP0]]
75431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[B]], [[SCEVGEP1]]
75531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[A]], [[SCEVGEP]]
75631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
75731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
75831d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.ph:
75931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
76031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
76131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
76231d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.body:
76331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]
76431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[PRED_STORE_CONTINUE6]] ]
76531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP14:%.*]], [[PRED_STORE_CONTINUE6]] ]
76631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[PRED_STORE_CONTINUE6]] ]
76731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI4:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP10:%.*]], [[PRED_STORE_CONTINUE6]] ]
76831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 0
76931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 1
77031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP1]]
77131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP2]]
77231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP5:%.*]] = load float, ptr [[TMP3]], align 4, !alias.scope [[META6:![0-9]+]]
77331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP6:%.*]] = load float, ptr [[TMP4]], align 4, !alias.scope [[META6]]
77431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP7:%.*]] = fcmp olt float [[TMP5]], 0.000000e+00
77531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP8:%.*]] = fcmp olt float [[TMP6]], 0.000000e+00
77631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP9]] = or i1 [[VEC_PHI3]], [[TMP7]]
77731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP10]] = or i1 [[VEC_PHI4]], [[TMP8]]
77831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP11:%.*]] = xor i1 [[TMP7]], true
77931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP12:%.*]] = xor i1 [[TMP8]], true
78031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP13]] = or i1 [[VEC_PHI]], [[TMP11]]
78131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP14]] = or i1 [[VEC_PHI2]], [[TMP12]]
78231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[TMP7]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]
78331d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       pred.store.if:
78431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP1]]
78531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4, !alias.scope [[META9:![0-9]+]], !noalias [[META6]]
78631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP17:%.*]] = add nsw i32 [[TMP16]], 1
78731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    store i32 [[TMP17]], ptr [[TMP15]], align 4, !alias.scope [[META9]], !noalias [[META6]]
78831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[PRED_STORE_CONTINUE]]
78931d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       pred.store.continue:
79031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[TMP8]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]]
79131d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       pred.store.if5:
79231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP19:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP2]]
79331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4, !alias.scope [[META9]], !noalias [[META6]]
79431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP21:%.*]] = add nsw i32 [[TMP20]], 1
79531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    store i32 [[TMP21]], ptr [[TMP19]], align 4, !alias.scope [[META9]], !noalias [[META6]]
79631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[PRED_STORE_CONTINUE6]]
79731d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       pred.store.continue6:
79831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
79931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP23:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
80031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[TMP23]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
80131d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       middle.block:
80231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX:%.*]] = or i1 [[TMP14]], [[TMP13]]
80331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP24:%.*]] = freeze i1 [[BIN_RDX]]
80431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP24]], i1 false, i1 true
80531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX7:%.*]] = or i1 [[TMP10]], [[TMP9]]
80631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP25:%.*]] = freeze i1 [[BIN_RDX7]]
80731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT8:%.*]] = select i1 [[TMP25]], i1 true, i1 false
80831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
80931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
81031d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       scalar.ph:
811*4ad0fdd1SFlorian Hahn; CHECK-VF1-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_MEMCHECK]] ], [ 0, [[ENTRY:%.*]] ]
812*4ad0fdd1SFlorian Hahn; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[VECTOR_MEMCHECK]] ], [ true, [[ENTRY]] ]
813*4ad0fdd1SFlorian Hahn; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX9:%.*]] = phi i1 [ [[RDX_SELECT8]], [[MIDDLE_BLOCK]] ], [ false, [[VECTOR_MEMCHECK]] ], [ false, [[ENTRY]] ]
81431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
81531d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
81631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END6:%.*]] ]
81731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[IF_END6]] ]
81831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX9]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[IF_END6]] ]
81931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
82031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
82131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
82231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
82331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
82431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[CMP1]], label [[IF_THEN3:%.*]], label [[IF_END6]]
82531d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       if.then3:
82631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[INDVARS_IV]]
82731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4
82831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INC:%.*]] = add nsw i32 [[LOAD2]], 1
82931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    store i32 [[INC]], ptr [[ARRAYIDX5]], align 4
83031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[IF_END6]]
83131d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       if.end6:
83231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
83331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
83431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
83531d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
83631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[IF_END6]] ], [ [[RDX_SELECT8]], [[MIDDLE_BLOCK]] ]
83731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[IF_END6]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
83831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP26:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
83931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP27:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP26]]
84031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP27]]
84131d4c975SDinar Temirbulatov;
84231d4c975SDinar Temirbulatoventry:
84331d4c975SDinar Temirbulatov  br label %for.body
84431d4c975SDinar Temirbulatov
84531d4c975SDinar Temirbulatovfor.body:
84631d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %if.end6 ]
84731d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %if.end6 ]
84831d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %if.end6 ]
84931d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
85031d4c975SDinar Temirbulatov  %load1 = load float, ptr %arrayidx, align 4
85131d4c975SDinar Temirbulatov  %cmp1 = fcmp olt float %load1, 0.000000e+00
85231d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
85331d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
85431d4c975SDinar Temirbulatov  br i1 %cmp1, label %if.then3, label %if.end6
85531d4c975SDinar Temirbulatov
85631d4c975SDinar Temirbulatovif.then3:
85731d4c975SDinar Temirbulatov  %arrayidx5 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
85831d4c975SDinar Temirbulatov  %load2 = load i32, ptr %arrayidx5, align 4
85931d4c975SDinar Temirbulatov  %inc = add nsw i32 %load2, 1
86031d4c975SDinar Temirbulatov  store i32 %inc, ptr %arrayidx5, align 4
86131d4c975SDinar Temirbulatov  br label %if.end6
86231d4c975SDinar Temirbulatov
86331d4c975SDinar Temirbulatovif.end6:
86431d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
86531d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
86631d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
86731d4c975SDinar Temirbulatov
86831d4c975SDinar Temirbulatovexit:
86931d4c975SDinar Temirbulatov  %0 = select i1 %.any.0.off0, i32 2, i32 3
87031d4c975SDinar Temirbulatov  %1 = select i1 %all.0.off0., i32 1, i32 %0
87131d4c975SDinar Temirbulatov  ret i32 %1
87231d4c975SDinar Temirbulatov}
87331d4c975SDinar Temirbulatov
87431d4c975SDinar Temirbulatov; int multi_user_cmp_branch_use_and_outside_bb_use(float* a, long long n) {
87531d4c975SDinar Temirbulatov;   _Bool any = 0;
87631d4c975SDinar Temirbulatov;   _Bool all = 1;
87731d4c975SDinar Temirbulatov;   _Bool c;
87831d4c975SDinar Temirbulatov;   for (long long i = 0; i < n; i++) {
87931d4c975SDinar Temirbulatov;     c = a[i] < 0.0f;
88031d4c975SDinar Temirbulatov;     if (c) {
88131d4c975SDinar Temirbulatov;       any = 1;
88231d4c975SDinar Temirbulatov;     } else {
88331d4c975SDinar Temirbulatov;       all = 0;
88431d4c975SDinar Temirbulatov;     }
88531d4c975SDinar Temirbulatov;   }
88631d4c975SDinar Temirbulatov;   return all ? c : any ? 2 : 3;
88731d4c975SDinar Temirbulatov; }
88831d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_branch_use_and_outside_bb_use(ptr readonly %a, i64 noundef %n) {
88931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_branch_use_and_outside_bb_use(
89031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
89131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
89231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 4
89331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
89431d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.ph:
89531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 4
89631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
89731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[VECTOR_BODY:%.*]]
89831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       vector.body:
89931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
90031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ]
90131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[VEC_PHI1:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP4:%.*]], [[VECTOR_BODY]] ]
90231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
90331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
90431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 0
90531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP2]], align 4
90631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP3:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD]], zeroinitializer
90731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP4]] = or <4 x i1> [[VEC_PHI1]], [[TMP3]]
90838fffa63SPaul Walker; CHECK-VF4-IC1-NEXT:    [[TMP5:%.*]] = xor <4 x i1> [[TMP3]], splat (i1 true)
90931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP6]] = or <4 x i1> [[VEC_PHI]], [[TMP5]]
91031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
91131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
91231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
91331d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       middle.block:
91431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP9:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
91531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP10:%.*]] = freeze i1 [[TMP9]]
91631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP10]], i1 false, i1 true
91731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP11:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP4]])
91831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP12:%.*]] = freeze i1 [[TMP11]]
91931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[RDX_SELECT2:%.*]] = select i1 [[TMP12]], i1 true, i1 false
92099741ac2SFlorian Hahn; CHECK-VF4-IC1-NEXT:    [[TMP8:%.*]] = extractelement <4 x i1> [[TMP3]], i32 3
92131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
92231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
92331d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       scalar.ph:
92431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
92531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
92631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[BC_MERGE_RDX3:%.*]] = phi i1 [ [[RDX_SELECT2]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
92731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
92831d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
92931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
93031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
93131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX3]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
93231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
93331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
93431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
93531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
93631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
93731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
93831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
93931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
94031d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
94131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1_LCSSA:%.*]] = phi i1 [ [[CMP1]], [[FOR_BODY]] ], [ [[TMP8]], [[MIDDLE_BLOCK]] ]
94231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT2]], [[MIDDLE_BLOCK]] ]
94331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
94431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP13:%.*]] = zext i1 [[CMP1_LCSSA]] to i32
94531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP14:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
94631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP15:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 [[TMP13]], i32 [[TMP14]]
94731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP15]]
94831d4c975SDinar Temirbulatov;
94931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_branch_use_and_outside_bb_use(
95031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
95131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
95231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 8
95331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
95431d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.ph:
95531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 8
95631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
95731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
95831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       vector.body:
95931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
96031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP12:%.*]], [[VECTOR_BODY]] ]
96131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI1:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[VECTOR_BODY]] ]
96231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP8:%.*]], [[VECTOR_BODY]] ]
96331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi <4 x i1> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ]
96431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
96531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
96631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 0
96731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 4
96831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[TMP4]], align 4
96931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[WIDE_LOAD4:%.*]] = load <4 x float>, ptr [[TMP5]], align 4
97031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP6:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD]], zeroinitializer
97131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP7:%.*]] = fcmp olt <4 x float> [[WIDE_LOAD4]], zeroinitializer
97231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP8]] = or <4 x i1> [[VEC_PHI2]], [[TMP6]]
97331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP9]] = or <4 x i1> [[VEC_PHI3]], [[TMP7]]
97438fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP10:%.*]] = xor <4 x i1> [[TMP6]], splat (i1 true)
97538fffa63SPaul Walker; CHECK-VF4-IC2-NEXT:    [[TMP11:%.*]] = xor <4 x i1> [[TMP7]], splat (i1 true)
97631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP12]] = or <4 x i1> [[VEC_PHI]], [[TMP10]]
97731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP13]] = or <4 x i1> [[VEC_PHI1]], [[TMP11]]
97831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
97931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
98031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
98131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       middle.block:
98231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX:%.*]] = or <4 x i1> [[TMP13]], [[TMP12]]
98331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP16:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX]])
98431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP17:%.*]] = freeze i1 [[TMP16]]
98531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP17]], i1 false, i1 true
98631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BIN_RDX5:%.*]] = or <4 x i1> [[TMP9]], [[TMP8]]
98731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP18:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[BIN_RDX5]])
98831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP19:%.*]] = freeze i1 [[TMP18]]
98931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[RDX_SELECT6:%.*]] = select i1 [[TMP19]], i1 true, i1 false
99099741ac2SFlorian Hahn; CHECK-VF4-IC2-NEXT:    [[TMP15:%.*]] = extractelement <4 x i1> [[TMP7]], i32 3
99131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
99231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
99331d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       scalar.ph:
99431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
99531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
99631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[BC_MERGE_RDX7:%.*]] = phi i1 [ [[RDX_SELECT6]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
99731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
99831d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
99931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
100031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
100131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX7]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
100231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
100331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
100431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
100531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
100631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
100731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
100831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
100931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
101031d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
101131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1_LCSSA:%.*]] = phi i1 [ [[CMP1]], [[FOR_BODY]] ], [ [[TMP15]], [[MIDDLE_BLOCK]] ]
101231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT6]], [[MIDDLE_BLOCK]] ]
101331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
101431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP20:%.*]] = zext i1 [[CMP1_LCSSA]] to i32
101531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP21:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
101631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP22:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 [[TMP20]], i32 [[TMP21]]
101731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP22]]
101831d4c975SDinar Temirbulatov;
101931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_branch_use_and_outside_bb_use(
102031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
102131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
102231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
102331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
102431d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.ph:
102531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
102631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
102731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[VECTOR_BODY:%.*]]
102831d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       vector.body:
102931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
103031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP12:%.*]], [[VECTOR_BODY]] ]
103131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI1:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP13:%.*]], [[VECTOR_BODY]] ]
103231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI2:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP8:%.*]], [[VECTOR_BODY]] ]
103331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[VEC_PHI3:%.*]] = phi i1 [ false, [[VECTOR_PH]] ], [ [[TMP9:%.*]], [[VECTOR_BODY]] ]
103431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
103531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1
103631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
103731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP1]]
103831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP4:%.*]] = load float, ptr [[TMP2]], align 4
103931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP5:%.*]] = load float, ptr [[TMP3]], align 4
104031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP6:%.*]] = fcmp olt float [[TMP4]], 0.000000e+00
104131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP7:%.*]] = fcmp olt float [[TMP5]], 0.000000e+00
104231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP8]] = or i1 [[VEC_PHI2]], [[TMP6]]
104331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP9]] = or i1 [[VEC_PHI3]], [[TMP7]]
104431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP10:%.*]] = xor i1 [[TMP6]], true
104531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP11:%.*]] = xor i1 [[TMP7]], true
104631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP12]] = or i1 [[VEC_PHI]], [[TMP10]]
104731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP13]] = or i1 [[VEC_PHI1]], [[TMP11]]
104831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
104931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
105031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
105131d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       middle.block:
105231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX:%.*]] = or i1 [[TMP13]], [[TMP12]]
105331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP15:%.*]] = freeze i1 [[BIN_RDX]]
105431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT:%.*]] = select i1 [[TMP15]], i1 false, i1 true
105531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BIN_RDX4:%.*]] = or i1 [[TMP9]], [[TMP8]]
105631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP16:%.*]] = freeze i1 [[BIN_RDX4]]
105731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[RDX_SELECT5:%.*]] = select i1 [[TMP16]], i1 true, i1 false
105831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
105931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
106031d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       scalar.ph:
106131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
106231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX:%.*]] = phi i1 [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ], [ true, [[ENTRY]] ]
106331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[BC_MERGE_RDX6:%.*]] = phi i1 [ [[RDX_SELECT5]], [[MIDDLE_BLOCK]] ], [ false, [[ENTRY]] ]
106431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
106531d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
106631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
106731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
106831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ [[BC_MERGE_RDX6]], [[SCALAR_PH]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
106931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
107031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
107131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
107231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
107331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
107431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
107531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
107631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
107731d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
107831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1_LCSSA:%.*]] = phi i1 [ [[CMP1]], [[FOR_BODY]] ], [ [[TMP7]], [[MIDDLE_BLOCK]] ]
107931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ], [ [[RDX_SELECT5]], [[MIDDLE_BLOCK]] ]
108031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ], [ [[RDX_SELECT]], [[MIDDLE_BLOCK]] ]
108131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP17:%.*]] = zext i1 [[CMP1_LCSSA]] to i32
108231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP18:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
108331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP19:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 [[TMP17]], i32 [[TMP18]]
108431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP19]]
108531d4c975SDinar Temirbulatov;
108631d4c975SDinar Temirbulatoventry:
108731d4c975SDinar Temirbulatov  br label %for.body
108831d4c975SDinar Temirbulatov
108931d4c975SDinar Temirbulatovfor.body:
109031d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
109131d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
109231d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
109331d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
109431d4c975SDinar Temirbulatov  %load1 = load float, ptr %arrayidx, align 4
109531d4c975SDinar Temirbulatov  %cmp1 = fcmp olt float %load1, 0.000000e+00
109631d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
109731d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
109831d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
109931d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
110031d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
110131d4c975SDinar Temirbulatov
110231d4c975SDinar Temirbulatovexit:
110331d4c975SDinar Temirbulatov  %0 = zext i1 %cmp1 to i32
110431d4c975SDinar Temirbulatov  %1 = select i1 %.any.0.off0, i32 2, i32 3
110531d4c975SDinar Temirbulatov  %2 = select i1 %all.0.off0., i32 %0, i32 %1
110631d4c975SDinar Temirbulatov  ret i32 %2
110731d4c975SDinar Temirbulatov}
110831d4c975SDinar Temirbulatov
110931d4c975SDinar Temirbulatov; Currently, this test-case is not supported.
111031d4c975SDinar Temirbulatov; int multi_user_cmp_fmax(float* a, long long n) {
111131d4c975SDinar Temirbulatov;   _Bool any = 0;
111231d4c975SDinar Temirbulatov;   _Bool all = 1;
111331d4c975SDinar Temirbulatov;   float max = -INFINITY;
111431d4c975SDinar Temirbulatov;   for (long long i = 0; i < n; i++) {
111531d4c975SDinar Temirbulatov;     _Bool c = a[i] > max;
111631d4c975SDinar Temirbulatov;     if (c) {
111731d4c975SDinar Temirbulatov;       max = a[i];
111831d4c975SDinar Temirbulatov;       any = 1;
111931d4c975SDinar Temirbulatov;     } else {
112031d4c975SDinar Temirbulatov;       all = 0;
112131d4c975SDinar Temirbulatov;     }
112231d4c975SDinar Temirbulatov;   }
112331d4c975SDinar Temirbulatov;  return all ? 1 : any ? 2 : 3;
112431d4c975SDinar Temirbulatov; }
112531d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_fmax(ptr readonly %a, i64 noundef %n) {
112631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_fmax(
112731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
112831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
112931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
113031d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
113131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
113231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
113331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
113431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[MAX_015:%.*]] = phi float [ 0xFFF0000000000000, [[ENTRY]] ], [ [[DOTMAX_0:%.*]], [[FOR_BODY]] ]
113531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
113631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
113731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = fcmp ogt float [[LOAD1]], [[MAX_015]]
113831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
113931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
114031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTMAX_0]] = select i1 [[CMP1]], float [[LOAD1]], float [[MAX_015]]
114131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
114231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
114331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
114431d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
114531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
114631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
114731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
114831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
114931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP1]]
115031d4c975SDinar Temirbulatov;
115131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_fmax(
115231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
115331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
115431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
115531d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
115631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
115731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
115831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
115931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[MAX_015:%.*]] = phi float [ 0xFFF0000000000000, [[ENTRY]] ], [ [[DOTMAX_0:%.*]], [[FOR_BODY]] ]
116031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
116131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
116231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = fcmp ogt float [[LOAD1]], [[MAX_015]]
116331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
116431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
116531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTMAX_0]] = select i1 [[CMP1]], float [[LOAD1]], float [[MAX_015]]
116631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
116731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
116831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
116931d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
117031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
117131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
117231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
117331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
117431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP1]]
117531d4c975SDinar Temirbulatov;
117631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_fmax(
117731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
117831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
117931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
118031d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
118131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
118231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
118331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
118431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[MAX_015:%.*]] = phi float [ 0xFFF0000000000000, [[ENTRY]] ], [ [[DOTMAX_0:%.*]], [[FOR_BODY]] ]
118531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
118631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
118731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = fcmp ogt float [[LOAD1]], [[MAX_015]]
118831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
118931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
119031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTMAX_0]] = select i1 [[CMP1]], float [[LOAD1]], float [[MAX_015]]
119131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
119231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
119331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
119431d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
119531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
119631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
119731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
119831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
119931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP1]]
120031d4c975SDinar Temirbulatov;
120131d4c975SDinar Temirbulatoventry:
120231d4c975SDinar Temirbulatov  br label %for.body
120331d4c975SDinar Temirbulatov
120431d4c975SDinar Temirbulatovfor.body:
120531d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
120631d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
120731d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
120831d4c975SDinar Temirbulatov  %max.015 = phi float [ 0xFFF0000000000000, %entry ], [ %.max.0, %for.body ]
120931d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
121031d4c975SDinar Temirbulatov  %load1 = load float, ptr %arrayidx, align 4
121131d4c975SDinar Temirbulatov  %cmp1 = fcmp ogt float %load1, %max.015
121231d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
121331d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
121431d4c975SDinar Temirbulatov  %.max.0 = select i1 %cmp1, float %load1, float %max.015
121531d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
121631d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
121731d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
121831d4c975SDinar Temirbulatov
121931d4c975SDinar Temirbulatovexit:
122031d4c975SDinar Temirbulatov  %0 = select i1 %.any.0.off0, i32 2, i32 3
122131d4c975SDinar Temirbulatov  %1 = select i1 %all.0.off0., i32 1, i32 %0
122231d4c975SDinar Temirbulatov  ret i32 %1
122331d4c975SDinar Temirbulatov}
122431d4c975SDinar Temirbulatov
122531d4c975SDinar Temirbulatov; Currently, this test-case is not supported.
122631d4c975SDinar Temirbulatov; int multi_user_cmp_max(int* a, long long n) {
122731d4c975SDinar Temirbulatov;   _Bool any = 0;
122831d4c975SDinar Temirbulatov;   _Bool all = 1;
122931d4c975SDinar Temirbulatov;   int max = 0;
123031d4c975SDinar Temirbulatov;   for (long long i = 0; i < n; i++) {
123131d4c975SDinar Temirbulatov;     _Bool c = a[i] > max;
123231d4c975SDinar Temirbulatov;     if (c) {
123331d4c975SDinar Temirbulatov;       max = a[i];
123431d4c975SDinar Temirbulatov;       any = 1;
123531d4c975SDinar Temirbulatov;     } else {
123631d4c975SDinar Temirbulatov;       all = 0;
123731d4c975SDinar Temirbulatov;     }
123831d4c975SDinar Temirbulatov;   }
123931d4c975SDinar Temirbulatov;  return all ? 1 : any ? 2 : 3;
124031d4c975SDinar Temirbulatov; }
124131d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_max(ptr readonly %a, i64 noundef %n) {
124231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_max(
124331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
124431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
124531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
124631d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
124731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
124831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
124931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
125031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[MAX_015:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[DOTMAX_0:%.*]], [[FOR_BODY]] ]
125131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
125231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
125331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[LOAD1]], [[MAX_015]]
125431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
125531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
125631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTMAX_0]] = tail call i32 @llvm.smax.i32(i32 [[LOAD1]], i32 [[MAX_015]])
125731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
125831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
125931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
126031d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
126131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
126231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
126331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
126431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
126531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP1]]
126631d4c975SDinar Temirbulatov;
126731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_max(
126831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
126931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
127031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
127131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
127231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
127331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
127431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
127531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[MAX_015:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[DOTMAX_0:%.*]], [[FOR_BODY]] ]
127631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
127731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
127831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[LOAD1]], [[MAX_015]]
127931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
128031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
128131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTMAX_0]] = tail call i32 @llvm.smax.i32(i32 [[LOAD1]], i32 [[MAX_015]])
128231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
128331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
128431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
128531d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
128631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
128731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
128831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
128931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
129031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP1]]
129131d4c975SDinar Temirbulatov;
129231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_max(
129331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
129431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
129531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
129631d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
129731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
129831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
129931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
130031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[MAX_015:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[DOTMAX_0:%.*]], [[FOR_BODY]] ]
130131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
130231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
130331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[LOAD1]], [[MAX_015]]
130431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
130531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
130631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTMAX_0]] = tail call i32 @llvm.smax.i32(i32 [[LOAD1]], i32 [[MAX_015]])
130731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
130831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
130931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
131031d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
131131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
131231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
131331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
131431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
131531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP1]]
131631d4c975SDinar Temirbulatov;
131731d4c975SDinar Temirbulatoventry:
131831d4c975SDinar Temirbulatov  br label %for.body
131931d4c975SDinar Temirbulatov
132031d4c975SDinar Temirbulatovfor.body:                                         ; preds = %for.body, %entry
132131d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
132231d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
132331d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
132431d4c975SDinar Temirbulatov  %max.015 = phi i32 [ 0, %entry ], [ %.max.0, %for.body ]
132531d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
132631d4c975SDinar Temirbulatov  %load1 = load i32, ptr %arrayidx, align 4
132731d4c975SDinar Temirbulatov  %cmp1 = icmp sgt i32 %load1, %max.015
132831d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
132931d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
133031d4c975SDinar Temirbulatov  %.max.0 = tail call i32 @llvm.smax.i32(i32 %load1, i32 %max.015)
133131d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
133231d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
133331d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
133431d4c975SDinar Temirbulatov
133531d4c975SDinar Temirbulatovexit:                                             ; preds = %for.body
133631d4c975SDinar Temirbulatov  %.any.0.off0.lcssa = phi i1 [ %.any.0.off0, %for.body ]
133731d4c975SDinar Temirbulatov  %all.0.off0..lcssa = phi i1 [ %all.0.off0., %for.body ]
133831d4c975SDinar Temirbulatov  %0 = select i1 %.any.0.off0.lcssa, i32 2, i32 3
133931d4c975SDinar Temirbulatov  %1 = select i1 %all.0.off0..lcssa, i32 1, i32 %0
134031d4c975SDinar Temirbulatov  ret i32 %1
134131d4c975SDinar Temirbulatov}
134231d4c975SDinar Temirbulatov
134331d4c975SDinar Temirbulatovdeclare i32 @llvm.smax.i32(i32, i32)
134431d4c975SDinar Temirbulatov
134531d4c975SDinar Temirbulatov; Currently, this test-case is not supported.
134631d4c975SDinar Temirbulatov; int multi_user_cmp_use_store_offset(float* a, int *b, long long n) {
134731d4c975SDinar Temirbulatov;   _Bool any = 0;
134831d4c975SDinar Temirbulatov;   _Bool all = 1;
134931d4c975SDinar Temirbulatov;   for (long long i = 0; i < n; i++) {
135031d4c975SDinar Temirbulatov;     _Bool c = a[i] < 0.0f;
135131d4c975SDinar Temirbulatov;     if (c) {
135231d4c975SDinar Temirbulatov;       any = 1;
135331d4c975SDinar Temirbulatov;     } else {
135431d4c975SDinar Temirbulatov;       all = 0;
135531d4c975SDinar Temirbulatov;     }
135631d4c975SDinar Temirbulatov;    b[i+c] = any;
135731d4c975SDinar Temirbulatov;   }
135831d4c975SDinar Temirbulatov;   return all ? 1 : any ? 2 : 3;
135931d4c975SDinar Temirbulatov; }
136031d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_use_store_offset(ptr readonly %a, ptr writeonly %b, i64 noundef %n) {
136131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_use_store_offset(
136231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], ptr writeonly [[B:%.*]], i64 noundef [[N:%.*]]) {
136331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
136431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
136531d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
136631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
136731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
136831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
136931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
137031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
137131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
137231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
137331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
137431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
137531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CONV4:%.*]] = zext i1 [[CMP1]] to i32
137631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[N32:%.*]] = trunc i64 [[N]] to i32
137731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ADD:%.*]] = add nuw nsw i32 [[CONV4]], [[N32]]
137831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[IDXPROM5:%.*]] = zext nneg i32 [[ADD]] to i64
137931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[IDXPROM5]]
138031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    store i32 [[CONV4]], ptr [[ARRAYIDX6]], align 4
138131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
138231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
138331d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
138431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
138531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
138631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
138731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
138831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP1]]
138931d4c975SDinar Temirbulatov;
139031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_use_store_offset(
139131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], ptr writeonly [[B:%.*]], i64 noundef [[N:%.*]]) {
139231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
139331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
139431d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
139531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
139631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
139731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
139831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
139931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
140031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
140131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
140231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
140331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
140431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CONV4:%.*]] = zext i1 [[CMP1]] to i32
140531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[N32:%.*]] = trunc i64 [[N]] to i32
140631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ADD:%.*]] = add nuw nsw i32 [[CONV4]], [[N32]]
140731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[IDXPROM5:%.*]] = zext nneg i32 [[ADD]] to i64
140831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[IDXPROM5]]
140931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    store i32 [[CONV4]], ptr [[ARRAYIDX6]], align 4
141031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
141131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
141231d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
141331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
141431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
141531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
141631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
141731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP1]]
141831d4c975SDinar Temirbulatov;
141931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_use_store_offset(
142031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], ptr writeonly [[B:%.*]], i64 noundef [[N:%.*]]) {
142131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
142231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
142331d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
142431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
142531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
142631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
142731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
142831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
142931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
143031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
143131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
143231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
143331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CONV4:%.*]] = zext i1 [[CMP1]] to i32
143431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[N32:%.*]] = trunc i64 [[N]] to i32
143531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ADD:%.*]] = add nuw nsw i32 [[CONV4]], [[N32]]
143631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[IDXPROM5:%.*]] = zext nneg i32 [[ADD]] to i64
143731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[IDXPROM5]]
143831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    store i32 [[CONV4]], ptr [[ARRAYIDX6]], align 4
143931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
144031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
144131d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
144231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
144331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
144431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
144531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP0]]
144631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP1]]
144731d4c975SDinar Temirbulatov;
144831d4c975SDinar Temirbulatoventry:
144931d4c975SDinar Temirbulatov  br label %for.body
145031d4c975SDinar Temirbulatov
145131d4c975SDinar Temirbulatovfor.body:
145231d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
145331d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
145431d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
145531d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
145631d4c975SDinar Temirbulatov  %load1 = load float, ptr %arrayidx, align 4
145731d4c975SDinar Temirbulatov  %cmp1 = fcmp olt float %load1, 0.000000e+00
145831d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
145931d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
146031d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
146131d4c975SDinar Temirbulatov  %conv4 = zext i1 %cmp1 to i32
146231d4c975SDinar Temirbulatov  %n32 = trunc i64 %n to i32
146331d4c975SDinar Temirbulatov  %add = add nuw nsw i32 %conv4, %n32
146431d4c975SDinar Temirbulatov  %idxprom5 = zext nneg i32 %add to i64
146531d4c975SDinar Temirbulatov  %arrayidx6 = getelementptr inbounds i32, ptr %b, i64 %idxprom5
146631d4c975SDinar Temirbulatov  store i32 %conv4, ptr %arrayidx6, align 4
146731d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
146831d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
146931d4c975SDinar Temirbulatov
147031d4c975SDinar Temirbulatovexit:
147131d4c975SDinar Temirbulatov  %0 = select i1 %.any.0.off0, i32 2, i32 3
147231d4c975SDinar Temirbulatov  %1 = select i1 %all.0.off0., i32 1, i32 %0
147331d4c975SDinar Temirbulatov  ret i32 %1
147431d4c975SDinar Temirbulatov}
147531d4c975SDinar Temirbulatov
147631d4c975SDinar Temirbulatov; Not vectorising, compare instruction user %0 inside the loop
147731d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_no_vectorise(ptr readonly %a, i64 noundef %n) {
147831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_no_vectorise(
147931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
148031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
148131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
148231d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
148331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
148431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
148531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
148631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
148731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
148831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
148931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
149031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
149131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = sext i1 [[CMP1]] to i64
149231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], [[INDVARS_IV]]
149331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[TMP1]], 1
149431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
149531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
149631d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
149731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
149831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
149931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP2:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
150031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP3:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP2]]
150131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP3]]
150231d4c975SDinar Temirbulatov;
150331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_no_vectorise(
150431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
150531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
150631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
150731d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
150831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
150931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
151031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
151131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
151231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
151331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
151431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
151531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
151631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = sext i1 [[CMP1]] to i64
151731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], [[INDVARS_IV]]
151831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[TMP1]], 1
151931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
152031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
152131d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
152231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
152331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
152431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP2:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
152531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP3:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP2]]
152631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP3]]
152731d4c975SDinar Temirbulatov;
152831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_no_vectorise(
152931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
153031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
153131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
153231d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
153331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
153431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
153531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
153631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
153731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
153831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
153931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
154031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
154131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = sext i1 [[CMP1]] to i64
154231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], [[INDVARS_IV]]
154331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[TMP1]], 1
154431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
154531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
154631d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
154731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
154831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
154931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP2:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
155031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP3:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP2]]
155131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP3]]
155231d4c975SDinar Temirbulatov;
155331d4c975SDinar Temirbulatoventry:
155431d4c975SDinar Temirbulatov  br label %for.body
155531d4c975SDinar Temirbulatov
155631d4c975SDinar Temirbulatovfor.body:
155731d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
155831d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
155931d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
156031d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
156131d4c975SDinar Temirbulatov  %load1 = load float, ptr %arrayidx, align 4
156231d4c975SDinar Temirbulatov  %cmp1 = fcmp olt float %load1, 0.000000e+00
156331d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
156431d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
156531d4c975SDinar Temirbulatov  %0 = sext i1 %cmp1 to i64
156631d4c975SDinar Temirbulatov  %1 = add i64 %0, %indvars.iv
156731d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %1, 1
156831d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
156931d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
157031d4c975SDinar Temirbulatov
157131d4c975SDinar Temirbulatovexit:
157231d4c975SDinar Temirbulatov  %2 = select i1 %.any.0.off0, i32 2, i32 3
157331d4c975SDinar Temirbulatov  %3 = select i1 %all.0.off0., i32 1, i32 %2
157431d4c975SDinar Temirbulatov  ret i32 %3
157531d4c975SDinar Temirbulatov}
157631d4c975SDinar Temirbulatov
157731d4c975SDinar Temirbulatov; Not vectorising, non recurrent select instrction %0 inside the loop
157831d4c975SDinar Temirbulatovdefine i32 @multi_user_cmp_extra_select(ptr readonly %a, i64 noundef %n) {
157931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-LABEL: define i32 @multi_user_cmp_extra_select(
158031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
158131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:  entry:
158231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br label [[FOR_BODY:%.*]]
158331d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       for.body:
158431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
158531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
158631d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
158731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
158831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
158931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
159031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
159131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
159231d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP0:%.*]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
159331d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
159431d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
159531d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
159631d4c975SDinar Temirbulatov; CHECK-VF4-IC1:       exit:
159731d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
159831d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
159931d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP1:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
160031d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    [[TMP2:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP1]]
160131d4c975SDinar Temirbulatov; CHECK-VF4-IC1-NEXT:    ret i32 [[TMP2]]
160231d4c975SDinar Temirbulatov;
160331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-LABEL: define i32 @multi_user_cmp_extra_select(
160431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
160531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:  entry:
160631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br label [[FOR_BODY:%.*]]
160731d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       for.body:
160831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
160931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
161031d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
161131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
161231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
161331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
161431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
161531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
161631d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
161731d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
161831d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
161931d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
162031d4c975SDinar Temirbulatov; CHECK-VF4-IC2:       exit:
162131d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
162231d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
162331d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
162431d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    [[TMP2:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP1]]
162531d4c975SDinar Temirbulatov; CHECK-VF4-IC2-NEXT:    ret i32 [[TMP2]]
162631d4c975SDinar Temirbulatov;
162731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-LABEL: define i32 @multi_user_cmp_extra_select(
162831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-SAME: ptr readonly [[A:%.*]], i64 noundef [[N:%.*]]) {
162931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:  entry:
163031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br label [[FOR_BODY:%.*]]
163131d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       for.body:
163231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
163331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF010:%.*]] = phi i1 [ true, [[ENTRY]] ], [ [[ALL_0_OFF0_:%.*]], [[FOR_BODY]] ]
163431d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ANY_0_OFF09:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[DOTANY_0_OFF0:%.*]], [[FOR_BODY]] ]
163531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[INDVARS_IV]]
163631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX]], align 4
163731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[CMP1:%.*]] = fcmp olt float [[LOAD1]], 0.000000e+00
163831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0]] = select i1 [[CMP1]], i1 true, i1 [[ANY_0_OFF09]]
163931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0_]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
164031d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP0:%.*]] = select i1 [[CMP1]], i1 [[ALL_0_OFF010]], i1 false
164131d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
164231d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]
164331d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
164431d4c975SDinar Temirbulatov; CHECK-VF1-IC2:       exit:
164531d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[DOTANY_0_OFF0_LCSSA:%.*]] = phi i1 [ [[DOTANY_0_OFF0]], [[FOR_BODY]] ]
164631d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[ALL_0_OFF0__LCSSA:%.*]] = phi i1 [ [[ALL_0_OFF0_]], [[FOR_BODY]] ]
164731d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP1:%.*]] = select i1 [[DOTANY_0_OFF0_LCSSA]], i32 2, i32 3
164831d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    [[TMP2:%.*]] = select i1 [[ALL_0_OFF0__LCSSA]], i32 1, i32 [[TMP1]]
164931d4c975SDinar Temirbulatov; CHECK-VF1-IC2-NEXT:    ret i32 [[TMP2]]
165031d4c975SDinar Temirbulatov;
165131d4c975SDinar Temirbulatoventry:
165231d4c975SDinar Temirbulatov  br label %for.body
165331d4c975SDinar Temirbulatov
165431d4c975SDinar Temirbulatovfor.body:
165531d4c975SDinar Temirbulatov  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
165631d4c975SDinar Temirbulatov  %all.0.off010 = phi i1 [ true, %entry ], [ %all.0.off0., %for.body ]
165731d4c975SDinar Temirbulatov  %any.0.off09 = phi i1 [ false, %entry ], [ %.any.0.off0, %for.body ]
165831d4c975SDinar Temirbulatov  %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv
165931d4c975SDinar Temirbulatov  %load1 = load float, ptr %arrayidx, align 4
166031d4c975SDinar Temirbulatov  %cmp1 = fcmp olt float %load1, 0.000000e+00
166131d4c975SDinar Temirbulatov  %.any.0.off0 = select i1 %cmp1, i1 true, i1 %any.0.off09
166231d4c975SDinar Temirbulatov  %all.0.off0. = select i1 %cmp1, i1 %all.0.off010, i1 false
166331d4c975SDinar Temirbulatov  %0 = select i1 %cmp1, i1 %all.0.off010, i1 false
166431d4c975SDinar Temirbulatov  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
166531d4c975SDinar Temirbulatov  %exitcond.not = icmp eq i64 %indvars.iv.next, %n
166631d4c975SDinar Temirbulatov  br i1 %exitcond.not, label %exit, label %for.body
166731d4c975SDinar Temirbulatov
166831d4c975SDinar Temirbulatovexit:
166931d4c975SDinar Temirbulatov  %1 = select i1 %.any.0.off0, i32 2, i32 3
167031d4c975SDinar Temirbulatov  %2 = select i1 %all.0.off0., i32 1, i32 %1
167131d4c975SDinar Temirbulatov  ret i32 %2
167231d4c975SDinar Temirbulatov}
167331d4c975SDinar Temirbulatov;.
167431d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
167531d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
167631d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
167731d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
167831d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
167931d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
168031d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[META6]] = !{[[META7:![0-9]+]]}
168131d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[META7]] = distinct !{[[META7]], [[META8:![0-9]+]]}
168231d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[META8]] = distinct !{[[META8]], !"LVerDomain"}
168331d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[META9]] = !{[[META10:![0-9]+]]}
168431d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[META10]] = distinct !{[[META10]], [[META8]]}
168531d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]], [[META2]]}
168631d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]]}
168731d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]], [[META2]]}
168831d4c975SDinar Temirbulatov; CHECK-VF4-IC1: [[LOOP14]] = distinct !{[[LOOP14]], [[META2]], [[META1]]}
168931d4c975SDinar Temirbulatov;.
169031d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
169131d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
169231d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
169331d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
169431d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
169531d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
169631d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[META6]] = !{[[META7:![0-9]+]]}
169731d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[META7]] = distinct !{[[META7]], [[META8:![0-9]+]]}
169831d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[META8]] = distinct !{[[META8]], !"LVerDomain"}
169931d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[META9]] = !{[[META10:![0-9]+]]}
170031d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[META10]] = distinct !{[[META10]], [[META8]]}
170131d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]], [[META2]]}
170231d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]]}
170331d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]], [[META2]]}
170431d4c975SDinar Temirbulatov; CHECK-VF4-IC2: [[LOOP14]] = distinct !{[[LOOP14]], [[META2]], [[META1]]}
170531d4c975SDinar Temirbulatov;.
170631d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
170731d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
170831d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
170931d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]}
171031d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
171131d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP5]] = distinct !{[[LOOP5]], [[META1]]}
171231d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[META6]] = !{[[META7:![0-9]+]]}
171331d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[META7]] = distinct !{[[META7]], [[META8:![0-9]+]]}
171431d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[META8]] = distinct !{[[META8]], !"LVerDomain"}
171531d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[META9]] = !{[[META10:![0-9]+]]}
171631d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[META10]] = distinct !{[[META10]], [[META8]]}
171731d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]], [[META2]]}
171831d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]]}
171931d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]], [[META2]]}
172031d4c975SDinar Temirbulatov; CHECK-VF1-IC2: [[LOOP14]] = distinct !{[[LOOP14]], [[META1]]}
172131d4c975SDinar Temirbulatov;.
172231d4c975SDinar Temirbulatov;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
172331d4c975SDinar Temirbulatov; CHECK: {{.*}}
1724