1 // RUN: %clang_cc1 -no-opaque-pointers %s -triple hexagon-unknown-elf -O2 -emit-llvm -o - | FileCheck %s
3 typedef union __attribute__((aligned(4))) {
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]) {
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:
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]]
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]]
39 Vec
[1] = Tmp
[*Index
][1].uh
[1];
43 // CHECK-DAG: ![[CHAR:[0-9]+]] = !{!"omnipotent char"
44 // CHECK-DAG: ![[OCPATH]] = !{![[CHAR]], ![[CHAR]], i64 0}