brintos

brintos / llvm-project-archived public Read only

0
0
Text · 55.9 KiB · df648c9 Raw
966 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=loop-vectorize,dce,instcombine,simplifycfg -S -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp,mve4beat -simplifycfg-require-and-preserve-domtree=1 -tail-predication=disabled < %s | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"5target triple = "thumbv8.1m.main-none-none-eabi"6 7define hidden void @pointer_phi_v4i32_add1(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %s, i32%y) {8; CHECK-LABEL: @pointer_phi_v4i32_add1(9; CHECK-NEXT:  entry:10; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 011; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer12; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]13; CHECK:       vector.body:14; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]15; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 216; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 [[OFFSET_IDX]]17; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 218; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 [[OFFSET_IDX4]]19; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[NEXT_GEP]], align 420; CHECK-NEXT:    [[TMP0:%.*]] = add nsw <4 x i32> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]21; CHECK-NEXT:    store <4 x i32> [[TMP0]], ptr [[NEXT_GEP5]], align 422; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 423; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], 100024; CHECK-NEXT:    br i1 [[TMP1]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]25; CHECK:       end:26; CHECK-NEXT:    ret void27;28entry:29  br label %for.body30for.body:31  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]32  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]33  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]34  %0 = load i32, ptr %A.addr.09, align 435  %add.ptr = getelementptr inbounds i32, ptr %A.addr.09, i32 136  %add = add nsw i32 %0, %y37  store i32 %add, ptr %B.addr.07, align 438  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.07, i32 139  %inc = add nuw nsw i32 %i.08, 140  %exitcond = icmp eq i32 %inc, 100041  br i1 %exitcond, label %end, label %for.body42end:43  ret void44}45 46define hidden void @pointer_phi_v4i32_add2(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {47; CHECK-LABEL: @pointer_phi_v4i32_add2(48; CHECK-NEXT:  entry:49; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 796850; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 398451; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 052; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer53; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]54; CHECK:       vector.body:55; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]56; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 357; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i32 [[OFFSET_IDX]]58; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 259; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX4]]60; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i32>, ptr [[NEXT_GEP]], align 461; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>62; CHECK-NEXT:    [[TMP0:%.*]] = add nsw <4 x i32> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]63; CHECK-NEXT:    store <4 x i32> [[TMP0]], ptr [[NEXT_GEP5]], align 464; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 465; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 99666; CHECK-NEXT:    br i1 [[TMP3]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]67; CHECK:       for.body:68; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]69; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]70; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]71; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A_ADDR_09]], align 472; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_09]], i32 873; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], [[Y]]74; CHECK-NEXT:    store i32 [[ADD]], ptr [[B_ADDR_07]], align 475; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_07]], i32 476; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 177; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 100078; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]79; CHECK:       end:80; CHECK-NEXT:    ret void81;82entry:83  br label %for.body84for.body:85  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]86  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]87  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]88  %0 = load i32, ptr %A.addr.09, align 489  %add.ptr = getelementptr inbounds i32, ptr %A.addr.09, i32 290  %add = add nsw i32 %0, %y91  store i32 %add, ptr %B.addr.07, align 492  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.07, i32 193  %inc = add nuw nsw i32 %i.08, 194  %exitcond = icmp eq i32 %inc, 100095  br i1 %exitcond, label %end, label %for.body96end:97  ret void98}99 100define hidden void @pointer_phi_v4i32_add3(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {101; CHECK-LABEL: @pointer_phi_v4i32_add3(102; CHECK-NEXT:  entry:103; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 11952104; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 3984105; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0106; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer107; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]108; CHECK:       vector.body:109; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]110; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi ptr [ [[A]], [[ENTRY]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]111; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[POINTER_PHI]], <4 x i32> <i32 0, i32 12, i32 24, i32 36>112; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 2113; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX]]114; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP0]], <4 x i1> splat (i1 true), <4 x i32> poison)115; CHECK-NEXT:    [[TMP1:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]116; CHECK-NEXT:    store <4 x i32> [[TMP1]], ptr [[NEXT_GEP]], align 4117; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4118; CHECK-NEXT:    [[PTR_IND]] = getelementptr i8, ptr [[POINTER_PHI]], i32 48119; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 996120; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]121; CHECK:       for.body:122; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]123; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]124; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]125; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR_09]], align 4126; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_09]], i32 12127; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], [[Y]]128; CHECK-NEXT:    store i32 [[ADD]], ptr [[B_ADDR_07]], align 4129; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_07]], i32 4130; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1131; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000132; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]133; CHECK:       end:134; CHECK-NEXT:    ret void135;136entry:137  br label %for.body138for.body:139  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]140  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]141  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]142  %0 = load i32, ptr %A.addr.09, align 4143  %add.ptr = getelementptr inbounds i32, ptr %A.addr.09, i32 3144  %add = add nsw i32 %0, %y145  store i32 %add, ptr %B.addr.07, align 4146  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.07, i32 1147  %inc = add nuw nsw i32 %i.08, 1148  %exitcond = icmp eq i32 %inc, 1000149  br i1 %exitcond, label %end, label %for.body150end:151  ret void152}153 154define hidden void @pointer_phi_v8i16_add1(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {155; CHECK-LABEL: @pointer_phi_v8i16_add1(156; CHECK-NEXT:  entry:157; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i16158; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[TMP0]], i64 0159; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i16> [[BROADCAST_SPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer160; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]161; CHECK:       vector.body:162; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]163; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 1164; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 [[OFFSET_IDX]]165; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 1166; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 [[OFFSET_IDX4]]167; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <8 x i16>, ptr [[NEXT_GEP]], align 2168; CHECK-NEXT:    [[TMP1:%.*]] = add <8 x i16> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]169; CHECK-NEXT:    store <8 x i16> [[TMP1]], ptr [[NEXT_GEP5]], align 2170; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8171; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000172; CHECK-NEXT:    br i1 [[TMP2]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]173; CHECK:       end:174; CHECK-NEXT:    ret void175;176entry:177  %0 = trunc i32 %y to i16178  br label %for.body179for.body:                                         ; preds = %for.body, %for.body.lr.ph180  %A.addr.011 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]181  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]182  %B.addr.09 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]183  %l1 = load i16, ptr %A.addr.011, align 2184  %add.ptr = getelementptr inbounds i16, ptr %A.addr.011, i32 1185  %conv1 = add i16 %l1, %0186  store i16 %conv1, ptr %B.addr.09, align 2187  %incdec.ptr = getelementptr inbounds i16, ptr %B.addr.09, i32 1188  %inc = add nuw nsw i32 %i.010, 1189  %exitcond = icmp eq i32 %inc, 1000190  br i1 %exitcond, label %end, label %for.body191end:192  ret void193}194 195define hidden void @pointer_phi_v8i16_add2(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {196; CHECK-LABEL: @pointer_phi_v8i16_add2(197; CHECK-NEXT:  entry:198; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i16199; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 3968200; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 1984201; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[TMP0]], i64 0202; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i16> [[BROADCAST_SPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer203; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]204; CHECK:       vector.body:205; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]206; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 2207; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i32 [[OFFSET_IDX]]208; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 1209; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX4]]210; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <16 x i16>, ptr [[NEXT_GEP]], align 2211; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <16 x i16> [[WIDE_VEC]], <16 x i16> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>212; CHECK-NEXT:    [[TMP1:%.*]] = add <8 x i16> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]213; CHECK-NEXT:    store <8 x i16> [[TMP1]], ptr [[NEXT_GEP5]], align 2214; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8215; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992216; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]217; CHECK:       for.body:218; CHECK-NEXT:    [[A_ADDR_011:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]219; CHECK-NEXT:    [[I_010:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]220; CHECK-NEXT:    [[B_ADDR_09:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]221; CHECK-NEXT:    [[L1:%.*]] = load i16, ptr [[A_ADDR_011]], align 2222; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_011]], i32 4223; CHECK-NEXT:    [[CONV1:%.*]] = add i16 [[L1]], [[TMP0]]224; CHECK-NEXT:    store i16 [[CONV1]], ptr [[B_ADDR_09]], align 2225; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_09]], i32 2226; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_010]], 1227; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000228; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]229; CHECK:       end:230; CHECK-NEXT:    ret void231;232entry:233  %0 = trunc i32 %y to i16234  br label %for.body235for.body:                                         ; preds = %for.body, %for.body.lr.ph236  %A.addr.011 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]237  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]238  %B.addr.09 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]239  %l1 = load i16, ptr %A.addr.011, align 2240  %add.ptr = getelementptr inbounds i16, ptr %A.addr.011, i32 2241  %conv1 = add i16 %l1, %0242  store i16 %conv1, ptr %B.addr.09, align 2243  %incdec.ptr = getelementptr inbounds i16, ptr %B.addr.09, i32 1244  %inc = add nuw nsw i32 %i.010, 1245  %exitcond = icmp eq i32 %inc, 1000246  br i1 %exitcond, label %end, label %for.body247end:248  ret void249}250 251define hidden void @pointer_phi_v8i16_add3(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {252; CHECK-LABEL: @pointer_phi_v8i16_add3(253; CHECK-NEXT:  entry:254; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i16255; CHECK-NEXT:    br label [[FOR_BODY:%.*]]256; CHECK:       for.body:257; CHECK-NEXT:    [[A_ADDR_011:%.*]] = phi ptr [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[ADD_PTR:%.*]], [[FOR_BODY]] ]258; CHECK-NEXT:    [[I_010:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_BODY]] ]259; CHECK-NEXT:    [[B_ADDR_09:%.*]] = phi ptr [ [[B:%.*]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ]260; CHECK-NEXT:    [[L1:%.*]] = load i16, ptr [[A_ADDR_011]], align 2261; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_011]], i32 6262; CHECK-NEXT:    [[CONV1:%.*]] = add i16 [[L1]], [[TMP0]]263; CHECK-NEXT:    store i16 [[CONV1]], ptr [[B_ADDR_09]], align 2264; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_09]], i32 2265; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_010]], 1266; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000267; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]]268; CHECK:       end:269; CHECK-NEXT:    ret void270;271entry:272  %0 = trunc i32 %y to i16273  br label %for.body274for.body:                                         ; preds = %for.body, %for.body.lr.ph275  %A.addr.011 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]276  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]277  %B.addr.09 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]278  %l1 = load i16, ptr %A.addr.011, align 2279  %add.ptr = getelementptr inbounds i16, ptr %A.addr.011, i32 3280  %conv1 = add i16 %l1, %0281  store i16 %conv1, ptr %B.addr.09, align 2282  %incdec.ptr = getelementptr inbounds i16, ptr %B.addr.09, i32 1283  %inc = add nuw nsw i32 %i.010, 1284  %exitcond = icmp eq i32 %inc, 1000285  br i1 %exitcond, label %end, label %for.body286end:287  ret void288}289 290define hidden void @pointer_phi_v16i8_add1(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {291; CHECK-LABEL: @pointer_phi_v16i8_add1(292; CHECK-NEXT:  entry:293; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i8294; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 992295; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 992296; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[TMP0]], i64 0297; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i8> [[BROADCAST_SPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer298; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]299; CHECK:       vector.body:300; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]301; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i32 [[INDEX]]302; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i8, ptr [[B]], i32 [[INDEX]]303; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[NEXT_GEP]], align 1304; CHECK-NEXT:    [[TMP1:%.*]] = add <16 x i8> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]305; CHECK-NEXT:    store <16 x i8> [[TMP1]], ptr [[NEXT_GEP4]], align 1306; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16307; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992308; CHECK-NEXT:    br i1 [[TMP2]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]309; CHECK:       for.body:310; CHECK-NEXT:    [[A_ADDR_010:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]311; CHECK-NEXT:    [[I_09:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]312; CHECK-NEXT:    [[B_ADDR_08:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]313; CHECK-NEXT:    [[TMP3:%.*]] = load i8, ptr [[A_ADDR_010]], align 1314; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_010]], i32 1315; CHECK-NEXT:    [[CONV1:%.*]] = add i8 [[TMP3]], [[TMP0]]316; CHECK-NEXT:    store i8 [[CONV1]], ptr [[B_ADDR_08]], align 1317; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_08]], i32 1318; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_09]], 1319; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000320; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]321; CHECK:       end:322; CHECK-NEXT:    ret void323;324entry:325  %0 = trunc i32 %y to i8326  br label %for.body327 328for.body:329  %A.addr.010 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]330  %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ]331  %B.addr.08 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]332  %1 = load i8, ptr %A.addr.010, align 1333  %add.ptr = getelementptr inbounds i8, ptr %A.addr.010, i32 1334  %conv1 = add i8 %1, %0335  store i8 %conv1, ptr %B.addr.08, align 1336  %incdec.ptr = getelementptr inbounds i8, ptr %B.addr.08, i32 1337  %inc = add nuw nsw i32 %i.09, 1338  %exitcond = icmp eq i32 %inc, 1000339  br i1 %exitcond, label %end, label %for.body340end:341  ret void342}343 344define hidden void @pointer_phi_v16i8_add2(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {345; CHECK-LABEL: @pointer_phi_v16i8_add2(346; CHECK-NEXT:  entry:347; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i8348; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 1984349; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 992350; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[TMP0]], i64 0351; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i8> [[BROADCAST_SPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer352; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]353; CHECK:       vector.body:354; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]355; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 1356; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i32 [[OFFSET_IDX]]357; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i8, ptr [[B]], i32 [[INDEX]]358; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <32 x i8>, ptr [[NEXT_GEP]], align 1359; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <32 x i8> [[WIDE_VEC]], <32 x i8> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>360; CHECK-NEXT:    [[TMP1:%.*]] = add <16 x i8> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]361; CHECK-NEXT:    store <16 x i8> [[TMP1]], ptr [[NEXT_GEP4]], align 1362; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16363; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992364; CHECK-NEXT:    br i1 [[TMP2]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]365; CHECK:       for.body:366; CHECK-NEXT:    [[A_ADDR_010:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]367; CHECK-NEXT:    [[I_09:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]368; CHECK-NEXT:    [[B_ADDR_08:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]369; CHECK-NEXT:    [[TMP3:%.*]] = load i8, ptr [[A_ADDR_010]], align 1370; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_010]], i32 2371; CHECK-NEXT:    [[CONV1:%.*]] = add i8 [[TMP3]], [[TMP0]]372; CHECK-NEXT:    store i8 [[CONV1]], ptr [[B_ADDR_08]], align 1373; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_08]], i32 1374; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_09]], 1375; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000376; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]377; CHECK:       end:378; CHECK-NEXT:    ret void379;380entry:381  %0 = trunc i32 %y to i8382  br label %for.body383 384for.body:385  %A.addr.010 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]386  %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ]387  %B.addr.08 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]388  %1 = load i8, ptr %A.addr.010, align 1389  %add.ptr = getelementptr inbounds i8, ptr %A.addr.010, i32 2390  %conv1 = add i8 %1, %0391  store i8 %conv1, ptr %B.addr.08, align 1392  %incdec.ptr = getelementptr inbounds i8, ptr %B.addr.08, i32 1393  %inc = add nuw nsw i32 %i.09, 1394  %exitcond = icmp eq i32 %inc, 1000395  br i1 %exitcond, label %end, label %for.body396end:397  ret void398}399 400define hidden void @pointer_phi_v16i8_add3(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {401; CHECK-LABEL: @pointer_phi_v16i8_add3(402; CHECK-NEXT:  entry:403; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i8404; CHECK-NEXT:    br label [[FOR_BODY:%.*]]405; CHECK:       for.body:406; CHECK-NEXT:    [[A_ADDR_010:%.*]] = phi ptr [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[ADD_PTR:%.*]], [[FOR_BODY]] ]407; CHECK-NEXT:    [[I_09:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_BODY]] ]408; CHECK-NEXT:    [[B_ADDR_08:%.*]] = phi ptr [ [[B:%.*]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ]409; CHECK-NEXT:    [[TMP1:%.*]] = load i8, ptr [[A_ADDR_010]], align 1410; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_010]], i32 3411; CHECK-NEXT:    [[CONV1:%.*]] = add i8 [[TMP1]], [[TMP0]]412; CHECK-NEXT:    store i8 [[CONV1]], ptr [[B_ADDR_08]], align 1413; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_08]], i32 1414; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_09]], 1415; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000416; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]]417; CHECK:       end:418; CHECK-NEXT:    ret void419;420entry:421  %0 = trunc i32 %y to i8422  br label %for.body423 424for.body:425  %A.addr.010 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]426  %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ]427  %B.addr.08 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]428  %1 = load i8, ptr %A.addr.010, align 1429  %add.ptr = getelementptr inbounds i8, ptr %A.addr.010, i32 3430  %conv1 = add i8 %1, %0431  store i8 %conv1, ptr %B.addr.08, align 1432  %incdec.ptr = getelementptr inbounds i8, ptr %B.addr.08, i32 1433  %inc = add nuw nsw i32 %i.09, 1434  %exitcond = icmp eq i32 %inc, 1000435  br i1 %exitcond, label %end, label %for.body436end:437  ret void438}439 440define hidden void @pointer_phi_v4f32_add1(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, float %y) {441; CHECK-LABEL: @pointer_phi_v4f32_add1(442; CHECK-NEXT:  entry:443; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[Y:%.*]], i64 0444; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer445; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]446; CHECK:       vector.body:447; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]448; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 2449; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 [[OFFSET_IDX]]450; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 2451; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 [[OFFSET_IDX4]]452; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, ptr [[NEXT_GEP]], align 4453; CHECK-NEXT:    [[TMP0:%.*]] = fadd fast <4 x float> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]454; CHECK-NEXT:    store <4 x float> [[TMP0]], ptr [[NEXT_GEP5]], align 4455; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4456; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000457; CHECK-NEXT:    br i1 [[TMP1]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]458; CHECK:       end:459; CHECK-NEXT:    ret void460;461entry:462  br label %for.body463for.body:464  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]465  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]466  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]467  %0 = load float, ptr %A.addr.09, align 4468  %add.ptr = getelementptr inbounds float, ptr %A.addr.09, i32 1469  %add = fadd fast float %0, %y470  store float %add, ptr %B.addr.07, align 4471  %incdec.ptr = getelementptr inbounds float, ptr %B.addr.07, i32 1472  %inc = add nuw nsw i32 %i.08, 1473  %exitcond = icmp eq i32 %inc, 1000474  br i1 %exitcond, label %end, label %for.body475end:476  ret void477}478 479define hidden void @pointer_phi_v4f32_add2(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, float %y) {480; CHECK-LABEL: @pointer_phi_v4f32_add2(481; CHECK-NEXT:  entry:482; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 7968483; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 3984484; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[Y:%.*]], i64 0485; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer486; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]487; CHECK:       vector.body:488; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]489; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 3490; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i32 [[OFFSET_IDX]]491; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 2492; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX4]]493; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <8 x float>, ptr [[NEXT_GEP]], align 4494; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <8 x float> [[WIDE_VEC]], <8 x float> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>495; CHECK-NEXT:    [[TMP0:%.*]] = fadd fast <4 x float> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]496; CHECK-NEXT:    store <4 x float> [[TMP0]], ptr [[NEXT_GEP5]], align 4497; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4498; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 996499; CHECK-NEXT:    br i1 [[TMP3]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]500; CHECK:       for.body:501; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]502; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]503; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]504; CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[A_ADDR_09]], align 4505; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_09]], i32 8506; CHECK-NEXT:    [[ADD:%.*]] = fadd fast float [[TMP2]], [[Y]]507; CHECK-NEXT:    store float [[ADD]], ptr [[B_ADDR_07]], align 4508; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_07]], i32 4509; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1510; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000511; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]512; CHECK:       end:513; CHECK-NEXT:    ret void514;515entry:516  br label %for.body517for.body:518  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]519  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]520  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]521  %0 = load float, ptr %A.addr.09, align 4522  %add.ptr = getelementptr inbounds float, ptr %A.addr.09, i32 2523  %add = fadd fast float %0, %y524  store float %add, ptr %B.addr.07, align 4525  %incdec.ptr = getelementptr inbounds float, ptr %B.addr.07, i32 1526  %inc = add nuw nsw i32 %i.08, 1527  %exitcond = icmp eq i32 %inc, 1000528  br i1 %exitcond, label %end, label %for.body529end:530  ret void531}532 533define hidden void @pointer_phi_v4f32_add3(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, float %y) {534; CHECK-LABEL: @pointer_phi_v4f32_add3(535; CHECK-NEXT:  entry:536; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 11952537; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 3984538; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[Y:%.*]], i64 0539; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer540; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]541; CHECK:       vector.body:542; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]543; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi ptr [ [[A]], [[ENTRY]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]544; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[POINTER_PHI]], <4 x i32> <i32 0, i32 12, i32 24, i32 36>545; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 2546; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX]]547; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> align 4 [[TMP0]], <4 x i1> splat (i1 true), <4 x float> poison)548; CHECK-NEXT:    [[TMP1:%.*]] = fadd fast <4 x float> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]549; CHECK-NEXT:    store <4 x float> [[TMP1]], ptr [[NEXT_GEP]], align 4550; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4551; CHECK-NEXT:    [[PTR_IND]] = getelementptr i8, ptr [[POINTER_PHI]], i32 48552; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 996553; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]554; CHECK:       for.body:555; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]556; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]557; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]558; CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[A_ADDR_09]], align 4559; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_09]], i32 12560; CHECK-NEXT:    [[ADD:%.*]] = fadd fast float [[TMP3]], [[Y]]561; CHECK-NEXT:    store float [[ADD]], ptr [[B_ADDR_07]], align 4562; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_07]], i32 4563; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1564; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000565; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]566; CHECK:       end:567; CHECK-NEXT:    ret void568;569entry:570  br label %for.body571for.body:572  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]573  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]574  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]575  %0 = load float, ptr %A.addr.09, align 4576  %add.ptr = getelementptr inbounds float, ptr %A.addr.09, i32 3577  %add = fadd fast float %0, %y578  store float %add, ptr %B.addr.07, align 4579  %incdec.ptr = getelementptr inbounds float, ptr %B.addr.07, i32 1580  %inc = add nuw nsw i32 %i.08, 1581  %exitcond = icmp eq i32 %inc, 1000582  br i1 %exitcond, label %end, label %for.body583end:584  ret void585}586 587define hidden void @pointer_phi_v4half_add1(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, half %y) {588; CHECK-LABEL: @pointer_phi_v4half_add1(589; CHECK-NEXT:  entry:590; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[Y:%.*]], i64 0591; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x half> [[BROADCAST_SPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer592; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]593; CHECK:       vector.body:594; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]595; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 1596; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 [[OFFSET_IDX]]597; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 1598; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 [[OFFSET_IDX4]]599; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <8 x half>, ptr [[NEXT_GEP]], align 4600; CHECK-NEXT:    [[TMP0:%.*]] = fadd fast <8 x half> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]601; CHECK-NEXT:    store <8 x half> [[TMP0]], ptr [[NEXT_GEP5]], align 4602; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8603; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000604; CHECK-NEXT:    br i1 [[TMP1]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]605; CHECK:       end:606; CHECK-NEXT:    ret void607;608entry:609  br label %for.body610for.body:611  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]612  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]613  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]614  %0 = load half, ptr %A.addr.09, align 4615  %add.ptr = getelementptr inbounds half, ptr %A.addr.09, i32 1616  %add = fadd fast half %0, %y617  store half %add, ptr %B.addr.07, align 4618  %incdec.ptr = getelementptr inbounds half, ptr %B.addr.07, i32 1619  %inc = add nuw nsw i32 %i.08, 1620  %exitcond = icmp eq i32 %inc, 1000621  br i1 %exitcond, label %end, label %for.body622end:623  ret void624}625 626define hidden void @pointer_phi_v4half_add2(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, half %y) {627; CHECK-LABEL: @pointer_phi_v4half_add2(628; CHECK-NEXT:  entry:629; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 3968630; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 1984631; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[Y:%.*]], i64 0632; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x half> [[BROADCAST_SPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer633; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]634; CHECK:       vector.body:635; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]636; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 2637; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i32 [[OFFSET_IDX]]638; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 1639; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX4]]640; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <16 x half>, ptr [[NEXT_GEP]], align 4641; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <16 x half> [[WIDE_VEC]], <16 x half> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>642; CHECK-NEXT:    [[TMP0:%.*]] = fadd fast <8 x half> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]643; CHECK-NEXT:    store <8 x half> [[TMP0]], ptr [[NEXT_GEP5]], align 4644; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8645; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992646; CHECK-NEXT:    br i1 [[TMP3]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]647; CHECK:       for.body:648; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]649; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]650; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]651; CHECK-NEXT:    [[TMP2:%.*]] = load half, ptr [[A_ADDR_09]], align 4652; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_09]], i32 4653; CHECK-NEXT:    [[ADD:%.*]] = fadd fast half [[TMP2]], [[Y]]654; CHECK-NEXT:    store half [[ADD]], ptr [[B_ADDR_07]], align 4655; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_07]], i32 2656; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1657; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000658; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]659; CHECK:       end:660; CHECK-NEXT:    ret void661;662entry:663  br label %for.body664for.body:665  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]666  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]667  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]668  %0 = load half, ptr %A.addr.09, align 4669  %add.ptr = getelementptr inbounds half, ptr %A.addr.09, i32 2670  %add = fadd fast half %0, %y671  store half %add, ptr %B.addr.07, align 4672  %incdec.ptr = getelementptr inbounds half, ptr %B.addr.07, i32 1673  %inc = add nuw nsw i32 %i.08, 1674  %exitcond = icmp eq i32 %inc, 1000675  br i1 %exitcond, label %end, label %for.body676end:677  ret void678}679 680define hidden void @pointer_phi_v4half_add3(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, half %y) {681; CHECK-LABEL: @pointer_phi_v4half_add3(682; CHECK-NEXT:  entry:683; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 5952684; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 1984685; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[Y:%.*]], i64 0686; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x half> [[BROADCAST_SPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer687; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]688; CHECK:       vector.body:689; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]690; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = mul i32 [[INDEX]], 6691; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[A]], i32 [[OFFSET_IDX]]692; CHECK-NEXT:    [[OFFSET_IDX4:%.*]] = shl i32 [[INDEX]], 1693; CHECK-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX4]]694; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <24 x half>, ptr [[NEXT_GEP]], align 4695; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <24 x half> [[WIDE_VEC]], <24 x half> poison, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>696; CHECK-NEXT:    [[TMP0:%.*]] = fadd fast <8 x half> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]697; CHECK-NEXT:    store <8 x half> [[TMP0]], ptr [[NEXT_GEP5]], align 4698; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8699; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992700; CHECK-NEXT:    br i1 [[TMP3]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]701; CHECK:       for.body:702; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]703; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]704; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]705; CHECK-NEXT:    [[TMP2:%.*]] = load half, ptr [[A_ADDR_09]], align 4706; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_09]], i32 6707; CHECK-NEXT:    [[ADD:%.*]] = fadd fast half [[TMP2]], [[Y]]708; CHECK-NEXT:    store half [[ADD]], ptr [[B_ADDR_07]], align 4709; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_07]], i32 2710; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1711; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000712; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]713; CHECK:       end:714; CHECK-NEXT:    ret void715;716entry:717  br label %for.body718for.body:719  %A.addr.09 = phi ptr [ %add.ptr, %for.body ], [ %A, %entry ]720  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]721  %B.addr.07 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %entry ]722  %0 = load half, ptr %A.addr.09, align 4723  %add.ptr = getelementptr inbounds half, ptr %A.addr.09, i32 3724  %add = fadd fast half %0, %y725  store half %add, ptr %B.addr.07, align 4726  %incdec.ptr = getelementptr inbounds half, ptr %B.addr.07, i32 1727  %inc = add nuw nsw i32 %i.08, 1728  %exitcond = icmp eq i32 %inc, 1000729  br i1 %exitcond, label %end, label %for.body730end:731  ret void732}733 734!0 = distinct !{!0, !1}735!1 = !{!"llvm.loop.interleave.count", i32 2}736 737define hidden void @pointer_phi_v4i32_uf2(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %n, i32 %y) {738; CHECK-LABEL: @pointer_phi_v4i32_uf2(739; CHECK-NEXT:  entry:740; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 239808741; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 39968742; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0743; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer744; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]745; CHECK:       vector.body:746; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]747; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi ptr [ [[A]], [[ENTRY]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]748; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[POINTER_PHI]], <4 x i32> <i32 0, i32 24, i32 48, i32 72>749; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, <4 x ptr> [[TMP0]], i32 96750; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 2751; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX]]752; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP0]], <4 x i1> splat (i1 true), <4 x i32> poison)753; CHECK-NEXT:    [[WIDE_MASKED_GATHER5:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP1]], <4 x i1> splat (i1 true), <4 x i32> poison)754; CHECK-NEXT:    [[TMP2:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]755; CHECK-NEXT:    [[TMP3:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER5]], [[BROADCAST_SPLAT]]756; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i32 16757; CHECK-NEXT:    store <4 x i32> [[TMP2]], ptr [[NEXT_GEP]], align 4758; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[TMP4]], align 4759; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8760; CHECK-NEXT:    [[PTR_IND]] = getelementptr i8, ptr [[POINTER_PHI]], i32 192761; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], 9992762; CHECK-NEXT:    br i1 [[TMP5]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]763; CHECK:       for.cond.cleanup:764; CHECK-NEXT:    ret void765; CHECK:       for.body:766; CHECK-NEXT:    [[A_ADDR_08:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]767; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 9992, [[VECTOR_BODY]] ]768; CHECK-NEXT:    [[B_ADDR_06:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]769; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[A_ADDR_08]], align 4770; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_08]], i32 24771; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], [[Y]]772; CHECK-NEXT:    store i32 [[ADD]], ptr [[B_ADDR_06]], align 4773; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_06]], i32 4774; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 1775; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 10000776; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]777;778 779entry:780  br label %for.body781 782for.cond.cleanup:783  ret void784 785for.body:786  %A.addr.08 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]787  %i.07 = phi i32 [ 0, %entry ], [ %inc, %for.body ]788  %B.addr.06 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]789  %0 = load i32, ptr %A.addr.08, align 4790  %add.ptr = getelementptr inbounds i32, ptr %A.addr.08, i32 6791  %add = add nsw i32 %0, %y792  store i32 %add, ptr %B.addr.06, align 4793  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.06, i32 1794  %inc = add nuw nsw i32 %i.07, 1795  %exitcond = icmp eq i32 %inc, 10000796  br i1 %exitcond, label %for.cond.cleanup, label %for.body, !llvm.loop !0797}798 799!2 = distinct !{!2, !3}800!3 = !{!"llvm.loop.interleave.count", i32 4}801 802define hidden void @pointer_phi_v4i32_uf4(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %n, i32 %y) {803; CHECK-LABEL: @pointer_phi_v4i32_uf4(804; CHECK-NEXT:  entry:805; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 239616806; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr [[B:%.*]], i32 39936807; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0808; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer809; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]810; CHECK:       vector.body:811; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]812; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi ptr [ [[A]], [[ENTRY]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]813; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[POINTER_PHI]], <4 x i32> <i32 0, i32 24, i32 48, i32 72>814; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, <4 x ptr> [[TMP0]], i32 96815; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i8, <4 x ptr> [[TMP0]], i32 192816; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i8, <4 x ptr> [[TMP0]], i32 288817; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = shl i32 [[INDEX]], 2818; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[B]], i32 [[OFFSET_IDX]]819; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP0]], <4 x i1> splat (i1 true), <4 x i32> poison)820; CHECK-NEXT:    [[WIDE_MASKED_GATHER7:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP1]], <4 x i1> splat (i1 true), <4 x i32> poison)821; CHECK-NEXT:    [[WIDE_MASKED_GATHER8:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP2]], <4 x i1> splat (i1 true), <4 x i32> poison)822; CHECK-NEXT:    [[WIDE_MASKED_GATHER9:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP3]], <4 x i1> splat (i1 true), <4 x i32> poison)823; CHECK-NEXT:    [[TMP4:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]824; CHECK-NEXT:    [[TMP5:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER7]], [[BROADCAST_SPLAT]]825; CHECK-NEXT:    [[TMP6:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER8]], [[BROADCAST_SPLAT]]826; CHECK-NEXT:    [[TMP7:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER9]], [[BROADCAST_SPLAT]]827; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i32 16828; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i32 32829; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i32 48830; CHECK-NEXT:    store <4 x i32> [[TMP4]], ptr [[NEXT_GEP]], align 4831; CHECK-NEXT:    store <4 x i32> [[TMP5]], ptr [[TMP8]], align 4832; CHECK-NEXT:    store <4 x i32> [[TMP6]], ptr [[TMP9]], align 4833; CHECK-NEXT:    store <4 x i32> [[TMP7]], ptr [[TMP10]], align 4834; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16835; CHECK-NEXT:    [[PTR_IND]] = getelementptr i8, ptr [[POINTER_PHI]], i32 384836; CHECK-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[INDEX_NEXT]], 9984837; CHECK-NEXT:    br i1 [[TMP11]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]838; CHECK:       for.cond.cleanup:839; CHECK-NEXT:    ret void840; CHECK:       for.body:841; CHECK-NEXT:    [[A_ADDR_08:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]842; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 9984, [[VECTOR_BODY]] ]843; CHECK-NEXT:    [[B_ADDR_06:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]844; CHECK-NEXT:    [[TMP12:%.*]] = load i32, ptr [[A_ADDR_08]], align 4845; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds nuw i8, ptr [[A_ADDR_08]], i32 24846; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[Y]]847; CHECK-NEXT:    store i32 [[ADD]], ptr [[B_ADDR_06]], align 4848; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[B_ADDR_06]], i32 4849; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 1850; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 10000851; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP27:![0-9]+]]852;853entry:854  br label %for.body855 856for.cond.cleanup:857  ret void858 859for.body:860  %A.addr.08 = phi ptr [ %A, %entry ], [ %add.ptr, %for.body ]861  %i.07 = phi i32 [ 0, %entry ], [ %inc, %for.body ]862  %B.addr.06 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]863  %0 = load i32, ptr %A.addr.08, align 4864  %add.ptr = getelementptr inbounds i32, ptr %A.addr.08, i32 6865  %add = add nsw i32 %0, %y866  store i32 %add, ptr %B.addr.06, align 4867  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.06, i32 1868  %inc = add nuw nsw i32 %i.07, 1869  %exitcond = icmp eq i32 %inc, 10000870  br i1 %exitcond, label %for.cond.cleanup, label %for.body, !llvm.loop !2871}872 873define hidden void @mult_ptr_iv(ptr noalias nocapture readonly %x, ptr noalias nocapture %z) {874; CHECK-LABEL: @mult_ptr_iv(875; CHECK-NEXT:  entry:876; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[Z:%.*]], i32 3000877; CHECK-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[X:%.*]], i32 3000878; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[Z]], [[SCEVGEP1]]879; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[X]], [[SCEVGEP]]880; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]881; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY:%.*]]882; CHECK:       vector.body:883; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]884; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi ptr [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ], [ [[X]], [[ENTRY]] ]885; CHECK-NEXT:    [[POINTER_PHI5:%.*]] = phi ptr [ [[PTR_IND6:%.*]], [[VECTOR_BODY]] ], [ [[Z]], [[ENTRY]] ]886; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[POINTER_PHI5]], <4 x i32> <i32 0, i32 3, i32 6, i32 9>887; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[POINTER_PHI]], <4 x i32> <i32 0, i32 3, i32 6, i32 9>888; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i8, <4 x ptr> [[TMP0]], i32 1889; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr> align 1 [[TMP0]], <4 x i1> splat (i1 true), <4 x i8> poison), !alias.scope [[META28:![0-9]+]]890; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i8, <4 x ptr> [[TMP0]], i32 2891; CHECK-NEXT:    [[WIDE_MASKED_GATHER7:%.*]] = call <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr> align 1 [[TMP2]], <4 x i1> splat (i1 true), <4 x i8> poison), !alias.scope [[META28]]892; CHECK-NEXT:    [[WIDE_MASKED_GATHER8:%.*]] = call <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr> align 1 [[TMP3]], <4 x i1> splat (i1 true), <4 x i8> poison), !alias.scope [[META28]]893; CHECK-NEXT:    [[TMP4:%.*]] = mul <4 x i8> [[WIDE_MASKED_GATHER]], splat (i8 10)894; CHECK-NEXT:    [[TMP5:%.*]] = mul <4 x i8> [[WIDE_MASKED_GATHER]], [[WIDE_MASKED_GATHER7]]895; CHECK-NEXT:    [[TMP6:%.*]] = mul <4 x i8> [[WIDE_MASKED_GATHER]], [[WIDE_MASKED_GATHER8]]896; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i8, <4 x ptr> [[TMP1]], i32 1897; CHECK-NEXT:    call void @llvm.masked.scatter.v4i8.v4p0(<4 x i8> [[TMP4]], <4 x ptr> align 1 [[TMP1]], <4 x i1> splat (i1 true)), !alias.scope [[META31:![0-9]+]], !noalias [[META28]]898; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i8, <4 x ptr> [[TMP1]], i32 2899; CHECK-NEXT:    call void @llvm.masked.scatter.v4i8.v4p0(<4 x i8> [[TMP5]], <4 x ptr> align 1 [[TMP7]], <4 x i1> splat (i1 true)), !alias.scope [[META31]], !noalias [[META28]]900; CHECK-NEXT:    call void @llvm.masked.scatter.v4i8.v4p0(<4 x i8> [[TMP6]], <4 x ptr> align 1 [[TMP8]], <4 x i1> splat (i1 true)), !alias.scope [[META31]], !noalias [[META28]]901; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4902; CHECK-NEXT:    [[PTR_IND]] = getelementptr i8, ptr [[POINTER_PHI]], i32 12903; CHECK-NEXT:    [[PTR_IND6]] = getelementptr i8, ptr [[POINTER_PHI5]], i32 12904; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000905; CHECK-NEXT:    br i1 [[TMP9]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP33:![0-9]+]]906; CHECK:       for.body:907; CHECK-NEXT:    [[X_ADDR_050:%.*]] = phi ptr [ [[INCDEC_PTR2:%.*]], [[FOR_BODY]] ], [ [[X]], [[ENTRY]] ]908; CHECK-NEXT:    [[Z_ADDR_049:%.*]] = phi ptr [ [[INCDEC_PTR34:%.*]], [[FOR_BODY]] ], [ [[Z]], [[ENTRY]] ]909; CHECK-NEXT:    [[I_048:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY]] ]910; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[X_ADDR_050]], i32 1911; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[X_ADDR_050]], align 1912; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds nuw i8, ptr [[X_ADDR_050]], i32 2913; CHECK-NEXT:    [[TMP11:%.*]] = load i8, ptr [[INCDEC_PTR]], align 1914; CHECK-NEXT:    [[INCDEC_PTR2]] = getelementptr inbounds nuw i8, ptr [[X_ADDR_050]], i32 3915; CHECK-NEXT:    [[TMP12:%.*]] = load i8, ptr [[INCDEC_PTR1]], align 1916; CHECK-NEXT:    [[MUL:%.*]] = mul i8 [[TMP10]], 10917; CHECK-NEXT:    [[MUL1:%.*]] = mul i8 [[TMP10]], [[TMP11]]918; CHECK-NEXT:    [[MUL2:%.*]] = mul i8 [[TMP10]], [[TMP12]]919; CHECK-NEXT:    [[INCDEC_PTR32:%.*]] = getelementptr inbounds nuw i8, ptr [[Z_ADDR_049]], i32 1920; CHECK-NEXT:    store i8 [[MUL]], ptr [[Z_ADDR_049]], align 1921; CHECK-NEXT:    [[INCDEC_PTR33:%.*]] = getelementptr inbounds nuw i8, ptr [[Z_ADDR_049]], i32 2922; CHECK-NEXT:    store i8 [[MUL1]], ptr [[INCDEC_PTR32]], align 1923; CHECK-NEXT:    [[INCDEC_PTR34]] = getelementptr inbounds nuw i8, ptr [[Z_ADDR_049]], i32 3924; CHECK-NEXT:    store i8 [[MUL2]], ptr [[INCDEC_PTR33]], align 1925; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_048]], 1926; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000927; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END]], label [[FOR_BODY]], !llvm.loop [[LOOP34:![0-9]+]]928; CHECK:       end:929; CHECK-NEXT:    ret void930;931entry:932  br label %for.body933 934for.body:935  %x.addr.050 = phi ptr [ %incdec.ptr2, %for.body ], [ %x, %entry ]936  %z.addr.049 = phi ptr [ %incdec.ptr34, %for.body ], [ %z, %entry ]937  %i.048 = phi i32 [ %inc, %for.body ], [ 0, %entry ]938  %incdec.ptr = getelementptr inbounds i8, ptr %x.addr.050, i32 1939  %0 = load i8, ptr %x.addr.050, align 1940  %incdec.ptr1 = getelementptr inbounds i8, ptr %x.addr.050, i32 2941  %1 = load i8, ptr %incdec.ptr, align 1942  %incdec.ptr2 = getelementptr inbounds i8, ptr %x.addr.050, i32 3943  %2 = load i8, ptr %incdec.ptr1, align 1944  %conv = zext i8 %0 to i32945  %mul = mul nuw nsw i32 %conv, 10946  %conv1 = zext i8 %1 to i32947  %conv2 = zext i8 %2 to i32948  %mul1 = mul nuw nsw i32 %conv, %conv1949  %mul2 = mul nuw nsw i32 %conv, %conv2950  %conv3 = trunc i32 %mul to i8951  %conv4 = trunc i32 %mul1 to i8952  %conv5 = trunc i32 %mul2 to i8953  %incdec.ptr32 = getelementptr inbounds i8, ptr %z.addr.049, i32 1954  store i8 %conv3, ptr %z.addr.049, align 1955  %incdec.ptr33 = getelementptr inbounds i8, ptr %z.addr.049, i32 2956  store i8 %conv4, ptr %incdec.ptr32, align 1957  %incdec.ptr34 = getelementptr inbounds i8, ptr %z.addr.049, i32 3958  store i8 %conv5, ptr %incdec.ptr33, align 1959  %inc = add nuw i32 %i.048, 1960  %exitcond = icmp eq i32 %inc, 1000961  br i1 %exitcond, label %end, label %for.body962 963end:964  ret void965}966