| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes=slp-vectorizer -mtriple=thumbv8.1m.main-unknown-none-eabihf -S -mattr=+mve < %s | FileCheck %s |
| |
| define void @test(ptr %p) { |
| ; CHECK-LABEL: define void @test( |
| ; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: br label %[[LOOP:.*]] |
| ; CHECK: [[LOOP]]: |
| ; CHECK-NEXT: [[I0:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[N0:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[N1:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[I2:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[N2:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[I3:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[N3:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[NIV:%.*]], %[[LOOP]] ] |
| ; CHECK-NEXT: [[A0:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 0, ptr [[A0]], align 1 |
| ; CHECK-NEXT: [[A1:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 1, ptr [[A1]], align 1 |
| ; CHECK-NEXT: [[A2:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 2, ptr [[A2]], align 1 |
| ; CHECK-NEXT: [[A3:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 3, ptr [[A3]], align 1 |
| ; CHECK-NEXT: [[A4:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 4, ptr [[A4]], align 1 |
| ; CHECK-NEXT: [[A5:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 5, ptr [[A5]], align 1 |
| ; CHECK-NEXT: [[A6:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 6, ptr [[A6]], align 1 |
| ; CHECK-NEXT: [[A7:%.*]] = getelementptr i8, ptr [[P]], i32 [[TMP1]] |
| ; CHECK-NEXT: store i8 7, ptr [[A7]], align 1 |
| ; CHECK-NEXT: [[N0]] = add nuw nsw i32 [[I0]], 32 |
| ; CHECK-NEXT: [[N1]] = add nuw nsw i32 [[TMP1]], 16 |
| ; CHECK-NEXT: [[N2]] = add nuw nsw i32 [[I2]], 32 |
| ; CHECK-NEXT: [[N3]] = add nuw nsw i32 [[I3]], 32 |
| ; CHECK-NEXT: [[NIV]] = add nuw nsw i32 [[IV]], 16 |
| ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[NIV]], 512 |
| ; CHECK-NEXT: br i1 [[C]], label %[[EXIT:.*]], label %[[LOOP]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %loop |
| |
| loop: |
| %i0 = phi i32 [ 0, %entry ], [ %n0, %loop ] |
| %i1 = phi i32 [ 0, %entry ], [ %n1, %loop ] |
| %i2 = phi i32 [ 0, %entry ], [ %n2, %loop ] |
| %i3 = phi i32 [ 0, %entry ], [ %n3, %loop ] |
| %iv = phi i32 [ 0, %entry ], [ %niv, %loop ] |
| %a0 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 0, ptr %a0, align 1 |
| %a1 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 1, ptr %a1, align 1 |
| %a2 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 2, ptr %a2, align 1 |
| %a3 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 3, ptr %a3, align 1 |
| %a4 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 4, ptr %a4, align 1 |
| %a5 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 5, ptr %a5, align 1 |
| %a6 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 6, ptr %a6, align 1 |
| %a7 = getelementptr i8, ptr %p, i32 %i1 |
| store i8 7, ptr %a7, align 1 |
| %n0 = add nuw nsw i32 %i0, 32 |
| %n1 = add nuw nsw i32 %i1, 16 |
| %n2 = add nuw nsw i32 %i2, 32 |
| %n3 = add nuw nsw i32 %i3, 32 |
| %niv = add nuw nsw i32 %iv, 16 |
| %c = icmp eq i32 %niv, 512 |
| br i1 %c, label %exit, label %loop |
| |
| exit: |
| ret void |
| } |