brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.2 KiB · 0656e83 Raw
529 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --filter "(:|sincos|modf|extractvalue|store)" --version 52; RUN: opt -passes=loop-vectorize -mtriple=aarch64-gnu-linux -mcpu=neoverse-v1 -mattr=+sve < %s -S -o - -debug-only=loop-vectorize 2>%t.1 | FileCheck %s --check-prefix=CHECK3; RUN: opt -passes=loop-vectorize -mtriple=aarch64-gnu-linux -mcpu=neoverse-v1 -mattr=+sve -vector-library=ArmPL < %s -S -o - -debug-only=loop-vectorize 2>%t.2 | FileCheck %s --check-prefix=CHECK-ARMPL4; RUN: FileCheck --input-file=%t.1 --check-prefix=CHECK-COST %s5; RUN: FileCheck --input-file=%t.2 --check-prefix=CHECK-COST-ARMPL %s6; REQUIRES: asserts7 8; CHECK-COST-LABEL: sincos_f329; CHECK-COST: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.sincos.f32(float %in_val)10; CHECK-COST: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)11; CHECK-COST: Cost of 58 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)12; CHECK-COST: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)13; CHECK-COST: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)14; CHECK-COST: Cost of Invalid for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)15 16; CHECK-COST-ARMPL-LABEL: sincos_f3217; CHECK-COST-ARMPL: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.sincos.f32(float %in_val)18; CHECK-COST-ARMPL: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)19; CHECK-COST-ARMPL: Cost of 12 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)20; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)21; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)22; CHECK-COST-ARMPL: Cost of 13 for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)23 24define void @sincos_f32(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {25; CHECK-LABEL: define void @sincos_f32(26; CHECK-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0:[0-9]+]] {27; CHECK:  [[ENTRY:.*:]]28; CHECK:  [[VECTOR_PH:.*:]]29; CHECK:  [[VECTOR_BODY:.*:]]30; CHECK:    [[TMP6:%.*]] = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> [[WIDE_LOAD1:%.*]])31; CHECK:    [[TMP8:%.*]] = extractvalue { <2 x float>, <2 x float> } [[TMP6]], 032; CHECK:    [[TMP10:%.*]] = extractvalue { <2 x float>, <2 x float> } [[TMP6]], 133; CHECK:    store <2 x float> [[TMP8]], ptr [[TMP12:%.*]], align 434; CHECK:    store <2 x float> [[TMP10]], ptr [[TMP11:%.*]], align 435; CHECK:  [[FOR_BODY:.*:]]36; CHECK:  [[EXIT:.*:]]37;38; CHECK-ARMPL-LABEL: define void @sincos_f32(39; CHECK-ARMPL-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0:[0-9]+]] {40; CHECK-ARMPL:  [[VECTOR_BODY1:.*:]]41; CHECK-ARMPL:  [[VEC_EPILOG_MIDDLE_BLOCK:.*:]]42; CHECK-ARMPL:  [[VEC_EPILOG_SCALAR_PH:.*:]]43; CHECK-ARMPL:    [[TMP8:%.*]] = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincos.nxv4f32(<vscale x 4 x float> [[WIDE_LOAD:%.*]])44; CHECK-ARMPL:    [[TMP9:%.*]] = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincos.nxv4f32(<vscale x 4 x float> [[WIDE_LOAD1:%.*]])45; CHECK-ARMPL:    [[TMP10:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP8]], 046; CHECK-ARMPL:    [[TMP11:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP9]], 047; CHECK-ARMPL:    [[TMP12:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP8]], 148; CHECK-ARMPL:    [[TMP13:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP9]], 149; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP10]], ptr [[TMP14:%.*]], align 450; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP11]], ptr [[TMP17:%.*]], align 451; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP12]], ptr [[TMP18:%.*]], align 452; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP13]], ptr [[TMP21:%.*]], align 453; CHECK-ARMPL:  [[FOR_BODY1:.*:]]54; CHECK-ARMPL:  [[EXIT:.*:]]55; CHECK-ARMPL:  [[FOR_BODY:.*:]]56; CHECK-ARMPL:    [[CALL:%.*]] = tail call { float, float } @llvm.sincos.f32(float [[IN_VAL:%.*]])57; CHECK-ARMPL:    [[EXTRACT_A:%.*]] = extractvalue { float, float } [[CALL]], 058; CHECK-ARMPL:    [[EXTRACT_B:%.*]] = extractvalue { float, float } [[CALL]], 159; CHECK-ARMPL:    store float [[EXTRACT_A]], ptr [[ARRAYIDX2:%.*]], align 460; CHECK-ARMPL:    store float [[EXTRACT_B]], ptr [[ARRAYIDX4:%.*]], align 461; CHECK-ARMPL:  [[EXIT1:.*:]]62;63entry:64  br label %for.body65 66for.body:67  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]68  %arrayidx = getelementptr inbounds float, ptr %in, i64 %iv69  %in_val = load float, ptr %arrayidx, align 470  %call = tail call { float, float } @llvm.sincos.f32(float %in_val)71  %extract_a = extractvalue { float, float } %call, 072  %extract_b = extractvalue { float, float } %call, 173  %arrayidx2 = getelementptr inbounds float, ptr %out_a, i64 %iv74  store float %extract_a, ptr %arrayidx2, align 475  %arrayidx4 = getelementptr inbounds float, ptr %out_b, i64 %iv76  store float %extract_b, ptr %arrayidx4, align 477  %iv.next = add nuw nsw i64 %iv, 178  %exitcond.not = icmp eq i64 %iv.next, 102479  br i1 %exitcond.not, label %exit, label %for.body80 81exit:82  ret void83}84 85; CHECK-COST-LABEL: sincos_f6486; CHECK-COST: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { double, double } @llvm.sincos.f64(double %in_val)87; CHECK-COST: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)88; CHECK-COST: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)89; CHECK-COST: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)90 91; CHECK-COST-ARMPL-LABEL: sincos_f6492; CHECK-COST-ARMPL: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { double, double } @llvm.sincos.f64(double %in_val)93; CHECK-COST-ARMPL: Cost of 12 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)94; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)95; CHECK-COST-ARMPL: Cost of 13 for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)96 97define void @sincos_f64(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {98; CHECK-LABEL: define void @sincos_f64(99; CHECK-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {100; CHECK:  [[ENTRY:.*:]]101; CHECK:  [[VECTOR_PH:.*:]]102; CHECK:  [[VECTOR_BODY:.*:]]103; CHECK:    [[TMP6:%.*]] = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> [[WIDE_LOAD1:%.*]])104; CHECK:    [[TMP8:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP6]], 0105; CHECK:    [[TMP10:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP6]], 1106; CHECK:    store <2 x double> [[TMP8]], ptr [[TMP12:%.*]], align 8107; CHECK:    store <2 x double> [[TMP10]], ptr [[TMP11:%.*]], align 8108; CHECK:  [[FOR_BODY:.*:]]109; CHECK:  [[EXIT:.*:]]110;111; CHECK-ARMPL-LABEL: define void @sincos_f64(112; CHECK-ARMPL-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {113; CHECK-ARMPL:  [[VECTOR_BODY:.*:]]114; CHECK-ARMPL:  [[MIDDLE_BLOCK:.*:]]115; CHECK-ARMPL:  [[SCALAR_PH:.*:]]116; CHECK-ARMPL:    [[TMP8:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.sincos.nxv2f64(<vscale x 2 x double> [[WIDE_LOAD:%.*]])117; CHECK-ARMPL:    [[TMP9:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.sincos.nxv2f64(<vscale x 2 x double> [[WIDE_LOAD1:%.*]])118; CHECK-ARMPL:    [[TMP10:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP8]], 0119; CHECK-ARMPL:    [[TMP11:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP9]], 0120; CHECK-ARMPL:    [[TMP12:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP8]], 1121; CHECK-ARMPL:    [[TMP13:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP9]], 1122; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP10]], ptr [[TMP14:%.*]], align 8123; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP11]], ptr [[TMP17:%.*]], align 8124; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP12]], ptr [[TMP18:%.*]], align 8125; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP13]], ptr [[TMP21:%.*]], align 8126; CHECK-ARMPL:  [[FOR_BODY:.*:]]127; CHECK-ARMPL:  [[EXIT:.*:]]128; CHECK-ARMPL:  [[FOR_BODY1:.*:]]129; CHECK-ARMPL:    [[CALL:%.*]] = tail call { double, double } @llvm.sincos.f64(double [[IN_VAL:%.*]])130; CHECK-ARMPL:    [[EXTRACT_A:%.*]] = extractvalue { double, double } [[CALL]], 0131; CHECK-ARMPL:    [[EXTRACT_B:%.*]] = extractvalue { double, double } [[CALL]], 1132; CHECK-ARMPL:    store double [[EXTRACT_A]], ptr [[ARRAYIDX2:%.*]], align 8133; CHECK-ARMPL:    store double [[EXTRACT_B]], ptr [[ARRAYIDX4:%.*]], align 8134; CHECK-ARMPL:  [[EXIT1:.*:]]135;136entry:137  br label %for.body138 139for.body:140  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]141  %arrayidx = getelementptr inbounds double, ptr %in, i64 %iv142  %in_val = load double, ptr %arrayidx, align 8143  %call = tail call { double, double } @llvm.sincos.f64(double %in_val)144  %extract_a = extractvalue { double, double } %call, 0145  %extract_b = extractvalue { double, double } %call, 1146  %arrayidx2 = getelementptr inbounds double, ptr %out_a, i64 %iv147  store double %extract_a, ptr %arrayidx2, align 8148  %arrayidx4 = getelementptr inbounds double, ptr %out_b, i64 %iv149  store double %extract_b, ptr %arrayidx4, align 8150  %iv.next = add nuw nsw i64 %iv, 1151  %exitcond.not = icmp eq i64 %iv.next, 1024152  br i1 %exitcond.not, label %exit, label %for.body153 154exit:155  ret void156}157 158; CHECK-COST-LABEL: predicated_sincos159; CHECK-COST: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.sincos.f32(float %in_val)160; CHECK-COST: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)161; CHECK-COST: Cost of 58 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)162; CHECK-COST: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)163; CHECK-COST: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)164; CHECK-COST: Cost of Invalid for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)165 166; CHECK-COST-ARMPL-LABEL: predicated_sincos167; CHECK-COST-ARMPL: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.sincos.f32(float %in_val)168; CHECK-COST-ARMPL: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)169; CHECK-COST-ARMPL: Cost of 12 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)170; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)171; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)172; CHECK-COST-ARMPL: Cost of 13 for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincos(ir<%in_val>)173 174define void @predicated_sincos(float %x, ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {175; CHECK-LABEL: define void @predicated_sincos(176; CHECK-SAME: float [[X:%.*]], ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {177; CHECK:  [[ENTRY:.*:]]178; CHECK:  [[FOR_BODY:.*:]]179; CHECK:  [[IF_THEN:.*:]]180; CHECK:    [[CALL:%.*]] = tail call { float, float } @llvm.sincos.f32(float [[IN_VAL:%.*]])181; CHECK:    [[EXTRACT_A:%.*]] = extractvalue { float, float } [[CALL]], 0182; CHECK:    [[EXTRACT_B:%.*]] = extractvalue { float, float } [[CALL]], 1183; CHECK:    store float [[EXTRACT_A]], ptr [[ARRAYIDX2:%.*]], align 4184; CHECK:    store float [[EXTRACT_B]], ptr [[ARRAYIDX4:%.*]], align 4185; CHECK:  [[IF_MERGE:.*:]]186; CHECK:  [[FOR_END:.*:]]187;188; CHECK-ARMPL-LABEL: define void @predicated_sincos(189; CHECK-ARMPL-SAME: float [[X:%.*]], ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {190; CHECK-ARMPL:  [[ENTRY:.*:]]191; CHECK-ARMPL:  [[VECTOR_PH:.*:]]192; CHECK-ARMPL:  [[VECTOR_BODY:.*:]]193; CHECK-ARMPL:    [[TMP10:%.*]] = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincos.nxv4f32(<vscale x 4 x float> [[WIDE_MASKED_LOAD:%.*]])194; CHECK-ARMPL:    [[TMP11:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP10]], 0195; CHECK-ARMPL:    [[TMP12:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP10]], 1196; CHECK-ARMPL:    call void @llvm.masked.store.nxv4f32.p0(<vscale x 4 x float> [[TMP11]], ptr align 4 [[TMP13:%.*]], <vscale x 4 x i1> [[TMP9:%.*]])197; CHECK-ARMPL:    call void @llvm.masked.store.nxv4f32.p0(<vscale x 4 x float> [[TMP12]], ptr align 4 [[TMP14:%.*]], <vscale x 4 x i1> [[TMP9]])198; CHECK-ARMPL:  [[IF_MERGE:.*:]]199; CHECK-ARMPL:  [[FOR_END:.*:]]200;201entry:202  br label %for.body203 204for.body:205  %iv = phi i64 [ %iv.next, %if.merge ], [ 0, %entry ]206  %arrayidx = getelementptr inbounds float, ptr %in, i64 %iv207  %in_val = load float, ptr %arrayidx, align 4208  %if_cond = fcmp olt float %in_val, %x209  br i1 %if_cond, label %if.then, label %if.merge210 211if.then:212  %call = tail call { float, float } @llvm.sincos.f32(float %in_val)213  %extract_a = extractvalue { float, float } %call, 0214  %extract_b = extractvalue { float, float } %call, 1215  %arrayidx2 = getelementptr inbounds float, ptr %out_a, i64 %iv216  store float %extract_a, ptr %arrayidx2, align 4217  %arrayidx4 = getelementptr inbounds float, ptr %out_b, i64 %iv218  store float %extract_b, ptr %arrayidx4, align 4219  br label %if.merge220 221if.merge:222  %iv.next = add nuw nsw i64 %iv, 1223  %cond = icmp slt i64 %iv.next, 1024224  br i1 %cond, label %for.body, label %for.end225 226for.end:227  ret void228}229 230; CHECK-COST-LABEL: modf_f32231; CHECK-COST: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.modf.f32(float %in_val)232; CHECK-COST: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)233; CHECK-COST: Cost of 58 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)234; CHECK-COST: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)235; CHECK-COST: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)236; CHECK-COST: Cost of Invalid for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)237 238; CHECK-COST-ARMPL-LABEL: modf_f32239; CHECK-COST-ARMPL: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.modf.f32(float %in_val)240; CHECK-COST-ARMPL: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)241; CHECK-COST-ARMPL: Cost of 11 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)242; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)243; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)244; CHECK-COST-ARMPL: Cost of 12 for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)245 246define void @modf_f32(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {247; CHECK-LABEL: define void @modf_f32(248; CHECK-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {249; CHECK:  [[ENTRY:.*:]]250; CHECK:  [[VECTOR_PH:.*:]]251; CHECK:  [[VECTOR_BODY:.*:]]252; CHECK:    [[TMP3:%.*]] = call { <2 x float>, <2 x float> } @llvm.modf.v2f32(<2 x float> [[WIDE_LOAD:%.*]])253; CHECK:    [[TMP4:%.*]] = extractvalue { <2 x float>, <2 x float> } [[TMP3]], 0254; CHECK:    [[TMP5:%.*]] = extractvalue { <2 x float>, <2 x float> } [[TMP3]], 1255; CHECK:    store <2 x float> [[TMP4]], ptr [[TMP7:%.*]], align 4256; CHECK:    store <2 x float> [[TMP5]], ptr [[TMP9:%.*]], align 4257; CHECK:  [[FOR_BODY:.*:]]258; CHECK:  [[EXIT:.*:]]259;260; CHECK-ARMPL-LABEL: define void @modf_f32(261; CHECK-ARMPL-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {262; CHECK-ARMPL:  [[VECTOR_PH:.*:]]263; CHECK-ARMPL:  [[VECTOR_BODY:.*:]]264; CHECK-ARMPL:  [[VECTOR_BODY1:.*:]]265; CHECK-ARMPL:    [[TMP12:%.*]] = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.modf.nxv4f32(<vscale x 4 x float> [[WIDE_LOAD:%.*]])266; CHECK-ARMPL:    [[TMP13:%.*]] = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.modf.nxv4f32(<vscale x 4 x float> [[WIDE_LOAD1:%.*]])267; CHECK-ARMPL:    [[TMP14:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP12]], 0268; CHECK-ARMPL:    [[TMP15:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP13]], 0269; CHECK-ARMPL:    [[TMP16:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP12]], 1270; CHECK-ARMPL:    [[TMP17:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP13]], 1271; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP14]], ptr [[TMP19:%.*]], align 4272; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP15]], ptr [[TMP22:%.*]], align 4273; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP16]], ptr [[TMP24:%.*]], align 4274; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP17]], ptr [[TMP27:%.*]], align 4275; CHECK-ARMPL:  [[VEC_EPILOG_MIDDLE_BLOCK:.*:]]276; CHECK-ARMPL:  [[VEC_EPILOG_SCALAR_PH:.*:]]277; CHECK-ARMPL:  [[FOR_BODY1:.*:]]278; CHECK-ARMPL:    [[CALL:%.*]] = tail call { float, float } @llvm.modf.f32(float [[IN_VAL:%.*]])279; CHECK-ARMPL:    [[EXTRACT_A:%.*]] = extractvalue { float, float } [[CALL]], 0280; CHECK-ARMPL:    [[EXTRACT_B:%.*]] = extractvalue { float, float } [[CALL]], 1281; CHECK-ARMPL:    store float [[EXTRACT_A]], ptr [[ARRAYIDX2:%.*]], align 4282; CHECK-ARMPL:    store float [[EXTRACT_B]], ptr [[ARRAYIDX4:%.*]], align 4283; CHECK-ARMPL:  [[EXIT:.*:]]284;285entry:286  br label %for.body287 288for.body:289  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]290  %arrayidx = getelementptr inbounds float, ptr %in, i64 %iv291  %in_val = load float, ptr %arrayidx, align 4292  %call = tail call { float, float } @llvm.modf.f32(float %in_val)293  %extract_a = extractvalue { float, float } %call, 0294  %extract_b = extractvalue { float, float } %call, 1295  %arrayidx2 = getelementptr inbounds float, ptr %out_a, i64 %iv296  store float %extract_a, ptr %arrayidx2, align 4297  %arrayidx4 = getelementptr inbounds float, ptr %out_b, i64 %iv298  store float %extract_b, ptr %arrayidx4, align 4299  %iv.next = add nuw nsw i64 %iv, 1300  %exitcond.not = icmp eq i64 %iv.next, 1024301  br i1 %exitcond.not, label %exit, label %for.body302 303exit:304  ret void305}306 307; CHECK-COST-LABEL: modf_f64308; CHECK-COST: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { double, double } @llvm.modf.f64(double %in_val)309; CHECK-COST: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)310; CHECK-COST: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)311; CHECK-COST: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)312 313; CHECK-COST-ARMPL-LABEL: modf_f64314; CHECK-COST-ARMPL: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { double, double } @llvm.modf.f64(double %in_val)315; CHECK-COST-ARMPL: Cost of 11 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)316; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)317; CHECK-COST-ARMPL: Cost of 12 for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.modf(ir<%in_val>)318 319define void @modf_f64(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {320; CHECK-LABEL: define void @modf_f64(321; CHECK-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {322; CHECK:  [[ENTRY:.*:]]323; CHECK:  [[VECTOR_PH:.*:]]324; CHECK:  [[VECTOR_BODY:.*:]]325; CHECK:    [[TMP3:%.*]] = call { <2 x double>, <2 x double> } @llvm.modf.v2f64(<2 x double> [[WIDE_LOAD:%.*]])326; CHECK:    [[TMP4:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP3]], 0327; CHECK:    [[TMP5:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP3]], 1328; CHECK:    store <2 x double> [[TMP4]], ptr [[TMP7:%.*]], align 8329; CHECK:    store <2 x double> [[TMP5]], ptr [[TMP9:%.*]], align 8330; CHECK:  [[FOR_BODY:.*:]]331; CHECK:  [[EXIT:.*:]]332;333; CHECK-ARMPL-LABEL: define void @modf_f64(334; CHECK-ARMPL-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {335; CHECK-ARMPL:  [[ENTRY:.*:]]336; CHECK-ARMPL:  [[VECTOR_PH:.*:]]337; CHECK-ARMPL:  [[VECTOR_BODY:.*:]]338; CHECK-ARMPL:    [[TMP12:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.modf.nxv2f64(<vscale x 2 x double> [[WIDE_LOAD:%.*]])339; CHECK-ARMPL:    [[TMP13:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.modf.nxv2f64(<vscale x 2 x double> [[WIDE_LOAD1:%.*]])340; CHECK-ARMPL:    [[TMP14:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP12]], 0341; CHECK-ARMPL:    [[TMP15:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP13]], 0342; CHECK-ARMPL:    [[TMP16:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP12]], 1343; CHECK-ARMPL:    [[TMP17:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP13]], 1344; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP14]], ptr [[TMP19:%.*]], align 8345; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP15]], ptr [[TMP22:%.*]], align 8346; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP16]], ptr [[TMP24:%.*]], align 8347; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP17]], ptr [[TMP27:%.*]], align 8348; CHECK-ARMPL:  [[MIDDLE_BLOCK:.*:]]349; CHECK-ARMPL:  [[SCALAR_PH:.*:]]350; CHECK-ARMPL:  [[FOR_BODY:.*:]]351; CHECK-ARMPL:    [[CALL:%.*]] = tail call { double, double } @llvm.modf.f64(double [[IN_VAL:%.*]])352; CHECK-ARMPL:    [[EXTRACT_A:%.*]] = extractvalue { double, double } [[CALL]], 0353; CHECK-ARMPL:    [[EXTRACT_B:%.*]] = extractvalue { double, double } [[CALL]], 1354; CHECK-ARMPL:    store double [[EXTRACT_A]], ptr [[ARRAYIDX2:%.*]], align 8355; CHECK-ARMPL:    store double [[EXTRACT_B]], ptr [[ARRAYIDX4:%.*]], align 8356; CHECK-ARMPL:  [[EXIT:.*:]]357;358entry:359  br label %for.body360 361for.body:362  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]363  %arrayidx = getelementptr inbounds double, ptr %in, i64 %iv364  %in_val = load double, ptr %arrayidx, align 8365  %call = tail call { double, double } @llvm.modf.f64(double %in_val)366  %extract_a = extractvalue { double, double } %call, 0367  %extract_b = extractvalue { double, double } %call, 1368  %arrayidx2 = getelementptr inbounds double, ptr %out_a, i64 %iv369  store double %extract_a, ptr %arrayidx2, align 8370  %arrayidx4 = getelementptr inbounds double, ptr %out_b, i64 %iv371  store double %extract_b, ptr %arrayidx4, align 8372  %iv.next = add nuw nsw i64 %iv, 1373  %exitcond.not = icmp eq i64 %iv.next, 1024374  br i1 %exitcond.not, label %exit, label %for.body375 376exit:377  ret void378}379 380; CHECK-COST-LABEL: sincospi_f32381; CHECK-COST: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.sincospi.f32(float %in_val)382; CHECK-COST: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)383; CHECK-COST: Cost of 58 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)384; CHECK-COST: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)385; CHECK-COST: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)386; CHECK-COST: Cost of Invalid for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)387 388; CHECK-COST-ARMPL-LABEL: sincospi_f32389; CHECK-COST-ARMPL: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { float, float } @llvm.sincospi.f32(float %in_val)390; CHECK-COST-ARMPL: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)391; CHECK-COST-ARMPL: Cost of 12 for VF 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)392; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)393; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)394; CHECK-COST-ARMPL: Cost of 13 for VF vscale x 4: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)395 396define void @sincospi_f32(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {397; CHECK-LABEL: define void @sincospi_f32(398; CHECK-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {399; CHECK:  [[ENTRY:.*:]]400; CHECK:  [[VECTOR_PH:.*:]]401; CHECK:  [[VECTOR_BODY:.*:]]402; CHECK:    [[TMP3:%.*]] = call { <2 x float>, <2 x float> } @llvm.sincospi.v2f32(<2 x float> [[WIDE_LOAD:%.*]])403; CHECK:    [[TMP4:%.*]] = extractvalue { <2 x float>, <2 x float> } [[TMP3]], 0404; CHECK:    [[TMP5:%.*]] = extractvalue { <2 x float>, <2 x float> } [[TMP3]], 1405; CHECK:    store <2 x float> [[TMP4]], ptr [[TMP7:%.*]], align 4406; CHECK:    store <2 x float> [[TMP5]], ptr [[TMP9:%.*]], align 4407; CHECK:  [[FOR_BODY:.*:]]408; CHECK:  [[EXIT:.*:]]409;410; CHECK-ARMPL-LABEL: define void @sincospi_f32(411; CHECK-ARMPL-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {412; CHECK-ARMPL:  [[VECTOR_PH:.*:]]413; CHECK-ARMPL:  [[VECTOR_BODY:.*:]]414; CHECK-ARMPL:  [[VECTOR_BODY1:.*:]]415; CHECK-ARMPL:    [[TMP12:%.*]] = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincospi.nxv4f32(<vscale x 4 x float> [[WIDE_LOAD:%.*]])416; CHECK-ARMPL:    [[TMP13:%.*]] = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincospi.nxv4f32(<vscale x 4 x float> [[WIDE_LOAD1:%.*]])417; CHECK-ARMPL:    [[TMP14:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP12]], 0418; CHECK-ARMPL:    [[TMP15:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP13]], 0419; CHECK-ARMPL:    [[TMP16:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP12]], 1420; CHECK-ARMPL:    [[TMP17:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP13]], 1421; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP14]], ptr [[TMP19:%.*]], align 4422; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP15]], ptr [[TMP22:%.*]], align 4423; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP16]], ptr [[TMP24:%.*]], align 4424; CHECK-ARMPL:    store <vscale x 4 x float> [[TMP17]], ptr [[TMP27:%.*]], align 4425; CHECK-ARMPL:  [[VEC_EPILOG_MIDDLE_BLOCK:.*:]]426; CHECK-ARMPL:  [[VEC_EPILOG_SCALAR_PH:.*:]]427; CHECK-ARMPL:  [[FOR_BODY1:.*:]]428; CHECK-ARMPL:    [[CALL:%.*]] = tail call { float, float } @llvm.sincospi.f32(float [[IN_VAL:%.*]])429; CHECK-ARMPL:    [[EXTRACT_A:%.*]] = extractvalue { float, float } [[CALL]], 0430; CHECK-ARMPL:    [[EXTRACT_B:%.*]] = extractvalue { float, float } [[CALL]], 1431; CHECK-ARMPL:    store float [[EXTRACT_A]], ptr [[ARRAYIDX2:%.*]], align 4432; CHECK-ARMPL:    store float [[EXTRACT_B]], ptr [[ARRAYIDX4:%.*]], align 4433; CHECK-ARMPL:  [[EXIT:.*:]]434;435entry:436  br label %for.body437 438for.body:439  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]440  %arrayidx = getelementptr inbounds float, ptr %in, i64 %iv441  %in_val = load float, ptr %arrayidx, align 4442  %call = tail call { float, float } @llvm.sincospi.f32(float %in_val)443  %extract_a = extractvalue { float, float } %call, 0444  %extract_b = extractvalue { float, float } %call, 1445  %arrayidx2 = getelementptr inbounds float, ptr %out_a, i64 %iv446  store float %extract_a, ptr %arrayidx2, align 4447  %arrayidx4 = getelementptr inbounds float, ptr %out_b, i64 %iv448  store float %extract_b, ptr %arrayidx4, align 4449  %iv.next = add nuw nsw i64 %iv, 1450  %exitcond.not = icmp eq i64 %iv.next, 1024451  br i1 %exitcond.not, label %exit, label %for.body452 453exit:454  ret void455}456 457; CHECK-COST-LABEL: sincospi_f64458; CHECK-COST: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { double, double } @llvm.sincospi.f64(double %in_val)459; CHECK-COST: Cost of 26 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)460; CHECK-COST: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)461; CHECK-COST: Cost of Invalid for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)462 463; CHECK-COST-ARMPL-LABEL: sincospi_f64464; CHECK-COST-ARMPL: LV: Found an estimated cost of 10 for VF 1 For instruction:   %call = tail call { double, double } @llvm.sincospi.f64(double %in_val)465; CHECK-COST-ARMPL: Cost of 12 for VF 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)466; CHECK-COST-ARMPL: Cost of Invalid for VF vscale x 1: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)467; CHECK-COST-ARMPL: Cost of 13 for VF vscale x 2: WIDEN-INTRINSIC ir<%call> = call llvm.sincospi(ir<%in_val>)468 469define void @sincospi_f64(ptr noalias %in, ptr noalias writeonly %out_a, ptr noalias writeonly %out_b) {470; CHECK-LABEL: define void @sincospi_f64(471; CHECK-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {472; CHECK:  [[ENTRY:.*:]]473; CHECK:  [[VECTOR_PH:.*:]]474; CHECK:  [[VECTOR_BODY:.*:]]475; CHECK:    [[TMP3:%.*]] = call { <2 x double>, <2 x double> } @llvm.sincospi.v2f64(<2 x double> [[WIDE_LOAD:%.*]])476; CHECK:    [[TMP4:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP3]], 0477; CHECK:    [[TMP5:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP3]], 1478; CHECK:    store <2 x double> [[TMP4]], ptr [[TMP7:%.*]], align 8479; CHECK:    store <2 x double> [[TMP5]], ptr [[TMP9:%.*]], align 8480; CHECK:  [[FOR_BODY:.*:]]481; CHECK:  [[EXIT:.*:]]482;483; CHECK-ARMPL-LABEL: define void @sincospi_f64(484; CHECK-ARMPL-SAME: ptr noalias [[IN:%.*]], ptr noalias writeonly [[OUT_A:%.*]], ptr noalias writeonly [[OUT_B:%.*]]) #[[ATTR0]] {485; CHECK-ARMPL:  [[ENTRY:.*:]]486; CHECK-ARMPL:  [[VECTOR_PH:.*:]]487; CHECK-ARMPL:  [[VECTOR_BODY:.*:]]488; CHECK-ARMPL:    [[TMP12:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.sincospi.nxv2f64(<vscale x 2 x double> [[WIDE_LOAD:%.*]])489; CHECK-ARMPL:    [[TMP13:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.sincospi.nxv2f64(<vscale x 2 x double> [[WIDE_LOAD1:%.*]])490; CHECK-ARMPL:    [[TMP14:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP12]], 0491; CHECK-ARMPL:    [[TMP15:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP13]], 0492; CHECK-ARMPL:    [[TMP16:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP12]], 1493; CHECK-ARMPL:    [[TMP17:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP13]], 1494; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP14]], ptr [[TMP19:%.*]], align 8495; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP15]], ptr [[TMP22:%.*]], align 8496; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP16]], ptr [[TMP24:%.*]], align 8497; CHECK-ARMPL:    store <vscale x 2 x double> [[TMP17]], ptr [[TMP27:%.*]], align 8498; CHECK-ARMPL:  [[MIDDLE_BLOCK:.*:]]499; CHECK-ARMPL:  [[SCALAR_PH:.*:]]500; CHECK-ARMPL:  [[FOR_BODY:.*:]]501; CHECK-ARMPL:    [[CALL:%.*]] = tail call { double, double } @llvm.sincospi.f64(double [[IN_VAL:%.*]])502; CHECK-ARMPL:    [[EXTRACT_A:%.*]] = extractvalue { double, double } [[CALL]], 0503; CHECK-ARMPL:    [[EXTRACT_B:%.*]] = extractvalue { double, double } [[CALL]], 1504; CHECK-ARMPL:    store double [[EXTRACT_A]], ptr [[ARRAYIDX2:%.*]], align 8505; CHECK-ARMPL:    store double [[EXTRACT_B]], ptr [[ARRAYIDX4:%.*]], align 8506; CHECK-ARMPL:  [[EXIT:.*:]]507;508entry:509  br label %for.body510 511for.body:512  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]513  %arrayidx = getelementptr inbounds double, ptr %in, i64 %iv514  %in_val = load double, ptr %arrayidx, align 8515  %call = tail call { double, double } @llvm.sincospi.f64(double %in_val)516  %extract_a = extractvalue { double, double } %call, 0517  %extract_b = extractvalue { double, double } %call, 1518  %arrayidx2 = getelementptr inbounds double, ptr %out_a, i64 %iv519  store double %extract_a, ptr %arrayidx2, align 8520  %arrayidx4 = getelementptr inbounds double, ptr %out_b, i64 %iv521  store double %extract_b, ptr %arrayidx4, align 8522  %iv.next = add nuw nsw i64 %iv, 1523  %exitcond.not = icmp eq i64 %iv.next, 1024524  br i1 %exitcond.not, label %exit, label %for.body525 526exit:527  ret void528}529