blob: 39d573208e7b68f6e935e9ffba5f369b196bc32a [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -S | FileCheck %s
define void @store_unsignedptr(ptr %ptr) {
; CHECK-LABEL: define void @store_unsignedptr(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: store ptr null, ptr [[PTR]], align 8, !tbaa [[INTPTR_TBAA0:![0-9]+]]
; CHECK-NEXT: ret void
;
entry:
store ptr null, ptr %ptr, align 8, !tbaa !0
ret void
}
define void @store_char(ptr %ptr) {
; CHECK-LABEL: define void @store_char(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: store i8 0, ptr [[PTR]], align 1, !tbaa [[CHAR_TBAA5:![0-9]+]]
; CHECK-NEXT: ret void
;
entry:
store i8 0, ptr %ptr, align 1, !tbaa !5
ret void
}
define float @ptr_to_float(ptr %ptr) {
; CHECK-LABEL: define float @ptr_to_float(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: store float 0.000000e+00, ptr [[PTR]], align 4, !tbaa [[FLOAT_TBAA6:![0-9]+]]
; CHECK-NEXT: call void @opaque(ptr [[PTR]])
; CHECK-NEXT: [[VAL:%.*]] = load float, ptr [[PTR]], align 4, !tbaa [[FLOAT_TBAA6]]
; CHECK-NEXT: ret float [[VAL]]
;
entry:
store float 0.000000e+00, ptr %ptr, align 4, !tbaa !6
call void @opaque(ptr %ptr)
%val = load float, ptr %ptr, align 4, !tbaa !6
ret float %val
}
define i64 @ptr_to_longlong(ptr %ptr) {
; CHECK-LABEL: define i64 @ptr_to_longlong(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[PTR]], align 8, !tbaa [[LONG_LONG_TBAA8:![0-9]+]]
; CHECK-NEXT: store i64 0, ptr [[PTR]], align 8, !tbaa [[LONG_LONG_TBAA8]]
; CHECK-NEXT: ret i64 [[VAL]]
;
entry:
%val = load i64, ptr %ptr, align 8, !tbaa !8
store i64 0, ptr %ptr, align 8, !tbaa !8
ret i64 %val
}
; struct STRUCT1 {
; int x;
; int y;
; };
define void @store_struct1ptr(ptr %ptr) {
; CHECK-LABEL: define void @store_struct1ptr(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: store ptr null, ptr [[PTR]], align 8, !tbaa [[_ZTS7STRUCT1PTR_TBAA10:![0-9]+]]
; CHECK-NEXT: ret void
;
entry:
; *(struct STRUCT1 **)ptr = 0;
store ptr null, ptr %ptr, align 8, !tbaa !10
ret void
}
; struct STRUCT2 {
; struct STRUCT1 *s;
; };
define void @store_struct2(ptr %ptr) {
; CHECK-LABEL: define void @store_struct2(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: store ptr null, ptr [[PTR]], align 8, !tbaa [[_ZTS7STRUCT1PTR_TBAA12:![0-9]+]]
; CHECK-NEXT: ret void
;
entry:
; ptr->s = 0;
store ptr null, ptr %ptr, align 8, !tbaa !12
ret void
}
define double @access_matrix(ptr %ptr) {
; CHECK-LABEL: define double @access_matrix(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[ALLOCA_PTR:%.*]] = alloca ptr, align 8
; CHECK-NEXT: store ptr [[PTR]], ptr [[ALLOCA_PTR]], align 8, !tbaa [[ANYPTR_TBAA14:![0-9]+]]
; CHECK-NEXT: [[PTR_IDX:%.*]] = load ptr, ptr [[ALLOCA_PTR]], align 8, !tbaa [[ANYPTR_TBAA14]]
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds ptr, ptr [[PTR_IDX]], i64 4
; CHECK-NEXT: [[PTR_IDX_1:%.*]] = load ptr, ptr [[ADD_PTR]], align 8, !tbaa [[ANYPTR_TBAA16:![0-9]+]]
; CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds [6 x double], ptr [[PTR_IDX_1]], i64 6
; CHECK-NEXT: [[PTR_IDX_2:%.*]] = load <6 x double>, ptr [[ADD_PTR1]], align 8, !tbaa [[CHAR_TBAA5]]
; CHECK-NEXT: [[MATRIXEXT:%.*]] = extractelement <6 x double> [[PTR_IDX_2]], i64 5
; CHECK-NEXT: ret double [[MATRIXEXT]]
;
entry:
%alloca.ptr = alloca ptr, align 8
store ptr %ptr, ptr %alloca.ptr, align 8, !tbaa !14
%ptr.idx = load ptr, ptr %alloca.ptr, align 8, !tbaa !14
%add.ptr = getelementptr inbounds ptr, ptr %ptr.idx, i64 4
%ptr.idx.1 = load ptr, ptr %add.ptr, align 8, !tbaa !16
%add.ptr1 = getelementptr inbounds [6 x double], ptr %ptr.idx.1, i64 6
%ptr.idx.2 = load <6 x double>, ptr %add.ptr1, align 8, !tbaa !5
%matrixext = extractelement <6 x double> %ptr.idx.2, i64 5
ret double %matrixext
}
declare void @opaque(ptr)
!0 = !{!1, !1, i64 0}
!1 = !{!"p1 int", !2, i64 0}
!2 = !{!"any pointer", !3, i64 0}
!3 = !{!"omnipotent char", !4, i64 0}
!4 = !{!"Simple C/C++ TBAA"}
!5 = !{!3, !3, i64 0}
!6 = !{!7, !7, i64 0}
!7 = !{!"float", !3, i64 0}
!8 = !{!9, !9, i64 0}
!9 = !{!"long long", !3, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"p1 _ZTS7STRUCT1", !2, i64 0}
!12 = !{!13, !11, i64 0}
!13 = !{!"STRUCT2", !11, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"any p2 pointer", !2, i64 0}
!16 = !{!2, !2, i64 0}
;.
; CHECK: [[INTPTR_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
; CHECK: [[META1]] = !{!"p1 int", [[META2:![0-9]+]], i64 0}
; CHECK: [[META2]] = !{!"any pointer", [[META3:![0-9]+]], i64 0}
; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0}
; CHECK: [[META4]] = !{!"Simple C/C++ TBAA"}
; CHECK: [[CHAR_TBAA5]] = !{[[META3]], [[META3]], i64 0}
; CHECK: [[FLOAT_TBAA6]] = !{[[META7:![0-9]+]], [[META7]], i64 0}
; CHECK: [[META7]] = !{!"float", [[META3]], i64 0}
; CHECK: [[LONG_LONG_TBAA8]] = !{[[META9:![0-9]+]], [[META9]], i64 0}
; CHECK: [[META9]] = !{!"long long", [[META3]], i64 0}
; CHECK: [[_ZTS7STRUCT1PTR_TBAA10]] = !{[[META11:![0-9]+]], [[META11]], i64 0}
; CHECK: [[META11]] = !{!"p1 _ZTS7STRUCT1", [[META2]], i64 0}
; CHECK: [[_ZTS7STRUCT1PTR_TBAA12]] = !{[[META13:![0-9]+]], [[META11]], i64 0}
; CHECK: [[META13]] = !{!"STRUCT2", [[META11]], i64 0}
; CHECK: [[ANYPTR_TBAA14]] = !{[[META15:![0-9]+]], [[META15]], i64 0}
; CHECK: [[META15]] = !{!"any p2 pointer", [[META2]], i64 0}
; CHECK: [[ANYPTR_TBAA16]] = !{[[META2]], [[META2]], i64 0}
;.