187d36c5dSDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2bddfbe74SSimon Pilgrim; RUN: opt -passes="default<O3>" -S -o - %s | FileCheck %s 387d36c5dSDavid Green 487d36c5dSDavid Greentarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" 587d36c5dSDavid Greentarget triple = "aarch64" 687d36c5dSDavid Green 787d36c5dSDavid Green; for(int i =0; i < 1024; i+=4) { 887d36c5dSDavid Green; x[i] += y[i]; 987d36c5dSDavid Green; x[i+1] += y[i+1]; 1087d36c5dSDavid Green; x[i+2] += y[i+2]; 1187d36c5dSDavid Green; x[i+3] += y[i+3]; 1287d36c5dSDavid Green; } 1387d36c5dSDavid Greendefine void @add4(ptr noalias noundef %x, ptr noalias noundef %y, i32 noundef %n) { 1487d36c5dSDavid Green; CHECK-LABEL: @add4( 1587d36c5dSDavid Green; CHECK-NEXT: entry: 1687d36c5dSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 1787d36c5dSDavid Green; CHECK: vector.body: 1887d36c5dSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 1987d36c5dSDavid Green; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 2 20*11571874SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i16, ptr [[Y:%.*]], i64 [[OFFSET_IDX]] 2187d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <32 x i16>, ptr [[TMP0]], align 2 22*11571874SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i16, ptr [[X:%.*]], i64 [[OFFSET_IDX]] 2387d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC24:%.*]] = load <32 x i16>, ptr [[TMP1]], align 2 24efa8463aSDavid Green; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = add <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 257f746518SFlorian Hahn; CHECK-NEXT: store <32 x i16> [[INTERLEAVED_VEC]], ptr [[TMP1]], align 2 2687d36c5dSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8 27a4d10266SDavid Green; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 28a4d10266SDavid Green; CHECK-NEXT: br i1 [[TMP3]], label [[FOR_END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 2987d36c5dSDavid Green; CHECK: for.end: 3087d36c5dSDavid Green; CHECK-NEXT: ret void 3187d36c5dSDavid Green; 3287d36c5dSDavid Greenentry: 3387d36c5dSDavid Green %x.addr = alloca ptr, align 8 3487d36c5dSDavid Green %y.addr = alloca ptr, align 8 3587d36c5dSDavid Green %n.addr = alloca i32, align 4 3687d36c5dSDavid Green %i = alloca i32, align 4 3787d36c5dSDavid Green store ptr %x, ptr %x.addr, align 8 3887d36c5dSDavid Green store ptr %y, ptr %y.addr, align 8 3987d36c5dSDavid Green store i32 %n, ptr %n.addr, align 4 4087d36c5dSDavid Green store i32 0, ptr %i, align 4 4187d36c5dSDavid Green br label %for.cond 4287d36c5dSDavid Green 4387d36c5dSDavid Greenfor.cond: 4487d36c5dSDavid Green %0 = load i32, ptr %i, align 4 4587d36c5dSDavid Green %cmp = icmp slt i32 %0, 1024 4687d36c5dSDavid Green br i1 %cmp, label %for.body, label %for.end 4787d36c5dSDavid Green 4887d36c5dSDavid Greenfor.body: 4987d36c5dSDavid Green %1 = load ptr, ptr %y.addr, align 8 5087d36c5dSDavid Green %2 = load i32, ptr %i, align 4 5187d36c5dSDavid Green %idxprom = sext i32 %2 to i64 5287d36c5dSDavid Green %arrayidx = getelementptr inbounds i16, ptr %1, i64 %idxprom 5387d36c5dSDavid Green %3 = load i16, ptr %arrayidx, align 2 5487d36c5dSDavid Green %conv = sext i16 %3 to i32 5587d36c5dSDavid Green %4 = load ptr, ptr %x.addr, align 8 5687d36c5dSDavid Green %5 = load i32, ptr %i, align 4 5787d36c5dSDavid Green %idxprom1 = sext i32 %5 to i64 5887d36c5dSDavid Green %arrayidx2 = getelementptr inbounds i16, ptr %4, i64 %idxprom1 5987d36c5dSDavid Green %6 = load i16, ptr %arrayidx2, align 2 6087d36c5dSDavid Green %conv3 = sext i16 %6 to i32 6187d36c5dSDavid Green %add = add nsw i32 %conv3, %conv 6287d36c5dSDavid Green %conv4 = trunc i32 %add to i16 6387d36c5dSDavid Green store i16 %conv4, ptr %arrayidx2, align 2 6487d36c5dSDavid Green %7 = load ptr, ptr %y.addr, align 8 6587d36c5dSDavid Green %8 = load i32, ptr %i, align 4 6687d36c5dSDavid Green %add5 = add nsw i32 %8, 1 6787d36c5dSDavid Green %idxprom6 = sext i32 %add5 to i64 6887d36c5dSDavid Green %arrayidx7 = getelementptr inbounds i16, ptr %7, i64 %idxprom6 6987d36c5dSDavid Green %9 = load i16, ptr %arrayidx7, align 2 7087d36c5dSDavid Green %conv8 = sext i16 %9 to i32 7187d36c5dSDavid Green %10 = load ptr, ptr %x.addr, align 8 7287d36c5dSDavid Green %11 = load i32, ptr %i, align 4 7387d36c5dSDavid Green %add9 = add nsw i32 %11, 1 7487d36c5dSDavid Green %idxprom10 = sext i32 %add9 to i64 7587d36c5dSDavid Green %arrayidx11 = getelementptr inbounds i16, ptr %10, i64 %idxprom10 7687d36c5dSDavid Green %12 = load i16, ptr %arrayidx11, align 2 7787d36c5dSDavid Green %conv12 = sext i16 %12 to i32 7887d36c5dSDavid Green %add13 = add nsw i32 %conv12, %conv8 7987d36c5dSDavid Green %conv14 = trunc i32 %add13 to i16 8087d36c5dSDavid Green store i16 %conv14, ptr %arrayidx11, align 2 8187d36c5dSDavid Green %13 = load ptr, ptr %y.addr, align 8 8287d36c5dSDavid Green %14 = load i32, ptr %i, align 4 8387d36c5dSDavid Green %add15 = add nsw i32 %14, 2 8487d36c5dSDavid Green %idxprom16 = sext i32 %add15 to i64 8587d36c5dSDavid Green %arrayidx17 = getelementptr inbounds i16, ptr %13, i64 %idxprom16 8687d36c5dSDavid Green %15 = load i16, ptr %arrayidx17, align 2 8787d36c5dSDavid Green %conv18 = sext i16 %15 to i32 8887d36c5dSDavid Green %16 = load ptr, ptr %x.addr, align 8 8987d36c5dSDavid Green %17 = load i32, ptr %i, align 4 9087d36c5dSDavid Green %add19 = add nsw i32 %17, 2 9187d36c5dSDavid Green %idxprom20 = sext i32 %add19 to i64 9287d36c5dSDavid Green %arrayidx21 = getelementptr inbounds i16, ptr %16, i64 %idxprom20 9387d36c5dSDavid Green %18 = load i16, ptr %arrayidx21, align 2 9487d36c5dSDavid Green %conv22 = sext i16 %18 to i32 9587d36c5dSDavid Green %add23 = add nsw i32 %conv22, %conv18 9687d36c5dSDavid Green %conv24 = trunc i32 %add23 to i16 9787d36c5dSDavid Green store i16 %conv24, ptr %arrayidx21, align 2 9887d36c5dSDavid Green %19 = load ptr, ptr %y.addr, align 8 9987d36c5dSDavid Green %20 = load i32, ptr %i, align 4 10087d36c5dSDavid Green %add25 = add nsw i32 %20, 3 10187d36c5dSDavid Green %idxprom26 = sext i32 %add25 to i64 10287d36c5dSDavid Green %arrayidx27 = getelementptr inbounds i16, ptr %19, i64 %idxprom26 10387d36c5dSDavid Green %21 = load i16, ptr %arrayidx27, align 2 10487d36c5dSDavid Green %conv28 = sext i16 %21 to i32 10587d36c5dSDavid Green %22 = load ptr, ptr %x.addr, align 8 10687d36c5dSDavid Green %23 = load i32, ptr %i, align 4 10787d36c5dSDavid Green %add29 = add nsw i32 %23, 3 10887d36c5dSDavid Green %idxprom30 = sext i32 %add29 to i64 10987d36c5dSDavid Green %arrayidx31 = getelementptr inbounds i16, ptr %22, i64 %idxprom30 11087d36c5dSDavid Green %24 = load i16, ptr %arrayidx31, align 2 11187d36c5dSDavid Green %conv32 = sext i16 %24 to i32 11287d36c5dSDavid Green %add33 = add nsw i32 %conv32, %conv28 11387d36c5dSDavid Green %conv34 = trunc i32 %add33 to i16 11487d36c5dSDavid Green store i16 %conv34, ptr %arrayidx31, align 2 11587d36c5dSDavid Green br label %for.inc 11687d36c5dSDavid Green 11787d36c5dSDavid Greenfor.inc: 11887d36c5dSDavid Green %25 = load i32, ptr %i, align 4 11987d36c5dSDavid Green %add35 = add nsw i32 %25, 4 12087d36c5dSDavid Green store i32 %add35, ptr %i, align 4 12187d36c5dSDavid Green br label %for.cond 12287d36c5dSDavid Green 12387d36c5dSDavid Greenfor.end: 12487d36c5dSDavid Green ret void 12587d36c5dSDavid Green} 12687d36c5dSDavid Green 12787d36c5dSDavid Green; for(int i =0; i < 1024; i+=4) { 12887d36c5dSDavid Green; x[i] += y[i]; 12987d36c5dSDavid Green; x[i+1] -= y[i+1]; 13087d36c5dSDavid Green; x[i+2] += y[i+2]; 13187d36c5dSDavid Green; x[i+3] -= y[i+3]; 13287d36c5dSDavid Green; } 13387d36c5dSDavid Greendefine void @addsubs(ptr noalias noundef %x, ptr noundef %y, i32 noundef %n) { 13487d36c5dSDavid Green; CHECK-LABEL: @addsubs( 13587d36c5dSDavid Green; CHECK-NEXT: entry: 13687d36c5dSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 13787d36c5dSDavid Green; CHECK: vector.body: 13887d36c5dSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 13987d36c5dSDavid Green; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 2 140*11571874SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i16, ptr [[Y:%.*]], i64 [[OFFSET_IDX]] 14187d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <32 x i16>, ptr [[TMP0]], align 2 142*11571874SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i16, ptr [[X:%.*]], i64 [[OFFSET_IDX]] 14387d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC24:%.*]] = load <32 x i16>, ptr [[TMP1]], align 2 14487d36c5dSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = add <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 145bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP3:%.*]] = sub <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 146bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP4:%.*]] = add <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 147bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP6:%.*]] = sub <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 148bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <32 x i16> [[TMP2]], <32 x i16> [[TMP3]], <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28, i32 33, i32 37, i32 41, i32 45, i32 49, i32 53, i32 57, i32 61> 149bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <32 x i16> [[TMP4]], <32 x i16> [[TMP6]], <16 x i32> <i32 2, i32 6, i32 10, i32 14, i32 18, i32 22, i32 26, i32 30, i32 35, i32 39, i32 43, i32 47, i32 51, i32 55, i32 59, i32 63> 150bddfbe74SSimon Pilgrim; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <16 x i16> [[TMP7]], <16 x i16> [[TMP8]], <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31> 1517f746518SFlorian Hahn; CHECK-NEXT: store <32 x i16> [[INTERLEAVED_VEC]], ptr [[TMP1]], align 2 15287d36c5dSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8 153bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 154bddfbe74SSimon Pilgrim; CHECK-NEXT: br i1 [[TMP9]], label [[FOR_END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]] 15587d36c5dSDavid Green; CHECK: for.end: 15687d36c5dSDavid Green; CHECK-NEXT: ret void 15787d36c5dSDavid Green; 15887d36c5dSDavid Greenentry: 15987d36c5dSDavid Green %x.addr = alloca ptr, align 8 16087d36c5dSDavid Green %y.addr = alloca ptr, align 8 16187d36c5dSDavid Green %n.addr = alloca i32, align 4 16287d36c5dSDavid Green %i = alloca i32, align 4 16387d36c5dSDavid Green store ptr %x, ptr %x.addr, align 8 16487d36c5dSDavid Green store ptr %y, ptr %y.addr, align 8 16587d36c5dSDavid Green store i32 %n, ptr %n.addr, align 4 16687d36c5dSDavid Green store i32 0, ptr %i, align 4 16787d36c5dSDavid Green br label %for.cond 16887d36c5dSDavid Green 16987d36c5dSDavid Greenfor.cond: 17087d36c5dSDavid Green %0 = load i32, ptr %i, align 4 17187d36c5dSDavid Green %cmp = icmp slt i32 %0, 1024 17287d36c5dSDavid Green br i1 %cmp, label %for.body, label %for.end 17387d36c5dSDavid Green 17487d36c5dSDavid Greenfor.body: 17587d36c5dSDavid Green %1 = load ptr, ptr %y.addr, align 8 17687d36c5dSDavid Green %2 = load i32, ptr %i, align 4 17787d36c5dSDavid Green %idxprom = sext i32 %2 to i64 17887d36c5dSDavid Green %arrayidx = getelementptr inbounds i16, ptr %1, i64 %idxprom 17987d36c5dSDavid Green %3 = load i16, ptr %arrayidx, align 2 18087d36c5dSDavid Green %conv = sext i16 %3 to i32 18187d36c5dSDavid Green %4 = load ptr, ptr %x.addr, align 8 18287d36c5dSDavid Green %5 = load i32, ptr %i, align 4 18387d36c5dSDavid Green %idxprom1 = sext i32 %5 to i64 18487d36c5dSDavid Green %arrayidx2 = getelementptr inbounds i16, ptr %4, i64 %idxprom1 18587d36c5dSDavid Green %6 = load i16, ptr %arrayidx2, align 2 18687d36c5dSDavid Green %conv3 = sext i16 %6 to i32 18787d36c5dSDavid Green %add = add nsw i32 %conv3, %conv 18887d36c5dSDavid Green %conv4 = trunc i32 %add to i16 18987d36c5dSDavid Green store i16 %conv4, ptr %arrayidx2, align 2 19087d36c5dSDavid Green %7 = load ptr, ptr %y.addr, align 8 19187d36c5dSDavid Green %8 = load i32, ptr %i, align 4 19287d36c5dSDavid Green %add5 = add nsw i32 %8, 1 19387d36c5dSDavid Green %idxprom6 = sext i32 %add5 to i64 19487d36c5dSDavid Green %arrayidx7 = getelementptr inbounds i16, ptr %7, i64 %idxprom6 19587d36c5dSDavid Green %9 = load i16, ptr %arrayidx7, align 2 19687d36c5dSDavid Green %conv8 = sext i16 %9 to i32 19787d36c5dSDavid Green %10 = load ptr, ptr %x.addr, align 8 19887d36c5dSDavid Green %11 = load i32, ptr %i, align 4 19987d36c5dSDavid Green %add9 = add nsw i32 %11, 1 20087d36c5dSDavid Green %idxprom10 = sext i32 %add9 to i64 20187d36c5dSDavid Green %arrayidx11 = getelementptr inbounds i16, ptr %10, i64 %idxprom10 20287d36c5dSDavid Green %12 = load i16, ptr %arrayidx11, align 2 20387d36c5dSDavid Green %conv12 = sext i16 %12 to i32 20487d36c5dSDavid Green %sub = sub nsw i32 %conv12, %conv8 20587d36c5dSDavid Green %conv13 = trunc i32 %sub to i16 20687d36c5dSDavid Green store i16 %conv13, ptr %arrayidx11, align 2 20787d36c5dSDavid Green %13 = load ptr, ptr %y.addr, align 8 20887d36c5dSDavid Green %14 = load i32, ptr %i, align 4 20987d36c5dSDavid Green %add14 = add nsw i32 %14, 2 21087d36c5dSDavid Green %idxprom15 = sext i32 %add14 to i64 21187d36c5dSDavid Green %arrayidx16 = getelementptr inbounds i16, ptr %13, i64 %idxprom15 21287d36c5dSDavid Green %15 = load i16, ptr %arrayidx16, align 2 21387d36c5dSDavid Green %conv17 = sext i16 %15 to i32 21487d36c5dSDavid Green %16 = load ptr, ptr %x.addr, align 8 21587d36c5dSDavid Green %17 = load i32, ptr %i, align 4 21687d36c5dSDavid Green %add18 = add nsw i32 %17, 2 21787d36c5dSDavid Green %idxprom19 = sext i32 %add18 to i64 21887d36c5dSDavid Green %arrayidx20 = getelementptr inbounds i16, ptr %16, i64 %idxprom19 21987d36c5dSDavid Green %18 = load i16, ptr %arrayidx20, align 2 22087d36c5dSDavid Green %conv21 = sext i16 %18 to i32 22187d36c5dSDavid Green %add22 = add nsw i32 %conv21, %conv17 22287d36c5dSDavid Green %conv23 = trunc i32 %add22 to i16 22387d36c5dSDavid Green store i16 %conv23, ptr %arrayidx20, align 2 22487d36c5dSDavid Green %19 = load ptr, ptr %y.addr, align 8 22587d36c5dSDavid Green %20 = load i32, ptr %i, align 4 22687d36c5dSDavid Green %add24 = add nsw i32 %20, 3 22787d36c5dSDavid Green %idxprom25 = sext i32 %add24 to i64 22887d36c5dSDavid Green %arrayidx26 = getelementptr inbounds i16, ptr %19, i64 %idxprom25 22987d36c5dSDavid Green %21 = load i16, ptr %arrayidx26, align 2 23087d36c5dSDavid Green %conv27 = sext i16 %21 to i32 23187d36c5dSDavid Green %22 = load ptr, ptr %x.addr, align 8 23287d36c5dSDavid Green %23 = load i32, ptr %i, align 4 23387d36c5dSDavid Green %add28 = add nsw i32 %23, 3 23487d36c5dSDavid Green %idxprom29 = sext i32 %add28 to i64 23587d36c5dSDavid Green %arrayidx30 = getelementptr inbounds i16, ptr %22, i64 %idxprom29 23687d36c5dSDavid Green %24 = load i16, ptr %arrayidx30, align 2 23787d36c5dSDavid Green %conv31 = sext i16 %24 to i32 23887d36c5dSDavid Green %sub32 = sub nsw i32 %conv31, %conv27 23987d36c5dSDavid Green %conv33 = trunc i32 %sub32 to i16 24087d36c5dSDavid Green store i16 %conv33, ptr %arrayidx30, align 2 24187d36c5dSDavid Green br label %for.inc 24287d36c5dSDavid Green 24387d36c5dSDavid Greenfor.inc: 24487d36c5dSDavid Green %25 = load i32, ptr %i, align 4 24587d36c5dSDavid Green %add34 = add nsw i32 %25, 4 24687d36c5dSDavid Green store i32 %add34, ptr %i, align 4 24787d36c5dSDavid Green br label %for.cond 24887d36c5dSDavid Green 24987d36c5dSDavid Greenfor.end: 25087d36c5dSDavid Green ret void 25187d36c5dSDavid Green} 25287d36c5dSDavid Green 25387d36c5dSDavid Green; for(int i =0; i < 1024; i+=4) { 25487d36c5dSDavid Green; x[i] += y[i]; 25587d36c5dSDavid Green; x[i+1] += y[i+1]; 25687d36c5dSDavid Green; x[i+2] -= y[i+2]; 25787d36c5dSDavid Green; x[i+3] -= y[i+3]; 25887d36c5dSDavid Green; } 25987d36c5dSDavid Greendefine void @add2sub2(ptr noalias noundef %x, ptr noundef %y, i32 noundef %n) { 26087d36c5dSDavid Green; CHECK-LABEL: @add2sub2( 26187d36c5dSDavid Green; CHECK-NEXT: entry: 26287d36c5dSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 26387d36c5dSDavid Green; CHECK: vector.body: 26487d36c5dSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 26587d36c5dSDavid Green; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 2 266*11571874SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i16, ptr [[Y:%.*]], i64 [[OFFSET_IDX]] 26787d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <32 x i16>, ptr [[TMP0]], align 2 268*11571874SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i16, ptr [[X:%.*]], i64 [[OFFSET_IDX]] 26987d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC24:%.*]] = load <32 x i16>, ptr [[TMP1]], align 2 27087d36c5dSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = add <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 271bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP3:%.*]] = add <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 272bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP4:%.*]] = sub <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 27387d36c5dSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = sub <32 x i16> [[WIDE_VEC24]], [[WIDE_VEC]] 274bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <32 x i16> [[TMP2]], <32 x i16> [[TMP3]], <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28, i32 33, i32 37, i32 41, i32 45, i32 49, i32 53, i32 57, i32 61> 275bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <32 x i16> [[TMP4]], <32 x i16> [[TMP6]], <16 x i32> <i32 2, i32 6, i32 10, i32 14, i32 18, i32 22, i32 26, i32 30, i32 35, i32 39, i32 43, i32 47, i32 51, i32 55, i32 59, i32 63> 276bddfbe74SSimon Pilgrim; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <16 x i16> [[TMP7]], <16 x i16> [[TMP8]], <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31> 2777f746518SFlorian Hahn; CHECK-NEXT: store <32 x i16> [[INTERLEAVED_VEC]], ptr [[TMP1]], align 2 27887d36c5dSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8 279bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 280bddfbe74SSimon Pilgrim; CHECK-NEXT: br i1 [[TMP9]], label [[FOR_END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 28187d36c5dSDavid Green; CHECK: for.end: 28287d36c5dSDavid Green; CHECK-NEXT: ret void 28387d36c5dSDavid Green; 28487d36c5dSDavid Greenentry: 28587d36c5dSDavid Green %x.addr = alloca ptr, align 8 28687d36c5dSDavid Green %y.addr = alloca ptr, align 8 28787d36c5dSDavid Green %n.addr = alloca i32, align 4 28887d36c5dSDavid Green %i = alloca i32, align 4 28987d36c5dSDavid Green store ptr %x, ptr %x.addr, align 8 29087d36c5dSDavid Green store ptr %y, ptr %y.addr, align 8 29187d36c5dSDavid Green store i32 %n, ptr %n.addr, align 4 29287d36c5dSDavid Green store i32 0, ptr %i, align 4 29387d36c5dSDavid Green br label %for.cond 29487d36c5dSDavid Green 29587d36c5dSDavid Greenfor.cond: 29687d36c5dSDavid Green %0 = load i32, ptr %i, align 4 29787d36c5dSDavid Green %cmp = icmp slt i32 %0, 1024 29887d36c5dSDavid Green br i1 %cmp, label %for.body, label %for.end 29987d36c5dSDavid Green 30087d36c5dSDavid Greenfor.body: 30187d36c5dSDavid Green %1 = load ptr, ptr %y.addr, align 8 30287d36c5dSDavid Green %2 = load i32, ptr %i, align 4 30387d36c5dSDavid Green %idxprom = sext i32 %2 to i64 30487d36c5dSDavid Green %arrayidx = getelementptr inbounds i16, ptr %1, i64 %idxprom 30587d36c5dSDavid Green %3 = load i16, ptr %arrayidx, align 2 30687d36c5dSDavid Green %conv = sext i16 %3 to i32 30787d36c5dSDavid Green %4 = load ptr, ptr %x.addr, align 8 30887d36c5dSDavid Green %5 = load i32, ptr %i, align 4 30987d36c5dSDavid Green %idxprom1 = sext i32 %5 to i64 31087d36c5dSDavid Green %arrayidx2 = getelementptr inbounds i16, ptr %4, i64 %idxprom1 31187d36c5dSDavid Green %6 = load i16, ptr %arrayidx2, align 2 31287d36c5dSDavid Green %conv3 = sext i16 %6 to i32 31387d36c5dSDavid Green %add = add nsw i32 %conv3, %conv 31487d36c5dSDavid Green %conv4 = trunc i32 %add to i16 31587d36c5dSDavid Green store i16 %conv4, ptr %arrayidx2, align 2 31687d36c5dSDavid Green %7 = load ptr, ptr %y.addr, align 8 31787d36c5dSDavid Green %8 = load i32, ptr %i, align 4 31887d36c5dSDavid Green %add5 = add nsw i32 %8, 1 31987d36c5dSDavid Green %idxprom6 = sext i32 %add5 to i64 32087d36c5dSDavid Green %arrayidx7 = getelementptr inbounds i16, ptr %7, i64 %idxprom6 32187d36c5dSDavid Green %9 = load i16, ptr %arrayidx7, align 2 32287d36c5dSDavid Green %conv8 = sext i16 %9 to i32 32387d36c5dSDavid Green %10 = load ptr, ptr %x.addr, align 8 32487d36c5dSDavid Green %11 = load i32, ptr %i, align 4 32587d36c5dSDavid Green %add9 = add nsw i32 %11, 1 32687d36c5dSDavid Green %idxprom10 = sext i32 %add9 to i64 32787d36c5dSDavid Green %arrayidx11 = getelementptr inbounds i16, ptr %10, i64 %idxprom10 32887d36c5dSDavid Green %12 = load i16, ptr %arrayidx11, align 2 32987d36c5dSDavid Green %conv12 = sext i16 %12 to i32 33087d36c5dSDavid Green %add13 = add nsw i32 %conv12, %conv8 33187d36c5dSDavid Green %conv14 = trunc i32 %add13 to i16 33287d36c5dSDavid Green store i16 %conv14, ptr %arrayidx11, align 2 33387d36c5dSDavid Green %13 = load ptr, ptr %y.addr, align 8 33487d36c5dSDavid Green %14 = load i32, ptr %i, align 4 33587d36c5dSDavid Green %add15 = add nsw i32 %14, 2 33687d36c5dSDavid Green %idxprom16 = sext i32 %add15 to i64 33787d36c5dSDavid Green %arrayidx17 = getelementptr inbounds i16, ptr %13, i64 %idxprom16 33887d36c5dSDavid Green %15 = load i16, ptr %arrayidx17, align 2 33987d36c5dSDavid Green %conv18 = sext i16 %15 to i32 34087d36c5dSDavid Green %16 = load ptr, ptr %x.addr, align 8 34187d36c5dSDavid Green %17 = load i32, ptr %i, align 4 34287d36c5dSDavid Green %add19 = add nsw i32 %17, 2 34387d36c5dSDavid Green %idxprom20 = sext i32 %add19 to i64 34487d36c5dSDavid Green %arrayidx21 = getelementptr inbounds i16, ptr %16, i64 %idxprom20 34587d36c5dSDavid Green %18 = load i16, ptr %arrayidx21, align 2 34687d36c5dSDavid Green %conv22 = sext i16 %18 to i32 34787d36c5dSDavid Green %sub = sub nsw i32 %conv22, %conv18 34887d36c5dSDavid Green %conv23 = trunc i32 %sub to i16 34987d36c5dSDavid Green store i16 %conv23, ptr %arrayidx21, align 2 35087d36c5dSDavid Green %19 = load ptr, ptr %y.addr, align 8 35187d36c5dSDavid Green %20 = load i32, ptr %i, align 4 35287d36c5dSDavid Green %add24 = add nsw i32 %20, 3 35387d36c5dSDavid Green %idxprom25 = sext i32 %add24 to i64 35487d36c5dSDavid Green %arrayidx26 = getelementptr inbounds i16, ptr %19, i64 %idxprom25 35587d36c5dSDavid Green %21 = load i16, ptr %arrayidx26, align 2 35687d36c5dSDavid Green %conv27 = sext i16 %21 to i32 35787d36c5dSDavid Green %22 = load ptr, ptr %x.addr, align 8 35887d36c5dSDavid Green %23 = load i32, ptr %i, align 4 35987d36c5dSDavid Green %add28 = add nsw i32 %23, 3 36087d36c5dSDavid Green %idxprom29 = sext i32 %add28 to i64 36187d36c5dSDavid Green %arrayidx30 = getelementptr inbounds i16, ptr %22, i64 %idxprom29 36287d36c5dSDavid Green %24 = load i16, ptr %arrayidx30, align 2 36387d36c5dSDavid Green %conv31 = sext i16 %24 to i32 36487d36c5dSDavid Green %sub32 = sub nsw i32 %conv31, %conv27 36587d36c5dSDavid Green %conv33 = trunc i32 %sub32 to i16 36687d36c5dSDavid Green store i16 %conv33, ptr %arrayidx30, align 2 36787d36c5dSDavid Green br label %for.inc 36887d36c5dSDavid Green 36987d36c5dSDavid Greenfor.inc: 37087d36c5dSDavid Green %25 = load i32, ptr %i, align 4 37187d36c5dSDavid Green %add34 = add nsw i32 %25, 4 37287d36c5dSDavid Green store i32 %add34, ptr %i, align 4 37387d36c5dSDavid Green br label %for.cond 37487d36c5dSDavid Green 37587d36c5dSDavid Greenfor.end: 37687d36c5dSDavid Green ret void 37787d36c5dSDavid Green} 37887d36c5dSDavid Green 37987d36c5dSDavid Green; for(int i =0; i < 1024; i+=4) { 38087d36c5dSDavid Green; x[i] += y[i] * z[i]; 38187d36c5dSDavid Green; x[i+1] += y[i+1] * z[i+1]; 38287d36c5dSDavid Green; x[i+2] += y[i+2] * z[i+2]; 38387d36c5dSDavid Green; x[i+3] += y[i+3] * z[i+3]; 38487d36c5dSDavid Green; } 38587d36c5dSDavid Greendefine void @addmul(ptr noalias noundef %x, ptr noundef %y, ptr noundef %z, i32 noundef %n) { 38687d36c5dSDavid Green; CHECK-LABEL: @addmul( 38787d36c5dSDavid Green; CHECK-NEXT: entry: 38887d36c5dSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 38987d36c5dSDavid Green; CHECK: vector.body: 39087d36c5dSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 39187d36c5dSDavid Green; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 2 392*11571874SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i16, ptr [[Y:%.*]], i64 [[OFFSET_IDX]] 39387d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <32 x i16>, ptr [[TMP0]], align 2 394*11571874SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i16, ptr [[Z:%.*]], i64 [[OFFSET_IDX]] 39587d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC31:%.*]] = load <32 x i16>, ptr [[TMP1]], align 2 396*11571874SNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i16, ptr [[X:%.*]], i64 [[OFFSET_IDX]] 397efa8463aSDavid Green; CHECK-NEXT: [[WIDE_VEC36:%.*]] = load <32 x i16>, ptr [[TMP2]], align 2 398efa8463aSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 399efa8463aSDavid Green; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = add <32 x i16> [[TMP4]], [[WIDE_VEC36]] 4007f746518SFlorian Hahn; CHECK-NEXT: store <32 x i16> [[INTERLEAVED_VEC]], ptr [[TMP2]], align 2 40187d36c5dSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8 402a4d10266SDavid Green; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 403a4d10266SDavid Green; CHECK-NEXT: br i1 [[TMP5]], label [[FOR_END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]] 40487d36c5dSDavid Green; CHECK: for.end: 40587d36c5dSDavid Green; CHECK-NEXT: ret void 40687d36c5dSDavid Green; 40787d36c5dSDavid Greenentry: 40887d36c5dSDavid Green %x.addr = alloca ptr, align 8 40987d36c5dSDavid Green %y.addr = alloca ptr, align 8 41087d36c5dSDavid Green %z.addr = alloca ptr, align 8 41187d36c5dSDavid Green %n.addr = alloca i32, align 4 41287d36c5dSDavid Green %i = alloca i32, align 4 41387d36c5dSDavid Green store ptr %x, ptr %x.addr, align 8 41487d36c5dSDavid Green store ptr %y, ptr %y.addr, align 8 41587d36c5dSDavid Green store ptr %z, ptr %z.addr, align 8 41687d36c5dSDavid Green store i32 %n, ptr %n.addr, align 4 41787d36c5dSDavid Green store i32 0, ptr %i, align 4 41887d36c5dSDavid Green br label %for.cond 41987d36c5dSDavid Green 42087d36c5dSDavid Greenfor.cond: 42187d36c5dSDavid Green %0 = load i32, ptr %i, align 4 42287d36c5dSDavid Green %cmp = icmp slt i32 %0, 1024 42387d36c5dSDavid Green br i1 %cmp, label %for.body, label %for.end 42487d36c5dSDavid Green 42587d36c5dSDavid Greenfor.body: 42687d36c5dSDavid Green %1 = load ptr, ptr %y.addr, align 8 42787d36c5dSDavid Green %2 = load i32, ptr %i, align 4 42887d36c5dSDavid Green %idxprom = sext i32 %2 to i64 42987d36c5dSDavid Green %arrayidx = getelementptr inbounds i16, ptr %1, i64 %idxprom 43087d36c5dSDavid Green %3 = load i16, ptr %arrayidx, align 2 43187d36c5dSDavid Green %conv = sext i16 %3 to i32 43287d36c5dSDavid Green %4 = load ptr, ptr %z.addr, align 8 43387d36c5dSDavid Green %5 = load i32, ptr %i, align 4 43487d36c5dSDavid Green %idxprom1 = sext i32 %5 to i64 43587d36c5dSDavid Green %arrayidx2 = getelementptr inbounds i16, ptr %4, i64 %idxprom1 43687d36c5dSDavid Green %6 = load i16, ptr %arrayidx2, align 2 43787d36c5dSDavid Green %conv3 = sext i16 %6 to i32 43887d36c5dSDavid Green %mul = mul nsw i32 %conv, %conv3 43987d36c5dSDavid Green %7 = load ptr, ptr %x.addr, align 8 44087d36c5dSDavid Green %8 = load i32, ptr %i, align 4 44187d36c5dSDavid Green %idxprom4 = sext i32 %8 to i64 44287d36c5dSDavid Green %arrayidx5 = getelementptr inbounds i16, ptr %7, i64 %idxprom4 44387d36c5dSDavid Green %9 = load i16, ptr %arrayidx5, align 2 44487d36c5dSDavid Green %conv6 = sext i16 %9 to i32 44587d36c5dSDavid Green %add = add nsw i32 %conv6, %mul 44687d36c5dSDavid Green %conv7 = trunc i32 %add to i16 44787d36c5dSDavid Green store i16 %conv7, ptr %arrayidx5, align 2 44887d36c5dSDavid Green %10 = load ptr, ptr %y.addr, align 8 44987d36c5dSDavid Green %11 = load i32, ptr %i, align 4 45087d36c5dSDavid Green %add8 = add nsw i32 %11, 1 45187d36c5dSDavid Green %idxprom9 = sext i32 %add8 to i64 45287d36c5dSDavid Green %arrayidx10 = getelementptr inbounds i16, ptr %10, i64 %idxprom9 45387d36c5dSDavid Green %12 = load i16, ptr %arrayidx10, align 2 45487d36c5dSDavid Green %conv11 = sext i16 %12 to i32 45587d36c5dSDavid Green %13 = load ptr, ptr %z.addr, align 8 45687d36c5dSDavid Green %14 = load i32, ptr %i, align 4 45787d36c5dSDavid Green %add12 = add nsw i32 %14, 1 45887d36c5dSDavid Green %idxprom13 = sext i32 %add12 to i64 45987d36c5dSDavid Green %arrayidx14 = getelementptr inbounds i16, ptr %13, i64 %idxprom13 46087d36c5dSDavid Green %15 = load i16, ptr %arrayidx14, align 2 46187d36c5dSDavid Green %conv15 = sext i16 %15 to i32 46287d36c5dSDavid Green %mul16 = mul nsw i32 %conv11, %conv15 46387d36c5dSDavid Green %16 = load ptr, ptr %x.addr, align 8 46487d36c5dSDavid Green %17 = load i32, ptr %i, align 4 46587d36c5dSDavid Green %add17 = add nsw i32 %17, 1 46687d36c5dSDavid Green %idxprom18 = sext i32 %add17 to i64 46787d36c5dSDavid Green %arrayidx19 = getelementptr inbounds i16, ptr %16, i64 %idxprom18 46887d36c5dSDavid Green %18 = load i16, ptr %arrayidx19, align 2 46987d36c5dSDavid Green %conv20 = sext i16 %18 to i32 47087d36c5dSDavid Green %add21 = add nsw i32 %conv20, %mul16 47187d36c5dSDavid Green %conv22 = trunc i32 %add21 to i16 47287d36c5dSDavid Green store i16 %conv22, ptr %arrayidx19, align 2 47387d36c5dSDavid Green %19 = load ptr, ptr %y.addr, align 8 47487d36c5dSDavid Green %20 = load i32, ptr %i, align 4 47587d36c5dSDavid Green %add23 = add nsw i32 %20, 2 47687d36c5dSDavid Green %idxprom24 = sext i32 %add23 to i64 47787d36c5dSDavid Green %arrayidx25 = getelementptr inbounds i16, ptr %19, i64 %idxprom24 47887d36c5dSDavid Green %21 = load i16, ptr %arrayidx25, align 2 47987d36c5dSDavid Green %conv26 = sext i16 %21 to i32 48087d36c5dSDavid Green %22 = load ptr, ptr %z.addr, align 8 48187d36c5dSDavid Green %23 = load i32, ptr %i, align 4 48287d36c5dSDavid Green %add27 = add nsw i32 %23, 2 48387d36c5dSDavid Green %idxprom28 = sext i32 %add27 to i64 48487d36c5dSDavid Green %arrayidx29 = getelementptr inbounds i16, ptr %22, i64 %idxprom28 48587d36c5dSDavid Green %24 = load i16, ptr %arrayidx29, align 2 48687d36c5dSDavid Green %conv30 = sext i16 %24 to i32 48787d36c5dSDavid Green %mul31 = mul nsw i32 %conv26, %conv30 48887d36c5dSDavid Green %25 = load ptr, ptr %x.addr, align 8 48987d36c5dSDavid Green %26 = load i32, ptr %i, align 4 49087d36c5dSDavid Green %add32 = add nsw i32 %26, 2 49187d36c5dSDavid Green %idxprom33 = sext i32 %add32 to i64 49287d36c5dSDavid Green %arrayidx34 = getelementptr inbounds i16, ptr %25, i64 %idxprom33 49387d36c5dSDavid Green %27 = load i16, ptr %arrayidx34, align 2 49487d36c5dSDavid Green %conv35 = sext i16 %27 to i32 49587d36c5dSDavid Green %add36 = add nsw i32 %conv35, %mul31 49687d36c5dSDavid Green %conv37 = trunc i32 %add36 to i16 49787d36c5dSDavid Green store i16 %conv37, ptr %arrayidx34, align 2 49887d36c5dSDavid Green %28 = load ptr, ptr %y.addr, align 8 49987d36c5dSDavid Green %29 = load i32, ptr %i, align 4 50087d36c5dSDavid Green %add38 = add nsw i32 %29, 3 50187d36c5dSDavid Green %idxprom39 = sext i32 %add38 to i64 50287d36c5dSDavid Green %arrayidx40 = getelementptr inbounds i16, ptr %28, i64 %idxprom39 50387d36c5dSDavid Green %30 = load i16, ptr %arrayidx40, align 2 50487d36c5dSDavid Green %conv41 = sext i16 %30 to i32 50587d36c5dSDavid Green %31 = load ptr, ptr %z.addr, align 8 50687d36c5dSDavid Green %32 = load i32, ptr %i, align 4 50787d36c5dSDavid Green %add42 = add nsw i32 %32, 3 50887d36c5dSDavid Green %idxprom43 = sext i32 %add42 to i64 50987d36c5dSDavid Green %arrayidx44 = getelementptr inbounds i16, ptr %31, i64 %idxprom43 51087d36c5dSDavid Green %33 = load i16, ptr %arrayidx44, align 2 51187d36c5dSDavid Green %conv45 = sext i16 %33 to i32 51287d36c5dSDavid Green %mul46 = mul nsw i32 %conv41, %conv45 51387d36c5dSDavid Green %34 = load ptr, ptr %x.addr, align 8 51487d36c5dSDavid Green %35 = load i32, ptr %i, align 4 51587d36c5dSDavid Green %add47 = add nsw i32 %35, 3 51687d36c5dSDavid Green %idxprom48 = sext i32 %add47 to i64 51787d36c5dSDavid Green %arrayidx49 = getelementptr inbounds i16, ptr %34, i64 %idxprom48 51887d36c5dSDavid Green %36 = load i16, ptr %arrayidx49, align 2 51987d36c5dSDavid Green %conv50 = sext i16 %36 to i32 52087d36c5dSDavid Green %add51 = add nsw i32 %conv50, %mul46 52187d36c5dSDavid Green %conv52 = trunc i32 %add51 to i16 52287d36c5dSDavid Green store i16 %conv52, ptr %arrayidx49, align 2 52387d36c5dSDavid Green br label %for.inc 52487d36c5dSDavid Green 52587d36c5dSDavid Greenfor.inc: 52687d36c5dSDavid Green %37 = load i32, ptr %i, align 4 52787d36c5dSDavid Green %add53 = add nsw i32 %37, 4 52887d36c5dSDavid Green store i32 %add53, ptr %i, align 4 52987d36c5dSDavid Green br label %for.cond 53087d36c5dSDavid Green 53187d36c5dSDavid Greenfor.end: 53287d36c5dSDavid Green ret void 53387d36c5dSDavid Green} 53487d36c5dSDavid Green 53587d36c5dSDavid Green; for(int i =0; i < 1024; i+=4) { 53687d36c5dSDavid Green; x[i] += y[i] * z[i]; 53787d36c5dSDavid Green; x[i+1] -= y[i+1] * z[i+1]; 53887d36c5dSDavid Green; x[i+2] += y[i+2] * z[i+2]; 53987d36c5dSDavid Green; x[i+3] -= y[i+3] * z[i+3]; 54087d36c5dSDavid Green; } 54187d36c5dSDavid Greendefine void @addsubsmul(ptr noalias noundef %x, ptr noundef %y, ptr noundef %z, i32 noundef %n) { 54287d36c5dSDavid Green; CHECK-LABEL: @addsubsmul( 54387d36c5dSDavid Green; CHECK-NEXT: entry: 54487d36c5dSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 54587d36c5dSDavid Green; CHECK: vector.body: 54687d36c5dSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 54787d36c5dSDavid Green; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 2 548*11571874SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i16, ptr [[Y:%.*]], i64 [[OFFSET_IDX]] 54987d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <32 x i16>, ptr [[TMP0]], align 2 550*11571874SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i16, ptr [[Z:%.*]], i64 [[OFFSET_IDX]] 55187d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC31:%.*]] = load <32 x i16>, ptr [[TMP1]], align 2 55287d36c5dSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 553*11571874SNikita Popov; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i16, ptr [[X:%.*]], i64 [[OFFSET_IDX]] 55487d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC36:%.*]] = load <32 x i16>, ptr [[TMP3]], align 2 55587d36c5dSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = add <32 x i16> [[TMP2]], [[WIDE_VEC36]] 556bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP5:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 557bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP6:%.*]] = sub <32 x i16> [[WIDE_VEC36]], [[TMP5]] 558bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP7:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 559bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP8:%.*]] = add <32 x i16> [[TMP7]], [[WIDE_VEC36]] 560bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP10:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 561bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP11:%.*]] = sub <32 x i16> [[WIDE_VEC36]], [[TMP10]] 562bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <32 x i16> [[TMP4]], <32 x i16> [[TMP6]], <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28, i32 33, i32 37, i32 41, i32 45, i32 49, i32 53, i32 57, i32 61> 563bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <32 x i16> [[TMP8]], <32 x i16> [[TMP11]], <16 x i32> <i32 2, i32 6, i32 10, i32 14, i32 18, i32 22, i32 26, i32 30, i32 35, i32 39, i32 43, i32 47, i32 51, i32 55, i32 59, i32 63> 564bddfbe74SSimon Pilgrim; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <16 x i16> [[TMP12]], <16 x i16> [[TMP13]], <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31> 5657f746518SFlorian Hahn; CHECK-NEXT: store <32 x i16> [[INTERLEAVED_VEC]], ptr [[TMP3]], align 2 56687d36c5dSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8 567bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 568bddfbe74SSimon Pilgrim; CHECK-NEXT: br i1 [[TMP14]], label [[FOR_END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]] 56987d36c5dSDavid Green; CHECK: for.end: 57087d36c5dSDavid Green; CHECK-NEXT: ret void 57187d36c5dSDavid Green; 57287d36c5dSDavid Greenentry: 57387d36c5dSDavid Green %x.addr = alloca ptr, align 8 57487d36c5dSDavid Green %y.addr = alloca ptr, align 8 57587d36c5dSDavid Green %z.addr = alloca ptr, align 8 57687d36c5dSDavid Green %n.addr = alloca i32, align 4 57787d36c5dSDavid Green %i = alloca i32, align 4 57887d36c5dSDavid Green store ptr %x, ptr %x.addr, align 8 57987d36c5dSDavid Green store ptr %y, ptr %y.addr, align 8 58087d36c5dSDavid Green store ptr %z, ptr %z.addr, align 8 58187d36c5dSDavid Green store i32 %n, ptr %n.addr, align 4 58287d36c5dSDavid Green store i32 0, ptr %i, align 4 58387d36c5dSDavid Green br label %for.cond 58487d36c5dSDavid Green 58587d36c5dSDavid Greenfor.cond: 58687d36c5dSDavid Green %0 = load i32, ptr %i, align 4 58787d36c5dSDavid Green %cmp = icmp slt i32 %0, 1024 58887d36c5dSDavid Green br i1 %cmp, label %for.body, label %for.end 58987d36c5dSDavid Green 59087d36c5dSDavid Greenfor.body: 59187d36c5dSDavid Green %1 = load ptr, ptr %y.addr, align 8 59287d36c5dSDavid Green %2 = load i32, ptr %i, align 4 59387d36c5dSDavid Green %idxprom = sext i32 %2 to i64 59487d36c5dSDavid Green %arrayidx = getelementptr inbounds i16, ptr %1, i64 %idxprom 59587d36c5dSDavid Green %3 = load i16, ptr %arrayidx, align 2 59687d36c5dSDavid Green %conv = sext i16 %3 to i32 59787d36c5dSDavid Green %4 = load ptr, ptr %z.addr, align 8 59887d36c5dSDavid Green %5 = load i32, ptr %i, align 4 59987d36c5dSDavid Green %idxprom1 = sext i32 %5 to i64 60087d36c5dSDavid Green %arrayidx2 = getelementptr inbounds i16, ptr %4, i64 %idxprom1 60187d36c5dSDavid Green %6 = load i16, ptr %arrayidx2, align 2 60287d36c5dSDavid Green %conv3 = sext i16 %6 to i32 60387d36c5dSDavid Green %mul = mul nsw i32 %conv, %conv3 60487d36c5dSDavid Green %7 = load ptr, ptr %x.addr, align 8 60587d36c5dSDavid Green %8 = load i32, ptr %i, align 4 60687d36c5dSDavid Green %idxprom4 = sext i32 %8 to i64 60787d36c5dSDavid Green %arrayidx5 = getelementptr inbounds i16, ptr %7, i64 %idxprom4 60887d36c5dSDavid Green %9 = load i16, ptr %arrayidx5, align 2 60987d36c5dSDavid Green %conv6 = sext i16 %9 to i32 61087d36c5dSDavid Green %add = add nsw i32 %conv6, %mul 61187d36c5dSDavid Green %conv7 = trunc i32 %add to i16 61287d36c5dSDavid Green store i16 %conv7, ptr %arrayidx5, align 2 61387d36c5dSDavid Green %10 = load ptr, ptr %y.addr, align 8 61487d36c5dSDavid Green %11 = load i32, ptr %i, align 4 61587d36c5dSDavid Green %add8 = add nsw i32 %11, 1 61687d36c5dSDavid Green %idxprom9 = sext i32 %add8 to i64 61787d36c5dSDavid Green %arrayidx10 = getelementptr inbounds i16, ptr %10, i64 %idxprom9 61887d36c5dSDavid Green %12 = load i16, ptr %arrayidx10, align 2 61987d36c5dSDavid Green %conv11 = sext i16 %12 to i32 62087d36c5dSDavid Green %13 = load ptr, ptr %z.addr, align 8 62187d36c5dSDavid Green %14 = load i32, ptr %i, align 4 62287d36c5dSDavid Green %add12 = add nsw i32 %14, 1 62387d36c5dSDavid Green %idxprom13 = sext i32 %add12 to i64 62487d36c5dSDavid Green %arrayidx14 = getelementptr inbounds i16, ptr %13, i64 %idxprom13 62587d36c5dSDavid Green %15 = load i16, ptr %arrayidx14, align 2 62687d36c5dSDavid Green %conv15 = sext i16 %15 to i32 62787d36c5dSDavid Green %mul16 = mul nsw i32 %conv11, %conv15 62887d36c5dSDavid Green %16 = load ptr, ptr %x.addr, align 8 62987d36c5dSDavid Green %17 = load i32, ptr %i, align 4 63087d36c5dSDavid Green %add17 = add nsw i32 %17, 1 63187d36c5dSDavid Green %idxprom18 = sext i32 %add17 to i64 63287d36c5dSDavid Green %arrayidx19 = getelementptr inbounds i16, ptr %16, i64 %idxprom18 63387d36c5dSDavid Green %18 = load i16, ptr %arrayidx19, align 2 63487d36c5dSDavid Green %conv20 = sext i16 %18 to i32 63587d36c5dSDavid Green %sub = sub nsw i32 %conv20, %mul16 63687d36c5dSDavid Green %conv21 = trunc i32 %sub to i16 63787d36c5dSDavid Green store i16 %conv21, ptr %arrayidx19, align 2 63887d36c5dSDavid Green %19 = load ptr, ptr %y.addr, align 8 63987d36c5dSDavid Green %20 = load i32, ptr %i, align 4 64087d36c5dSDavid Green %add22 = add nsw i32 %20, 2 64187d36c5dSDavid Green %idxprom23 = sext i32 %add22 to i64 64287d36c5dSDavid Green %arrayidx24 = getelementptr inbounds i16, ptr %19, i64 %idxprom23 64387d36c5dSDavid Green %21 = load i16, ptr %arrayidx24, align 2 64487d36c5dSDavid Green %conv25 = sext i16 %21 to i32 64587d36c5dSDavid Green %22 = load ptr, ptr %z.addr, align 8 64687d36c5dSDavid Green %23 = load i32, ptr %i, align 4 64787d36c5dSDavid Green %add26 = add nsw i32 %23, 2 64887d36c5dSDavid Green %idxprom27 = sext i32 %add26 to i64 64987d36c5dSDavid Green %arrayidx28 = getelementptr inbounds i16, ptr %22, i64 %idxprom27 65087d36c5dSDavid Green %24 = load i16, ptr %arrayidx28, align 2 65187d36c5dSDavid Green %conv29 = sext i16 %24 to i32 65287d36c5dSDavid Green %mul30 = mul nsw i32 %conv25, %conv29 65387d36c5dSDavid Green %25 = load ptr, ptr %x.addr, align 8 65487d36c5dSDavid Green %26 = load i32, ptr %i, align 4 65587d36c5dSDavid Green %add31 = add nsw i32 %26, 2 65687d36c5dSDavid Green %idxprom32 = sext i32 %add31 to i64 65787d36c5dSDavid Green %arrayidx33 = getelementptr inbounds i16, ptr %25, i64 %idxprom32 65887d36c5dSDavid Green %27 = load i16, ptr %arrayidx33, align 2 65987d36c5dSDavid Green %conv34 = sext i16 %27 to i32 66087d36c5dSDavid Green %add35 = add nsw i32 %conv34, %mul30 66187d36c5dSDavid Green %conv36 = trunc i32 %add35 to i16 66287d36c5dSDavid Green store i16 %conv36, ptr %arrayidx33, align 2 66387d36c5dSDavid Green %28 = load ptr, ptr %y.addr, align 8 66487d36c5dSDavid Green %29 = load i32, ptr %i, align 4 66587d36c5dSDavid Green %add37 = add nsw i32 %29, 3 66687d36c5dSDavid Green %idxprom38 = sext i32 %add37 to i64 66787d36c5dSDavid Green %arrayidx39 = getelementptr inbounds i16, ptr %28, i64 %idxprom38 66887d36c5dSDavid Green %30 = load i16, ptr %arrayidx39, align 2 66987d36c5dSDavid Green %conv40 = sext i16 %30 to i32 67087d36c5dSDavid Green %31 = load ptr, ptr %z.addr, align 8 67187d36c5dSDavid Green %32 = load i32, ptr %i, align 4 67287d36c5dSDavid Green %add41 = add nsw i32 %32, 3 67387d36c5dSDavid Green %idxprom42 = sext i32 %add41 to i64 67487d36c5dSDavid Green %arrayidx43 = getelementptr inbounds i16, ptr %31, i64 %idxprom42 67587d36c5dSDavid Green %33 = load i16, ptr %arrayidx43, align 2 67687d36c5dSDavid Green %conv44 = sext i16 %33 to i32 67787d36c5dSDavid Green %mul45 = mul nsw i32 %conv40, %conv44 67887d36c5dSDavid Green %34 = load ptr, ptr %x.addr, align 8 67987d36c5dSDavid Green %35 = load i32, ptr %i, align 4 68087d36c5dSDavid Green %add46 = add nsw i32 %35, 3 68187d36c5dSDavid Green %idxprom47 = sext i32 %add46 to i64 68287d36c5dSDavid Green %arrayidx48 = getelementptr inbounds i16, ptr %34, i64 %idxprom47 68387d36c5dSDavid Green %36 = load i16, ptr %arrayidx48, align 2 68487d36c5dSDavid Green %conv49 = sext i16 %36 to i32 68587d36c5dSDavid Green %sub50 = sub nsw i32 %conv49, %mul45 68687d36c5dSDavid Green %conv51 = trunc i32 %sub50 to i16 68787d36c5dSDavid Green store i16 %conv51, ptr %arrayidx48, align 2 68887d36c5dSDavid Green br label %for.inc 68987d36c5dSDavid Green 69087d36c5dSDavid Greenfor.inc: 69187d36c5dSDavid Green %37 = load i32, ptr %i, align 4 69287d36c5dSDavid Green %add52 = add nsw i32 %37, 4 69387d36c5dSDavid Green store i32 %add52, ptr %i, align 4 69487d36c5dSDavid Green br label %for.cond 69587d36c5dSDavid Green 69687d36c5dSDavid Greenfor.end: 69787d36c5dSDavid Green ret void 69887d36c5dSDavid Green} 69987d36c5dSDavid Green 70087d36c5dSDavid Green; for(int i =0; i < 1024; i+=4) { 70187d36c5dSDavid Green; x[i] += y[i] * z[i]; 70287d36c5dSDavid Green; x[i+1] += y[i+1] * z[i+1]; 70387d36c5dSDavid Green; x[i+2] -= y[i+2] * z[i+2]; 70487d36c5dSDavid Green; x[i+3] -= y[i+3] * z[i+3]; 70587d36c5dSDavid Green; } 70687d36c5dSDavid Greendefine void @add2sub2mul(ptr noalias noundef %x, ptr noundef %y, ptr noundef %z, i32 noundef %n) { 70787d36c5dSDavid Green; CHECK-LABEL: @add2sub2mul( 70887d36c5dSDavid Green; CHECK-NEXT: entry: 70987d36c5dSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 71087d36c5dSDavid Green; CHECK: vector.body: 71187d36c5dSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 71287d36c5dSDavid Green; CHECK-NEXT: [[OFFSET_IDX:%.*]] = shl i64 [[INDEX]], 2 713*11571874SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i16, ptr [[Y:%.*]], i64 [[OFFSET_IDX]] 71487d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <32 x i16>, ptr [[TMP0]], align 2 715*11571874SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i16, ptr [[Z:%.*]], i64 [[OFFSET_IDX]] 71687d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC31:%.*]] = load <32 x i16>, ptr [[TMP1]], align 2 71787d36c5dSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 718*11571874SNikita Popov; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i16, ptr [[X:%.*]], i64 [[OFFSET_IDX]] 71987d36c5dSDavid Green; CHECK-NEXT: [[WIDE_VEC36:%.*]] = load <32 x i16>, ptr [[TMP3]], align 2 72087d36c5dSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = add <32 x i16> [[TMP2]], [[WIDE_VEC36]] 721bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP5:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 722bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP6:%.*]] = add <32 x i16> [[TMP5]], [[WIDE_VEC36]] 723bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP7:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 724bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP8:%.*]] = sub <32 x i16> [[WIDE_VEC36]], [[TMP7]] 725bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP10:%.*]] = mul <32 x i16> [[WIDE_VEC31]], [[WIDE_VEC]] 726bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP11:%.*]] = sub <32 x i16> [[WIDE_VEC36]], [[TMP10]] 727bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <32 x i16> [[TMP4]], <32 x i16> [[TMP6]], <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28, i32 33, i32 37, i32 41, i32 45, i32 49, i32 53, i32 57, i32 61> 728bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <32 x i16> [[TMP8]], <32 x i16> [[TMP11]], <16 x i32> <i32 2, i32 6, i32 10, i32 14, i32 18, i32 22, i32 26, i32 30, i32 35, i32 39, i32 43, i32 47, i32 51, i32 55, i32 59, i32 63> 729bddfbe74SSimon Pilgrim; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <16 x i16> [[TMP12]], <16 x i16> [[TMP13]], <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31> 7307f746518SFlorian Hahn; CHECK-NEXT: store <32 x i16> [[INTERLEAVED_VEC]], ptr [[TMP3]], align 2 73187d36c5dSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8 732bddfbe74SSimon Pilgrim; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256 733bddfbe74SSimon Pilgrim; CHECK-NEXT: br i1 [[TMP14]], label [[FOR_END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]] 73487d36c5dSDavid Green; CHECK: for.end: 73587d36c5dSDavid Green; CHECK-NEXT: ret void 73687d36c5dSDavid Green; 73787d36c5dSDavid Greenentry: 73887d36c5dSDavid Green %x.addr = alloca ptr, align 8 73987d36c5dSDavid Green %y.addr = alloca ptr, align 8 74087d36c5dSDavid Green %z.addr = alloca ptr, align 8 74187d36c5dSDavid Green %n.addr = alloca i32, align 4 74287d36c5dSDavid Green %i = alloca i32, align 4 74387d36c5dSDavid Green store ptr %x, ptr %x.addr, align 8 74487d36c5dSDavid Green store ptr %y, ptr %y.addr, align 8 74587d36c5dSDavid Green store ptr %z, ptr %z.addr, align 8 74687d36c5dSDavid Green store i32 %n, ptr %n.addr, align 4 74787d36c5dSDavid Green store i32 0, ptr %i, align 4 74887d36c5dSDavid Green br label %for.cond 74987d36c5dSDavid Green 75087d36c5dSDavid Greenfor.cond: 75187d36c5dSDavid Green %0 = load i32, ptr %i, align 4 75287d36c5dSDavid Green %cmp = icmp slt i32 %0, 1024 75387d36c5dSDavid Green br i1 %cmp, label %for.body, label %for.end 75487d36c5dSDavid Green 75587d36c5dSDavid Greenfor.body: 75687d36c5dSDavid Green %1 = load ptr, ptr %y.addr, align 8 75787d36c5dSDavid Green %2 = load i32, ptr %i, align 4 75887d36c5dSDavid Green %idxprom = sext i32 %2 to i64 75987d36c5dSDavid Green %arrayidx = getelementptr inbounds i16, ptr %1, i64 %idxprom 76087d36c5dSDavid Green %3 = load i16, ptr %arrayidx, align 2 76187d36c5dSDavid Green %conv = sext i16 %3 to i32 76287d36c5dSDavid Green %4 = load ptr, ptr %z.addr, align 8 76387d36c5dSDavid Green %5 = load i32, ptr %i, align 4 76487d36c5dSDavid Green %idxprom1 = sext i32 %5 to i64 76587d36c5dSDavid Green %arrayidx2 = getelementptr inbounds i16, ptr %4, i64 %idxprom1 76687d36c5dSDavid Green %6 = load i16, ptr %arrayidx2, align 2 76787d36c5dSDavid Green %conv3 = sext i16 %6 to i32 76887d36c5dSDavid Green %mul = mul nsw i32 %conv, %conv3 76987d36c5dSDavid Green %7 = load ptr, ptr %x.addr, align 8 77087d36c5dSDavid Green %8 = load i32, ptr %i, align 4 77187d36c5dSDavid Green %idxprom4 = sext i32 %8 to i64 77287d36c5dSDavid Green %arrayidx5 = getelementptr inbounds i16, ptr %7, i64 %idxprom4 77387d36c5dSDavid Green %9 = load i16, ptr %arrayidx5, align 2 77487d36c5dSDavid Green %conv6 = sext i16 %9 to i32 77587d36c5dSDavid Green %add = add nsw i32 %conv6, %mul 77687d36c5dSDavid Green %conv7 = trunc i32 %add to i16 77787d36c5dSDavid Green store i16 %conv7, ptr %arrayidx5, align 2 77887d36c5dSDavid Green %10 = load ptr, ptr %y.addr, align 8 77987d36c5dSDavid Green %11 = load i32, ptr %i, align 4 78087d36c5dSDavid Green %add8 = add nsw i32 %11, 1 78187d36c5dSDavid Green %idxprom9 = sext i32 %add8 to i64 78287d36c5dSDavid Green %arrayidx10 = getelementptr inbounds i16, ptr %10, i64 %idxprom9 78387d36c5dSDavid Green %12 = load i16, ptr %arrayidx10, align 2 78487d36c5dSDavid Green %conv11 = sext i16 %12 to i32 78587d36c5dSDavid Green %13 = load ptr, ptr %z.addr, align 8 78687d36c5dSDavid Green %14 = load i32, ptr %i, align 4 78787d36c5dSDavid Green %add12 = add nsw i32 %14, 1 78887d36c5dSDavid Green %idxprom13 = sext i32 %add12 to i64 78987d36c5dSDavid Green %arrayidx14 = getelementptr inbounds i16, ptr %13, i64 %idxprom13 79087d36c5dSDavid Green %15 = load i16, ptr %arrayidx14, align 2 79187d36c5dSDavid Green %conv15 = sext i16 %15 to i32 79287d36c5dSDavid Green %mul16 = mul nsw i32 %conv11, %conv15 79387d36c5dSDavid Green %16 = load ptr, ptr %x.addr, align 8 79487d36c5dSDavid Green %17 = load i32, ptr %i, align 4 79587d36c5dSDavid Green %add17 = add nsw i32 %17, 1 79687d36c5dSDavid Green %idxprom18 = sext i32 %add17 to i64 79787d36c5dSDavid Green %arrayidx19 = getelementptr inbounds i16, ptr %16, i64 %idxprom18 79887d36c5dSDavid Green %18 = load i16, ptr %arrayidx19, align 2 79987d36c5dSDavid Green %conv20 = sext i16 %18 to i32 80087d36c5dSDavid Green %add21 = add nsw i32 %conv20, %mul16 80187d36c5dSDavid Green %conv22 = trunc i32 %add21 to i16 80287d36c5dSDavid Green store i16 %conv22, ptr %arrayidx19, align 2 80387d36c5dSDavid Green %19 = load ptr, ptr %y.addr, align 8 80487d36c5dSDavid Green %20 = load i32, ptr %i, align 4 80587d36c5dSDavid Green %add23 = add nsw i32 %20, 2 80687d36c5dSDavid Green %idxprom24 = sext i32 %add23 to i64 80787d36c5dSDavid Green %arrayidx25 = getelementptr inbounds i16, ptr %19, i64 %idxprom24 80887d36c5dSDavid Green %21 = load i16, ptr %arrayidx25, align 2 80987d36c5dSDavid Green %conv26 = sext i16 %21 to i32 81087d36c5dSDavid Green %22 = load ptr, ptr %z.addr, align 8 81187d36c5dSDavid Green %23 = load i32, ptr %i, align 4 81287d36c5dSDavid Green %add27 = add nsw i32 %23, 2 81387d36c5dSDavid Green %idxprom28 = sext i32 %add27 to i64 81487d36c5dSDavid Green %arrayidx29 = getelementptr inbounds i16, ptr %22, i64 %idxprom28 81587d36c5dSDavid Green %24 = load i16, ptr %arrayidx29, align 2 81687d36c5dSDavid Green %conv30 = sext i16 %24 to i32 81787d36c5dSDavid Green %mul31 = mul nsw i32 %conv26, %conv30 81887d36c5dSDavid Green %25 = load ptr, ptr %x.addr, align 8 81987d36c5dSDavid Green %26 = load i32, ptr %i, align 4 82087d36c5dSDavid Green %add32 = add nsw i32 %26, 2 82187d36c5dSDavid Green %idxprom33 = sext i32 %add32 to i64 82287d36c5dSDavid Green %arrayidx34 = getelementptr inbounds i16, ptr %25, i64 %idxprom33 82387d36c5dSDavid Green %27 = load i16, ptr %arrayidx34, align 2 82487d36c5dSDavid Green %conv35 = sext i16 %27 to i32 82587d36c5dSDavid Green %sub = sub nsw i32 %conv35, %mul31 82687d36c5dSDavid Green %conv36 = trunc i32 %sub to i16 82787d36c5dSDavid Green store i16 %conv36, ptr %arrayidx34, align 2 82887d36c5dSDavid Green %28 = load ptr, ptr %y.addr, align 8 82987d36c5dSDavid Green %29 = load i32, ptr %i, align 4 83087d36c5dSDavid Green %add37 = add nsw i32 %29, 3 83187d36c5dSDavid Green %idxprom38 = sext i32 %add37 to i64 83287d36c5dSDavid Green %arrayidx39 = getelementptr inbounds i16, ptr %28, i64 %idxprom38 83387d36c5dSDavid Green %30 = load i16, ptr %arrayidx39, align 2 83487d36c5dSDavid Green %conv40 = sext i16 %30 to i32 83587d36c5dSDavid Green %31 = load ptr, ptr %z.addr, align 8 83687d36c5dSDavid Green %32 = load i32, ptr %i, align 4 83787d36c5dSDavid Green %add41 = add nsw i32 %32, 3 83887d36c5dSDavid Green %idxprom42 = sext i32 %add41 to i64 83987d36c5dSDavid Green %arrayidx43 = getelementptr inbounds i16, ptr %31, i64 %idxprom42 84087d36c5dSDavid Green %33 = load i16, ptr %arrayidx43, align 2 84187d36c5dSDavid Green %conv44 = sext i16 %33 to i32 84287d36c5dSDavid Green %mul45 = mul nsw i32 %conv40, %conv44 84387d36c5dSDavid Green %34 = load ptr, ptr %x.addr, align 8 84487d36c5dSDavid Green %35 = load i32, ptr %i, align 4 84587d36c5dSDavid Green %add46 = add nsw i32 %35, 3 84687d36c5dSDavid Green %idxprom47 = sext i32 %add46 to i64 84787d36c5dSDavid Green %arrayidx48 = getelementptr inbounds i16, ptr %34, i64 %idxprom47 84887d36c5dSDavid Green %36 = load i16, ptr %arrayidx48, align 2 84987d36c5dSDavid Green %conv49 = sext i16 %36 to i32 85087d36c5dSDavid Green %sub50 = sub nsw i32 %conv49, %mul45 85187d36c5dSDavid Green %conv51 = trunc i32 %sub50 to i16 85287d36c5dSDavid Green store i16 %conv51, ptr %arrayidx48, align 2 85387d36c5dSDavid Green br label %for.inc 85487d36c5dSDavid Green 85587d36c5dSDavid Greenfor.inc: 85687d36c5dSDavid Green %37 = load i32, ptr %i, align 4 85787d36c5dSDavid Green %add52 = add nsw i32 %37, 4 85887d36c5dSDavid Green store i32 %add52, ptr %i, align 4 85987d36c5dSDavid Green br label %for.cond 86087d36c5dSDavid Green 86187d36c5dSDavid Greenfor.end: 86287d36c5dSDavid Green ret void 86387d36c5dSDavid Green} 864