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