xref: /llvm-project/llvm/test/Transforms/PhaseOrdering/AArch64/interleavevectorization.ll (revision 1157187496afbbb203b8ec7aa320769ec6eed8c4)
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