brintos

brintos / llvm-project-archived public Read only

0
0
Text · 40.1 KiB · fed5df2 Raw
693 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt -S < %s -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=2 | FileCheck %s3; RUN: opt -S < %s -passes=loop-vectorize -force-vector-interleave=2 -force-vector-width=2 | FileCheck --check-prefix=INTERLEAVE %s4 5; Make sure we are preserving existing metadata in the vectorized code.6 7define void @fp_math(ptr nocapture %a, ptr noalias %b, i64 %size) {8; CHECK-LABEL: define void @fp_math(9; CHECK-SAME: ptr captures(none) [[A:%.*]], ptr noalias [[B:%.*]], i64 [[SIZE:%.*]]) {10; CHECK-NEXT:  [[ENTRY:.*]]:11; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[SIZE]], 212; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]13; CHECK:       [[VECTOR_PH]]:14; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[SIZE]], 215; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[SIZE]], [[N_MOD_VF]]16; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]17; CHECK:       [[VECTOR_BODY]]:18; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]19; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[INDEX]]20; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]21; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 4, !tbaa [[CHAR_TBAA0:![0-9]+]]22; CHECK-NEXT:    [[TMP3:%.*]] = fadd <2 x double> [[WIDE_LOAD]], splat (double 9.900000e+01), !fpmath [[META3:![0-9]+]]23; CHECK-NEXT:    [[TMP4:%.*]] = fcmp oge <2 x double> [[TMP3]], splat (double 1.000000e+01)24; CHECK-NEXT:    [[TMP6:%.*]] = select <2 x i1> [[TMP4]], <2 x double> [[WIDE_LOAD]], <2 x double> zeroinitializer, !fpmath [[META3]]25; CHECK-NEXT:    [[TMP5:%.*]] = fptrunc <2 x double> [[TMP6]] to <2 x float>, !fpmath [[META3]]26; CHECK-NEXT:    store <2 x float> [[TMP5]], ptr [[TMP1]], align 4, !tbaa [[CHAR_TBAA0]]27; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 228; CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]29; CHECK-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]30; CHECK:       [[MIDDLE_BLOCK]]:31; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[SIZE]], [[N_VEC]]32; CHECK-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]33; CHECK:       [[SCALAR_PH]]:34; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]35; CHECK-NEXT:    br label %[[LOOP:.*]]36; CHECK:       [[LOOP]]:37; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]38; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[IV]]39; CHECK-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]40; CHECK-NEXT:    [[L_1:%.*]] = load double, ptr [[ARRAYIDX_1]], align 4, !tbaa [[CHAR_TBAA0]]41; CHECK-NEXT:    [[ADD:%.*]] = fadd double [[L_1]], 9.900000e+01, !fpmath [[META3]]42; CHECK-NEXT:    [[C:%.*]] = fcmp oge double [[ADD]], 1.000000e+0143; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C]], double [[L_1]], double 0.000000e+00, !fpmath [[META3]]44; CHECK-NEXT:    [[T:%.*]] = fptrunc double [[SEL]] to float, !fpmath [[META3]]45; CHECK-NEXT:    store float [[T]], ptr [[ARRAYIDX_2]], align 4, !tbaa [[CHAR_TBAA0]]46; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 147; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[SIZE]]48; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT]], !llvm.loop [[LOOP7:![0-9]+]]49; CHECK:       [[EXIT]]:50; CHECK-NEXT:    ret void51;52; INTERLEAVE-LABEL: define void @fp_math(53; INTERLEAVE-SAME: ptr captures(none) [[A:%.*]], ptr noalias [[B:%.*]], i64 [[SIZE:%.*]]) {54; INTERLEAVE-NEXT:  [[ENTRY:.*]]:55; INTERLEAVE-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[SIZE]], 456; INTERLEAVE-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]57; INTERLEAVE:       [[VECTOR_PH]]:58; INTERLEAVE-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[SIZE]], 459; INTERLEAVE-NEXT:    [[N_VEC:%.*]] = sub i64 [[SIZE]], [[N_MOD_VF]]60; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]61; INTERLEAVE:       [[VECTOR_BODY]]:62; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]63; INTERLEAVE-NEXT:    [[TMP0:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[INDEX]]64; INTERLEAVE-NEXT:    [[TMP1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[INDEX]]65; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds double, ptr [[TMP0]], i64 266; INTERLEAVE-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 4, !tbaa [[CHAR_TBAA0:![0-9]+]]67; INTERLEAVE-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x double>, ptr [[TMP2]], align 4, !tbaa [[CHAR_TBAA0]]68; INTERLEAVE-NEXT:    [[TMP4:%.*]] = fadd <2 x double> [[WIDE_LOAD]], splat (double 9.900000e+01), !fpmath [[META3:![0-9]+]]69; INTERLEAVE-NEXT:    [[TMP5:%.*]] = fadd <2 x double> [[WIDE_LOAD1]], splat (double 9.900000e+01), !fpmath [[META3]]70; INTERLEAVE-NEXT:    [[TMP6:%.*]] = fcmp oge <2 x double> [[TMP4]], splat (double 1.000000e+01)71; INTERLEAVE-NEXT:    [[TMP7:%.*]] = fcmp oge <2 x double> [[TMP5]], splat (double 1.000000e+01)72; INTERLEAVE-NEXT:    [[TMP12:%.*]] = select <2 x i1> [[TMP6]], <2 x double> [[WIDE_LOAD]], <2 x double> zeroinitializer, !fpmath [[META3]]73; INTERLEAVE-NEXT:    [[TMP8:%.*]] = select <2 x i1> [[TMP7]], <2 x double> [[WIDE_LOAD1]], <2 x double> zeroinitializer, !fpmath [[META3]]74; INTERLEAVE-NEXT:    [[TMP9:%.*]] = fptrunc <2 x double> [[TMP12]] to <2 x float>, !fpmath [[META3]]75; INTERLEAVE-NEXT:    [[TMP10:%.*]] = fptrunc <2 x double> [[TMP8]] to <2 x float>, !fpmath [[META3]]76; INTERLEAVE-NEXT:    [[TMP11:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i64 277; INTERLEAVE-NEXT:    store <2 x float> [[TMP9]], ptr [[TMP1]], align 4, !tbaa [[CHAR_TBAA0]]78; INTERLEAVE-NEXT:    store <2 x float> [[TMP10]], ptr [[TMP11]], align 4, !tbaa [[CHAR_TBAA0]]79; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 480; INTERLEAVE-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]81; INTERLEAVE-NEXT:    br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]82; INTERLEAVE:       [[MIDDLE_BLOCK]]:83; INTERLEAVE-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[SIZE]], [[N_VEC]]84; INTERLEAVE-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]85; INTERLEAVE:       [[SCALAR_PH]]:86; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]87; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]88; INTERLEAVE:       [[LOOP]]:89; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]90; INTERLEAVE-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[IV]]91; INTERLEAVE-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[IV]]92; INTERLEAVE-NEXT:    [[L_1:%.*]] = load double, ptr [[ARRAYIDX_1]], align 4, !tbaa [[CHAR_TBAA0]]93; INTERLEAVE-NEXT:    [[ADD:%.*]] = fadd double [[L_1]], 9.900000e+01, !fpmath [[META3]]94; INTERLEAVE-NEXT:    [[C:%.*]] = fcmp oge double [[ADD]], 1.000000e+0195; INTERLEAVE-NEXT:    [[SEL:%.*]] = select i1 [[C]], double [[L_1]], double 0.000000e+00, !fpmath [[META3]]96; INTERLEAVE-NEXT:    [[T:%.*]] = fptrunc double [[SEL]] to float, !fpmath [[META3]]97; INTERLEAVE-NEXT:    store float [[T]], ptr [[ARRAYIDX_2]], align 4, !tbaa [[CHAR_TBAA0]]98; INTERLEAVE-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 199; INTERLEAVE-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[SIZE]]100; INTERLEAVE-NEXT:    br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT]], !llvm.loop [[LOOP7:![0-9]+]]101; INTERLEAVE:       [[EXIT]]:102; INTERLEAVE-NEXT:    ret void103;104entry:105  br label %loop106 107loop:108  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]109  %arrayidx.1 = getelementptr inbounds double, ptr %a, i64 %iv110  %arrayidx.2 = getelementptr inbounds float, ptr %b, i64 %iv111  %l.1 = load double, ptr %arrayidx.1, align 4, !tbaa !3112  %add = fadd double %l.1, 99.0, !fpmath !0113  %c = fcmp oge double %add, 10.0114  %sel = select i1 %c, double %l.1, double 0.0, !fpmath !0115  %t = fptrunc double %sel to float, !fpmath !0116  store float %t, ptr %arrayidx.2, !tbaa !3117  %iv.next = add i64 %iv, 1118  %exitcond = icmp ne i64 %iv.next, %size119  br i1 %exitcond, label %loop, label %exit120 121exit:122  ret void123}124 125; TODO: Range metadata not preserved126define void @widen_call_range(ptr noalias %a, ptr readonly %b) {127; CHECK-LABEL: define void @widen_call_range(128; CHECK-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {129; CHECK-NEXT:  [[ENTRY:.*:]]130; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]131; CHECK:       [[VECTOR_PH]]:132; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]133; CHECK:       [[VECTOR_BODY]]:134; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]135; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i64, ptr [[B]], i64 [[INDEX]]136; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP0]], align 4, !tbaa [[CHAR_TBAA0]]137; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i64> @foo_vector_fixed2_nomask(<2 x i64> [[WIDE_LOAD]])138; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[INDEX]]139; CHECK-NEXT:    store <2 x i64> [[TMP2]], ptr [[TMP3]], align 4140; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2141; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024142; CHECK-NEXT:    br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]143; CHECK:       [[MIDDLE_BLOCK]]:144; CHECK-NEXT:    br label %[[EXIT:.*]]145; CHECK:       [[EXIT]]:146; CHECK-NEXT:    ret void147;148; INTERLEAVE-LABEL: define void @widen_call_range(149; INTERLEAVE-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {150; INTERLEAVE-NEXT:  [[ENTRY:.*:]]151; INTERLEAVE-NEXT:    br label %[[VECTOR_PH:.*]]152; INTERLEAVE:       [[VECTOR_PH]]:153; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]154; INTERLEAVE:       [[VECTOR_BODY]]:155; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]156; INTERLEAVE-NEXT:    [[TMP0:%.*]] = getelementptr i64, ptr [[B]], i64 [[INDEX]]157; INTERLEAVE-NEXT:    [[TMP1:%.*]] = getelementptr i64, ptr [[TMP0]], i64 2158; INTERLEAVE-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP0]], align 4, !tbaa [[CHAR_TBAA0]]159; INTERLEAVE-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x i64>, ptr [[TMP1]], align 4, !tbaa [[CHAR_TBAA0]]160; INTERLEAVE-NEXT:    [[TMP3:%.*]] = call <2 x i64> @foo_vector_fixed2_nomask(<2 x i64> [[WIDE_LOAD]])161; INTERLEAVE-NEXT:    [[TMP4:%.*]] = call <2 x i64> @foo_vector_fixed2_nomask(<2 x i64> [[WIDE_LOAD1]])162; INTERLEAVE-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[INDEX]]163; INTERLEAVE-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[TMP5]], i64 2164; INTERLEAVE-NEXT:    store <2 x i64> [[TMP3]], ptr [[TMP5]], align 4165; INTERLEAVE-NEXT:    store <2 x i64> [[TMP4]], ptr [[TMP7]], align 4166; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4167; INTERLEAVE-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024168; INTERLEAVE-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]169; INTERLEAVE:       [[MIDDLE_BLOCK]]:170; INTERLEAVE-NEXT:    br label %[[EXIT:.*]]171; INTERLEAVE:       [[EXIT]]:172; INTERLEAVE-NEXT:    ret void173;174entry:175  br label %loop176 177loop:178  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]179  %gep = getelementptr i64, ptr %b, i64 %iv180  %load = load i64, ptr %gep, !range !1, !tbaa !3181  %call = call i64 @foo(i64 %load) #0, !range !1182  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv183  store i64 %call, ptr %arrayidx184  %iv.next = add nuw nsw i64 %iv, 1185  %exitcond = icmp eq i64 %iv.next, 1024186  br i1 %exitcond, label %exit, label %loop187 188exit:189  ret void190}191 192define void @widen_call_fpmath(ptr noalias %a, ptr readonly %b) {193; CHECK-LABEL: define void @widen_call_fpmath(194; CHECK-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {195; CHECK-NEXT:  [[ENTRY:.*:]]196; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]197; CHECK:       [[VECTOR_PH]]:198; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]199; CHECK:       [[VECTOR_BODY]]:200; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]201; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr double, ptr [[B]], i64 [[INDEX]]202; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8, !tbaa [[CHAR_TBAA0]]203; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x double> @bar_vector_fixed2_nomask(<2 x double> [[WIDE_LOAD]]), !fpmath [[META3]]204; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[INDEX]]205; CHECK-NEXT:    store <2 x double> [[TMP1]], ptr [[TMP3]], align 8206; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2207; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024208; CHECK-NEXT:    br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]209; CHECK:       [[MIDDLE_BLOCK]]:210; CHECK-NEXT:    br label %[[EXIT:.*]]211; CHECK:       [[EXIT]]:212; CHECK-NEXT:    ret void213;214; INTERLEAVE-LABEL: define void @widen_call_fpmath(215; INTERLEAVE-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {216; INTERLEAVE-NEXT:  [[ENTRY:.*:]]217; INTERLEAVE-NEXT:    br label %[[VECTOR_PH:.*]]218; INTERLEAVE:       [[VECTOR_PH]]:219; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]220; INTERLEAVE:       [[VECTOR_BODY]]:221; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]222; INTERLEAVE-NEXT:    [[TMP0:%.*]] = getelementptr double, ptr [[B]], i64 [[INDEX]]223; INTERLEAVE-NEXT:    [[TMP1:%.*]] = getelementptr double, ptr [[TMP0]], i64 2224; INTERLEAVE-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8, !tbaa [[CHAR_TBAA0]]225; INTERLEAVE-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x double>, ptr [[TMP1]], align 8, !tbaa [[CHAR_TBAA0]]226; INTERLEAVE-NEXT:    [[TMP3:%.*]] = call <2 x double> @bar_vector_fixed2_nomask(<2 x double> [[WIDE_LOAD]]), !fpmath [[META3]]227; INTERLEAVE-NEXT:    [[TMP4:%.*]] = call <2 x double> @bar_vector_fixed2_nomask(<2 x double> [[WIDE_LOAD1]]), !fpmath [[META3]]228; INTERLEAVE-NEXT:    [[TMP5:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[INDEX]]229; INTERLEAVE-NEXT:    [[TMP7:%.*]] = getelementptr inbounds double, ptr [[TMP5]], i64 2230; INTERLEAVE-NEXT:    store <2 x double> [[TMP3]], ptr [[TMP5]], align 8231; INTERLEAVE-NEXT:    store <2 x double> [[TMP4]], ptr [[TMP7]], align 8232; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4233; INTERLEAVE-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024234; INTERLEAVE-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]235; INTERLEAVE:       [[MIDDLE_BLOCK]]:236; INTERLEAVE-NEXT:    br label %[[EXIT:.*]]237; INTERLEAVE:       [[EXIT]]:238; INTERLEAVE-NEXT:    ret void239;240entry:241  br label %loop242 243loop:244  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]245  %gep = getelementptr double , ptr %b, i64 %iv246  %load = load double, ptr %gep, !tbaa !3247  %call = call double @bar(double %load) #1, !fpmath !0248  %arrayidx = getelementptr inbounds double, ptr %a, i64 %iv249  store double %call, ptr %arrayidx250  %iv.next = add nuw nsw i64 %iv, 1251  %exitcond = icmp eq i64 %iv.next, 1024252  br i1 %exitcond, label %exit, label %loop253 254exit:255  ret void256}257 258define void @widen_intrinsic(ptr noalias %a, ptr readonly %b) {259; CHECK-LABEL: define void @widen_intrinsic(260; CHECK-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {261; CHECK-NEXT:  [[ENTRY:.*:]]262; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]263; CHECK:       [[VECTOR_PH]]:264; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]265; CHECK:       [[VECTOR_BODY]]:266; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]267; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i64, ptr [[B]], i64 [[INDEX]]268; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP0]], align 4269; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i64> @llvm.abs.v2i64(<2 x i64> [[WIDE_LOAD]], i1 true)270; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[INDEX]]271; CHECK-NEXT:    store <2 x i64> [[TMP2]], ptr [[TMP3]], align 4272; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2273; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024274; CHECK-NEXT:    br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]275; CHECK:       [[MIDDLE_BLOCK]]:276; CHECK-NEXT:    br label %[[EXIT:.*]]277; CHECK:       [[EXIT]]:278; CHECK-NEXT:    ret void279;280; INTERLEAVE-LABEL: define void @widen_intrinsic(281; INTERLEAVE-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {282; INTERLEAVE-NEXT:  [[ENTRY:.*:]]283; INTERLEAVE-NEXT:    br label %[[VECTOR_PH:.*]]284; INTERLEAVE:       [[VECTOR_PH]]:285; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]286; INTERLEAVE:       [[VECTOR_BODY]]:287; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]288; INTERLEAVE-NEXT:    [[TMP0:%.*]] = getelementptr i64, ptr [[B]], i64 [[INDEX]]289; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr i64, ptr [[TMP0]], i64 2290; INTERLEAVE-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP0]], align 4291; INTERLEAVE-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x i64>, ptr [[TMP2]], align 4292; INTERLEAVE-NEXT:    [[TMP3:%.*]] = call <2 x i64> @llvm.abs.v2i64(<2 x i64> [[WIDE_LOAD]], i1 true)293; INTERLEAVE-NEXT:    [[TMP4:%.*]] = call <2 x i64> @llvm.abs.v2i64(<2 x i64> [[WIDE_LOAD1]], i1 true)294; INTERLEAVE-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[INDEX]]295; INTERLEAVE-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[TMP5]], i64 2296; INTERLEAVE-NEXT:    store <2 x i64> [[TMP3]], ptr [[TMP5]], align 4297; INTERLEAVE-NEXT:    store <2 x i64> [[TMP4]], ptr [[TMP7]], align 4298; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4299; INTERLEAVE-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024300; INTERLEAVE-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]301; INTERLEAVE:       [[MIDDLE_BLOCK]]:302; INTERLEAVE-NEXT:    br label %[[EXIT:.*]]303; INTERLEAVE:       [[EXIT]]:304; INTERLEAVE-NEXT:    ret void305;306entry:307  br label %loop308 309loop:310  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]311  %gep = getelementptr i64, ptr %b, i64 %iv312  %load = load i64, ptr %gep313  %call = call i64 @llvm.abs.i64(i64 %load, i1 true), !range !1314  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv315  store i64 %call, ptr %arrayidx316  %iv.next = add nuw nsw i64 %iv, 1317  %exitcond = icmp eq i64 %iv.next, 1024318  br i1 %exitcond, label %exit, label %loop319 320exit:321  ret void322}323 324define void @widen_intrinsic_fpmath(ptr noalias %a, ptr readonly %b) {325; CHECK-LABEL: define void @widen_intrinsic_fpmath(326; CHECK-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {327; CHECK-NEXT:  [[ENTRY:.*:]]328; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]329; CHECK:       [[VECTOR_PH]]:330; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]331; CHECK:       [[VECTOR_BODY]]:332; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]333; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr double, ptr [[B]], i64 [[INDEX]]334; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8, !tbaa [[CHAR_TBAA0]]335; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x double> @llvm.sin.v2f64(<2 x double> [[WIDE_LOAD]]), !fpmath [[META3]]336; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[INDEX]]337; CHECK-NEXT:    store <2 x double> [[TMP1]], ptr [[TMP3]], align 8338; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2339; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024340; CHECK-NEXT:    br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]341; CHECK:       [[MIDDLE_BLOCK]]:342; CHECK-NEXT:    br label %[[EXIT:.*]]343; CHECK:       [[EXIT]]:344; CHECK-NEXT:    ret void345;346; INTERLEAVE-LABEL: define void @widen_intrinsic_fpmath(347; INTERLEAVE-SAME: ptr noalias [[A:%.*]], ptr readonly [[B:%.*]]) {348; INTERLEAVE-NEXT:  [[ENTRY:.*:]]349; INTERLEAVE-NEXT:    br label %[[VECTOR_PH:.*]]350; INTERLEAVE:       [[VECTOR_PH]]:351; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]352; INTERLEAVE:       [[VECTOR_BODY]]:353; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]354; INTERLEAVE-NEXT:    [[TMP0:%.*]] = getelementptr double, ptr [[B]], i64 [[INDEX]]355; INTERLEAVE-NEXT:    [[TMP1:%.*]] = getelementptr double, ptr [[TMP0]], i64 2356; INTERLEAVE-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x double>, ptr [[TMP0]], align 8, !tbaa [[CHAR_TBAA0]]357; INTERLEAVE-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x double>, ptr [[TMP1]], align 8, !tbaa [[CHAR_TBAA0]]358; INTERLEAVE-NEXT:    [[TMP3:%.*]] = call <2 x double> @llvm.sin.v2f64(<2 x double> [[WIDE_LOAD]]), !fpmath [[META3]]359; INTERLEAVE-NEXT:    [[TMP4:%.*]] = call <2 x double> @llvm.sin.v2f64(<2 x double> [[WIDE_LOAD1]]), !fpmath [[META3]]360; INTERLEAVE-NEXT:    [[TMP5:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[INDEX]]361; INTERLEAVE-NEXT:    [[TMP7:%.*]] = getelementptr inbounds double, ptr [[TMP5]], i64 2362; INTERLEAVE-NEXT:    store <2 x double> [[TMP3]], ptr [[TMP5]], align 8363; INTERLEAVE-NEXT:    store <2 x double> [[TMP4]], ptr [[TMP7]], align 8364; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4365; INTERLEAVE-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024366; INTERLEAVE-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]367; INTERLEAVE:       [[MIDDLE_BLOCK]]:368; INTERLEAVE-NEXT:    br label %[[EXIT:.*]]369; INTERLEAVE:       [[EXIT]]:370; INTERLEAVE-NEXT:    ret void371;372entry:373  br label %loop374 375loop:376  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]377  %gep = getelementptr double , ptr %b, i64 %iv378  %load = load double, ptr %gep, !tbaa !3379  %call = call double @llvm.sin.f64(double %load) #1, !fpmath !0380  %arrayidx = getelementptr inbounds double, ptr %a, i64 %iv381  store double %call, ptr %arrayidx382  %iv.next = add nuw nsw i64 %iv, 1383  %exitcond = icmp eq i64 %iv.next, 1024384  br i1 %exitcond, label %exit, label %loop385 386exit:387  ret void388}389 390define void @unknown_metadata(ptr nocapture %a, ptr noalias %b, i64 %size) {391; CHECK-LABEL: define void @unknown_metadata(392; CHECK-SAME: ptr captures(none) [[A:%.*]], ptr noalias [[B:%.*]], i64 [[SIZE:%.*]]) {393; CHECK-NEXT:  [[ENTRY:.*]]:394; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[SIZE]], 2395; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]396; CHECK:       [[VECTOR_PH]]:397; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[SIZE]], 2398; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[SIZE]], [[N_MOD_VF]]399; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]400; CHECK:       [[VECTOR_BODY]]:401; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]402; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]403; CHECK-NEXT:    [[TMP3:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], %[[VECTOR_BODY]] ]404; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 [[INDEX]], !custom_md [[META2:![0-9]+]]405; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], <2 x i64> [[VEC_IND]]406; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x ptr> [[TMP2]], i32 0407; CHECK-NEXT:    store <2 x i32> [[TMP3]], ptr [[TMP1]], align 4408; CHECK-NEXT:    store <2 x ptr> [[TMP2]], ptr [[TMP6]], align 8409; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2410; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)411; CHECK-NEXT:    [[VEC_IND_NEXT2]] = add <2 x i32> [[TMP3]], splat (i32 2)412; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]413; CHECK-NEXT:    br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]414; CHECK:       [[MIDDLE_BLOCK]]:415; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[SIZE]], [[N_VEC]]416; CHECK-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]417; CHECK:       [[SCALAR_PH]]:418; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]419; CHECK-NEXT:    br label %[[LOOP:.*]]420; CHECK:       [[LOOP]]:421; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]422; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 [[IV]], !custom_md [[META2]]423; CHECK-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[IV]], !custom_md [[META2]]424; CHECK-NEXT:    [[T:%.*]] = trunc i64 [[IV]] to i32, !custom_md [[META3]]425; CHECK-NEXT:    store i32 [[T]], ptr [[ARRAYIDX_2]], align 4, !custom_md [[META2]]426; CHECK-NEXT:    store ptr [[ARRAYIDX_2]], ptr [[ARRAYIDX_1]], align 8, !custom_md [[META2]]427; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1, !custom_md [[META2]]428; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[SIZE]], !custom_md [[META2]]429; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT]], !llvm.loop [[LOOP13:![0-9]+]], !custom_md [[META2]]430; CHECK:       [[EXIT]]:431; CHECK-NEXT:    ret void432;433; INTERLEAVE-LABEL: define void @unknown_metadata(434; INTERLEAVE-SAME: ptr captures(none) [[A:%.*]], ptr noalias [[B:%.*]], i64 [[SIZE:%.*]]) {435; INTERLEAVE-NEXT:  [[ENTRY:.*]]:436; INTERLEAVE-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[SIZE]], 4437; INTERLEAVE-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]438; INTERLEAVE:       [[VECTOR_PH]]:439; INTERLEAVE-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[SIZE]], 4440; INTERLEAVE-NEXT:    [[N_VEC:%.*]] = sub i64 [[SIZE]], [[N_MOD_VF]]441; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]442; INTERLEAVE:       [[VECTOR_BODY]]:443; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]444; INTERLEAVE-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]445; INTERLEAVE-NEXT:    [[VEC_IND1:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], %[[VECTOR_BODY]] ]446; INTERLEAVE-NEXT:    [[STEP_ADD:%.*]] = add <2 x i64> [[VEC_IND]], splat (i64 2)447; INTERLEAVE-NEXT:    [[STEP_ADD3:%.*]] = add <2 x i32> [[VEC_IND1]], splat (i32 2)448; INTERLEAVE-NEXT:    [[TMP0:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 [[INDEX]], !custom_md [[META2:![0-9]+]]449; INTERLEAVE-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], <2 x i64> [[VEC_IND]]450; INTERLEAVE-NEXT:    [[TMP3:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0451; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], <2 x i64> [[STEP_ADD]]452; INTERLEAVE-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 2453; INTERLEAVE-NEXT:    store <2 x i32> [[VEC_IND1]], ptr [[TMP3]], align 4454; INTERLEAVE-NEXT:    store <2 x i32> [[STEP_ADD3]], ptr [[TMP5]], align 4455; INTERLEAVE-NEXT:    [[TMP7:%.*]] = getelementptr inbounds ptr, ptr [[TMP0]], i64 2456; INTERLEAVE-NEXT:    store <2 x ptr> [[TMP1]], ptr [[TMP0]], align 8457; INTERLEAVE-NEXT:    store <2 x ptr> [[TMP2]], ptr [[TMP7]], align 8458; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4459; INTERLEAVE-NEXT:    [[VEC_IND_NEXT]] = add <2 x i64> [[STEP_ADD]], splat (i64 2)460; INTERLEAVE-NEXT:    [[VEC_IND_NEXT2]] = add <2 x i32> [[STEP_ADD3]], splat (i32 2)461; INTERLEAVE-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]462; INTERLEAVE-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]463; INTERLEAVE:       [[MIDDLE_BLOCK]]:464; INTERLEAVE-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[SIZE]], [[N_VEC]]465; INTERLEAVE-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]466; INTERLEAVE:       [[SCALAR_PH]]:467; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]468; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]469; INTERLEAVE:       [[LOOP]]:470; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]471; INTERLEAVE-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 [[IV]], !custom_md [[META2]]472; INTERLEAVE-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[IV]], !custom_md [[META2]]473; INTERLEAVE-NEXT:    [[T:%.*]] = trunc i64 [[IV]] to i32, !custom_md [[META3]]474; INTERLEAVE-NEXT:    store i32 [[T]], ptr [[ARRAYIDX_2]], align 4, !custom_md [[META2]]475; INTERLEAVE-NEXT:    store ptr [[ARRAYIDX_2]], ptr [[ARRAYIDX_1]], align 8, !custom_md [[META2]]476; INTERLEAVE-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1, !custom_md [[META2]]477; INTERLEAVE-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[SIZE]], !custom_md [[META2]]478; INTERLEAVE-NEXT:    br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT]], !llvm.loop [[LOOP13:![0-9]+]], !custom_md [[META2]]479; INTERLEAVE:       [[EXIT]]:480; INTERLEAVE-NEXT:    ret void481;482entry:483  br label %loop484 485loop:486  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]487  %arrayidx.1 = getelementptr inbounds ptr, ptr %a, i64 %iv, !custom_md !2488  %arrayidx.2 = getelementptr inbounds i32, ptr %b, i64 %iv, !custom_md !2489  %t = trunc i64 %iv to i32, !custom_md !0490  store i32 %t, ptr %arrayidx.2, !custom_md !2491  store ptr %arrayidx.2, ptr %arrayidx.1, !custom_md !2492  %iv.next = add i64 %iv, 1, !custom_md !2493  %exitcond = icmp ne i64 %iv.next, %size, !custom_md !2494  br i1 %exitcond, label %loop, label %exit, !custom_md !2495 496exit:497  ret void498}499 500define void @noalias_metadata(ptr align 8 %dst, ptr align 8 %src) {501; CHECK-LABEL: define void @noalias_metadata(502; CHECK-SAME: ptr align 8 [[DST:%.*]], ptr align 8 [[SRC:%.*]]) {503; CHECK-NEXT:  [[ENTRY:.*]]:504; CHECK-NEXT:    [[SRC4:%.*]] = ptrtoint ptr [[SRC]] to i64505; CHECK-NEXT:    [[DST3:%.*]] = ptrtoint ptr [[DST]] to i64506; CHECK-NEXT:    [[SRC2:%.*]] = ptrtoint ptr [[SRC]] to i64507; CHECK-NEXT:    [[DST1:%.*]] = ptrtoint ptr [[DST]] to i64508; CHECK-NEXT:    [[TMP2:%.*]] = sub i64 [[DST3]], [[SRC4]]509; CHECK-NEXT:    [[TMP3:%.*]] = lshr i64 [[TMP2]], 3510; CHECK-NEXT:    [[TMP4:%.*]] = add nuw nsw i64 [[TMP3]], 1511; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP4]], 2512; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]513; CHECK:       [[VECTOR_MEMCHECK]]:514; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST]], i64 8515; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[DST1]], 8516; CHECK-NEXT:    [[TMP22:%.*]] = sub i64 [[TMP5]], [[SRC2]]517; CHECK-NEXT:    [[SCEVGEP5:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[TMP22]]518; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP5]]519; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[SRC]], [[SCEVGEP]]520; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]521; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]522; CHECK:       [[VECTOR_PH]]:523; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP4]], 2524; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP4]], [[N_MOD_VF]]525; CHECK-NEXT:    [[TMP23:%.*]] = mul i64 [[N_VEC]], 8526; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[TMP23]]527; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]528; CHECK:       [[VECTOR_BODY]]:529; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]530; CHECK-NEXT:    [[TMP26:%.*]] = mul i64 [[INDEX]], 8531; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[TMP26]]532; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x ptr>, ptr [[NEXT_GEP]], align 8, !alias.scope [[META14:![0-9]+]]533; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <2 x ptr> [[WIDE_LOAD]], i32 1534; CHECK-NEXT:    store ptr [[TMP7]], ptr [[DST]], align 8, !alias.scope [[META17:![0-9]+]], !noalias [[META19:![0-9]+]]535; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2536; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]537; CHECK-NEXT:    br i1 [[TMP28]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]538; CHECK:       [[MIDDLE_BLOCK]]:539; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP4]], [[N_VEC]]540; CHECK-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]541; CHECK:       [[SCALAR_PH]]:542; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi ptr [ [[TMP24]], %[[MIDDLE_BLOCK]] ], [ [[SRC]], %[[ENTRY]] ], [ [[SRC]], %[[VECTOR_MEMCHECK]] ]543; CHECK-NEXT:    br label %[[LOOP:.*]]544; CHECK:       [[LOOP]]:545; CHECK-NEXT:    [[PTR:%.*]] = phi ptr [ [[PTR_NEXT:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]546; CHECK-NEXT:    [[VAL:%.*]] = load ptr, ptr [[PTR]], align 8547; CHECK-NEXT:    store ptr [[VAL]], ptr [[DST]], align 8, !noalias [[META23:![0-9]+]]548; CHECK-NEXT:    [[PTR_NEXT]] = getelementptr inbounds i8, ptr [[PTR]], i64 8549; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr [[PTR]], [[DST]]550; CHECK-NEXT:    br i1 [[CMP]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP24:![0-9]+]]551; CHECK:       [[EXIT]]:552; CHECK-NEXT:    ret void553;554; INTERLEAVE-LABEL: define void @noalias_metadata(555; INTERLEAVE-SAME: ptr align 8 [[DST:%.*]], ptr align 8 [[SRC:%.*]]) {556; INTERLEAVE-NEXT:  [[ENTRY:.*]]:557; INTERLEAVE-NEXT:    [[SRC4:%.*]] = ptrtoint ptr [[SRC]] to i64558; INTERLEAVE-NEXT:    [[DST3:%.*]] = ptrtoint ptr [[DST]] to i64559; INTERLEAVE-NEXT:    [[SRC2:%.*]] = ptrtoint ptr [[SRC]] to i64560; INTERLEAVE-NEXT:    [[DST1:%.*]] = ptrtoint ptr [[DST]] to i64561; INTERLEAVE-NEXT:    [[TMP2:%.*]] = sub i64 [[DST3]], [[SRC4]]562; INTERLEAVE-NEXT:    [[TMP3:%.*]] = lshr i64 [[TMP2]], 3563; INTERLEAVE-NEXT:    [[TMP4:%.*]] = add nuw nsw i64 [[TMP3]], 1564; INTERLEAVE-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP4]], 4565; INTERLEAVE-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]566; INTERLEAVE:       [[VECTOR_MEMCHECK]]:567; INTERLEAVE-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST]], i64 8568; INTERLEAVE-NEXT:    [[TMP5:%.*]] = add i64 [[DST1]], 8569; INTERLEAVE-NEXT:    [[TMP22:%.*]] = sub i64 [[TMP5]], [[SRC2]]570; INTERLEAVE-NEXT:    [[SCEVGEP5:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[TMP22]]571; INTERLEAVE-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP5]]572; INTERLEAVE-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[SRC]], [[SCEVGEP]]573; INTERLEAVE-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]574; INTERLEAVE-NEXT:    br i1 [[FOUND_CONFLICT]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]575; INTERLEAVE:       [[VECTOR_PH]]:576; INTERLEAVE-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP4]], 4577; INTERLEAVE-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP4]], [[N_MOD_VF]]578; INTERLEAVE-NEXT:    [[TMP23:%.*]] = mul i64 [[N_VEC]], 8579; INTERLEAVE-NEXT:    [[TMP24:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[TMP23]]580; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]581; INTERLEAVE:       [[VECTOR_BODY]]:582; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]583; INTERLEAVE-NEXT:    [[TMP26:%.*]] = mul i64 [[INDEX]], 8584; INTERLEAVE-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 [[TMP26]]585; INTERLEAVE-NEXT:    [[TMP7:%.*]] = getelementptr ptr, ptr [[NEXT_GEP]], i64 2586; INTERLEAVE-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x ptr>, ptr [[TMP7]], align 8, !alias.scope [[META14:![0-9]+]]587; INTERLEAVE-NEXT:    [[TMP8:%.*]] = extractelement <2 x ptr> [[WIDE_LOAD]], i32 1588; INTERLEAVE-NEXT:    store ptr [[TMP8]], ptr [[DST]], align 8, !alias.scope [[META17:![0-9]+]], !noalias [[META19:![0-9]+]]589; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4590; INTERLEAVE-NEXT:    [[TMP28:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]591; INTERLEAVE-NEXT:    br i1 [[TMP28]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]592; INTERLEAVE:       [[MIDDLE_BLOCK]]:593; INTERLEAVE-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP4]], [[N_VEC]]594; INTERLEAVE-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]595; INTERLEAVE:       [[SCALAR_PH]]:596; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi ptr [ [[TMP24]], %[[MIDDLE_BLOCK]] ], [ [[SRC]], %[[ENTRY]] ], [ [[SRC]], %[[VECTOR_MEMCHECK]] ]597; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]598; INTERLEAVE:       [[LOOP]]:599; INTERLEAVE-NEXT:    [[PTR:%.*]] = phi ptr [ [[PTR_NEXT:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]600; INTERLEAVE-NEXT:    [[VAL:%.*]] = load ptr, ptr [[PTR]], align 8601; INTERLEAVE-NEXT:    store ptr [[VAL]], ptr [[DST]], align 8, !noalias [[META23:![0-9]+]]602; INTERLEAVE-NEXT:    [[PTR_NEXT]] = getelementptr inbounds i8, ptr [[PTR]], i64 8603; INTERLEAVE-NEXT:    [[CMP:%.*]] = icmp eq ptr [[PTR]], [[DST]]604; INTERLEAVE-NEXT:    br i1 [[CMP]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP24:![0-9]+]]605; INTERLEAVE:       [[EXIT]]:606; INTERLEAVE-NEXT:    ret void607;608entry:609  br label %loop610 611loop:612  %ptr = phi ptr [ %ptr.next, %loop ], [ %src, %entry ]613  %val = load ptr, ptr %ptr, align 8614  store ptr %val, ptr %dst, align 8, !noalias !4615  %ptr.next = getelementptr inbounds i8, ptr %ptr, i64 8616  %cmp = icmp eq ptr %ptr, %dst617  br i1 %cmp, label %exit, label %loop618 619exit:620  ret void621}622 623declare i64 @foo(i64)624declare double @bar(double)625 626declare <2 x i64> @foo_vector_fixed2_nomask(<2 x i64>)627declare <2 x double> @bar_vector_fixed2_nomask(<2 x double>)628 629attributes #0 = { nounwind "vector-function-abi-variant"="_ZGV_LLVM_N2v_foo(foo_vector_fixed2_nomask)" }630attributes #1 = { nounwind "vector-function-abi-variant"="_ZGV_LLVM_N2v_bar(bar_vector_fixed2_nomask)" }631 632!0 = !{ float 2.5 }633!1 = !{ i64 0, i64 2 }634!2 = !{!"Simple C/C++ TBAA"}635!3 = !{!"omnipotent char", !2, i64 0}636!4 = !{!5}637!5 = distinct !{!5, !6, !"g1"}638!6 = distinct !{!6, !"t2"}639 640;.641; CHECK: [[CHAR_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0, i64 0}642; CHECK: [[META1]] = !{!"omnipotent char", [[META2]]}643; CHECK: [[META2]] = !{!"Simple C/C++ TBAA"}644; CHECK: [[META3]] = !{float 2.500000e+00}645; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META5:![0-9]+]], [[META6:![0-9]+]]}646; CHECK: [[META5]] = !{!"llvm.loop.isvectorized", i32 1}647; CHECK: [[META6]] = !{!"llvm.loop.unroll.runtime.disable"}648; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META6]], [[META5]]}649; CHECK: [[LOOP8]] = distinct !{[[LOOP8]], [[META5]], [[META6]]}650; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META5]], [[META6]]}651; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META5]], [[META6]]}652; CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META5]], [[META6]]}653; CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META5]], [[META6]]}654; CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META6]], [[META5]]}655; CHECK: [[META14]] = !{[[META15:![0-9]+]]}656; CHECK: [[META15]] = distinct !{[[META15]], [[META16:![0-9]+]]}657; CHECK: [[META16]] = distinct !{[[META16]], !"LVerDomain"}658; CHECK: [[META17]] = !{[[META18:![0-9]+]]}659; CHECK: [[META18]] = distinct !{[[META18]], [[META16]]}660; CHECK: [[META19]] = !{[[META20:![0-9]+]], [[META15]]}661; CHECK: [[META20]] = distinct !{[[META20]], [[META21:![0-9]+]], !"g1"}662; CHECK: [[META21]] = distinct !{[[META21]], !"t2"}663; CHECK: [[LOOP22]] = distinct !{[[LOOP22]], [[META5]], [[META6]]}664; CHECK: [[META23]] = !{[[META20]]}665; CHECK: [[LOOP24]] = distinct !{[[LOOP24]], [[META5]]}666;.667; INTERLEAVE: [[CHAR_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0, i64 0}668; INTERLEAVE: [[META1]] = !{!"omnipotent char", [[META2]]}669; INTERLEAVE: [[META2]] = !{!"Simple C/C++ TBAA"}670; INTERLEAVE: [[META3]] = !{float 2.500000e+00}671; INTERLEAVE: [[LOOP4]] = distinct !{[[LOOP4]], [[META5:![0-9]+]], [[META6:![0-9]+]]}672; INTERLEAVE: [[META5]] = !{!"llvm.loop.isvectorized", i32 1}673; INTERLEAVE: [[META6]] = !{!"llvm.loop.unroll.runtime.disable"}674; INTERLEAVE: [[LOOP7]] = distinct !{[[LOOP7]], [[META6]], [[META5]]}675; INTERLEAVE: [[LOOP8]] = distinct !{[[LOOP8]], [[META5]], [[META6]]}676; INTERLEAVE: [[LOOP9]] = distinct !{[[LOOP9]], [[META5]], [[META6]]}677; INTERLEAVE: [[LOOP10]] = distinct !{[[LOOP10]], [[META5]], [[META6]]}678; INTERLEAVE: [[LOOP11]] = distinct !{[[LOOP11]], [[META5]], [[META6]]}679; INTERLEAVE: [[LOOP12]] = distinct !{[[LOOP12]], [[META5]], [[META6]]}680; INTERLEAVE: [[LOOP13]] = distinct !{[[LOOP13]], [[META6]], [[META5]]}681; INTERLEAVE: [[META14]] = !{[[META15:![0-9]+]]}682; INTERLEAVE: [[META15]] = distinct !{[[META15]], [[META16:![0-9]+]]}683; INTERLEAVE: [[META16]] = distinct !{[[META16]], !"LVerDomain"}684; INTERLEAVE: [[META17]] = !{[[META18:![0-9]+]]}685; INTERLEAVE: [[META18]] = distinct !{[[META18]], [[META16]]}686; INTERLEAVE: [[META19]] = !{[[META20:![0-9]+]], [[META15]]}687; INTERLEAVE: [[META20]] = distinct !{[[META20]], [[META21:![0-9]+]], !"g1"}688; INTERLEAVE: [[META21]] = distinct !{[[META21]], !"t2"}689; INTERLEAVE: [[LOOP22]] = distinct !{[[LOOP22]], [[META5]], [[META6]]}690; INTERLEAVE: [[META23]] = !{[[META20]]}691; INTERLEAVE: [[LOOP24]] = distinct !{[[LOOP24]], [[META5]]}692;.693