Tests exercizing TBAA metadata (both purposefully and not), and previously generated via UTC, have been regenerated and updated to version 6.
86 lines
4.2 KiB
LLVM
86 lines
4.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt < %s -passes=slp-vectorizer -S | FileCheck %s
|
|
|
|
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
|
target triple = "aarch64"
|
|
|
|
%struct.node = type { i64, i64, ptr, ptr }
|
|
|
|
define void @copy(ptr nocapture noundef writeonly %x, ptr nocapture noundef readonly %y, i32 noundef %n) {
|
|
; CHECK-LABEL: define void @copy(
|
|
; CHECK-SAME: ptr noundef writeonly captures(none) [[X:%.*]], ptr noundef readonly captures(none) [[Y:%.*]], i32 noundef [[N:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[CMP34:%.*]] = icmp sgt i32 [[N]], 0
|
|
; CHECK-NEXT: br i1 [[CMP34]], label %[[FOR_BODY_PREHEADER:.*]], label %[[FOR_COND_CLEANUP:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[N]] to i64
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_NODE:%.*]], ptr [[Y]], i64 [[INDVARS_IV]]
|
|
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds [[STRUCT_NODE]], ptr [[X]], i64 [[INDVARS_IV]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[ARRAYIDX]], align 8, !tbaa [[LONG_TBAA0:![0-9]+]]
|
|
; CHECK-NEXT: store <2 x i64> [[TMP0]], ptr [[ARRAYIDX2]], align 8, !tbaa [[LONG_TBAA0]]
|
|
; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_NODE]], ptr [[Y]], i64 [[INDVARS_IV]], i32 2
|
|
; CHECK-NEXT: [[C13:%.*]] = getelementptr inbounds [[STRUCT_NODE]], ptr [[X]], i64 [[INDVARS_IV]], i32 2
|
|
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x ptr>, ptr [[C]], align 8, !tbaa [[ANYPTR_TBAA4:![0-9]+]]
|
|
; CHECK-NEXT: store <2 x ptr> [[TMP1]], ptr [[C13]], align 8, !tbaa [[ANYPTR_TBAA4]]
|
|
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
|
|
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]
|
|
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
|
|
;
|
|
entry:
|
|
%cmp34 = icmp sgt i32 %n, 0
|
|
br i1 %cmp34, label %for.body.preheader, label %for.cond.cleanup
|
|
|
|
for.body.preheader:
|
|
%wide.trip.count = zext i32 %n to i64
|
|
br label %for.body
|
|
|
|
for.cond.cleanup:
|
|
ret void
|
|
|
|
for.body:
|
|
%indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
|
|
%arrayidx = getelementptr inbounds %struct.node, ptr %y, i64 %indvars.iv
|
|
%0 = load i64, ptr %arrayidx, align 8, !tbaa !4
|
|
%arrayidx2 = getelementptr inbounds %struct.node, ptr %x, i64 %indvars.iv
|
|
store i64 %0, ptr %arrayidx2, align 8, !tbaa !4
|
|
%b = getelementptr inbounds %struct.node, ptr %y, i64 %indvars.iv, i32 1
|
|
%1 = load i64, ptr %b, align 8, !tbaa !10
|
|
%b8 = getelementptr inbounds %struct.node, ptr %x, i64 %indvars.iv, i32 1
|
|
store i64 %1, ptr %b8, align 8, !tbaa !10
|
|
%c = getelementptr inbounds %struct.node, ptr %y, i64 %indvars.iv, i32 2
|
|
%2 = load ptr, ptr %c, align 8, !tbaa !11
|
|
%c13 = getelementptr inbounds %struct.node, ptr %x, i64 %indvars.iv, i32 2
|
|
store ptr %2, ptr %c13, align 8, !tbaa !11
|
|
%d = getelementptr inbounds %struct.node, ptr %y, i64 %indvars.iv, i32 3
|
|
%3 = load ptr, ptr %d, align 8, !tbaa !12
|
|
%d18 = getelementptr inbounds %struct.node, ptr %x, i64 %indvars.iv, i32 3
|
|
store ptr %3, ptr %d18, align 8, !tbaa !12
|
|
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
|
|
%exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
|
|
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
|
|
}
|
|
|
|
!4 = !{!5, !6, i64 0}
|
|
!5 = !{!"", !6, i64 0, !6, i64 8, !9, i64 16, !9, i64 24}
|
|
!6 = !{!"long", !7, i64 0}
|
|
!7 = !{!"omnipotent char", !8, i64 0}
|
|
!8 = !{!"Simple C/C++ TBAA"}
|
|
!9 = !{!"any pointer", !7, i64 0}
|
|
!10 = !{!5, !6, i64 8}
|
|
!11 = !{!5, !9, i64 16}
|
|
!12 = !{!5, !9, i64 24}
|
|
|
|
;.
|
|
; CHECK: [[LONG_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
|
|
; CHECK: [[META1]] = !{!"long", [[META2:![0-9]+]], i64 0}
|
|
; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0}
|
|
; CHECK: [[META3]] = !{!"Simple C/C++ TBAA"}
|
|
; CHECK: [[ANYPTR_TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
|
|
; CHECK: [[META5]] = !{!"any pointer", [[META2]], i64 0}
|
|
;.
|