[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / CodeGen / union-tbaa1.c
blob8be8fcea21a99cc95b007c8830e01c3c3229b599
1 // RUN: %clang_cc1 -no-opaque-pointers %s -triple hexagon-unknown-elf -O2 -emit-llvm -o - | FileCheck %s
3 typedef union __attribute__((aligned(4))) {
4 unsigned short uh[2];
5 unsigned uw;
6 } vect32;
8 void bar(vect32 p[][2]);
10 // CHECK-LABEL: define{{.*}} void @fred
11 void fred(unsigned Num, int Vec[2], int *Index, int Arr[4][2]) {
12 vect32 Tmp[4][2];
13 // Generate tbaa for the load of Index:
14 // CHECK: load i32, i32* %Index{{.*}}tbaa
15 // But no tbaa for the two stores:
16 // CHECK: %uw[[UW1:[0-9]*]] = getelementptr
17 // CHECK: store{{.*}}%uw[[UW1]]
18 // CHECK: tbaa ![[OCPATH:[0-9]+]]
19 // There will be a load after the store, and it will use tbaa. Make sure
20 // the check-not above doesn't find it:
21 // CHECK: load
22 Tmp[*Index][0].uw = Arr[*Index][0] * Num;
23 // CHECK: %uw[[UW2:[0-9]*]] = getelementptr
24 // CHECK: store{{.*}}%uw[[UW2]]
25 // CHECK: tbaa ![[OCPATH]]
26 Tmp[*Index][1].uw = Arr[*Index][1] * Num;
27 // Same here, don't generate tbaa for the loads:
28 // CHECK: %uh[[UH1:[0-9]*]] = bitcast %union.vect32
29 // CHECK: %arrayidx[[AX1:[0-9]*]] = getelementptr{{.*}}%uh[[UH1]]
30 // CHECK: load i16, i16* %arrayidx[[AX1]]
31 // CHECK: tbaa ![[OCPATH]]
32 // CHECK: store
33 Vec[0] = Tmp[*Index][0].uh[1];
34 // CHECK: %uh[[UH2:[0-9]*]] = bitcast %union.vect32
35 // CHECK: %arrayidx[[AX2:[0-9]*]] = getelementptr{{.*}}%uh[[UH2]]
36 // CHECK: load i16, i16* %arrayidx[[AX2]]
37 // CHECK: tbaa ![[OCPATH]]
38 // CHECK: store
39 Vec[1] = Tmp[*Index][1].uh[1];
40 bar(Tmp);
43 // CHECK-DAG: ![[CHAR:[0-9]+]] = !{!"omnipotent char"
44 // CHECK-DAG: ![[OCPATH]] = !{![[CHAR]], ![[CHAR]], i64 0}