| // RUN: %clang_cc1 %s -triple hexagon-unknown-elf -O2 -emit-llvm -o - | FileCheck %s |
| |
| typedef union __attribute__((aligned(4))) { |
| unsigned short uh[2]; |
| unsigned uw; |
| } vect32; |
| |
| void bar(vect32 p[][2]); |
| |
| // CHECK-LABEL: define void @fred |
| void fred(unsigned Num, int Vec[2], int *Index, int Arr[4][2]) { |
| vect32 Tmp[4][2]; |
| // Generate tbaa for the load of Index: |
| // CHECK: load i32, i32* %Index{{.*}}tbaa |
| // But no tbaa for the two stores: |
| // CHECK: %uw[[UW1:[0-9]*]] = getelementptr |
| // CHECK: store{{.*}}%uw[[UW1]] |
| // CHECK: tbaa ![[OCPATH:[0-9]+]] |
| // There will be a load after the store, and it will use tbaa. Make sure |
| // the check-not above doesn't find it: |
| // CHECK: load |
| Tmp[*Index][0].uw = Arr[*Index][0] * Num; |
| // CHECK: %uw[[UW2:[0-9]*]] = getelementptr |
| // CHECK: store{{.*}}%uw[[UW2]] |
| // CHECK: tbaa ![[OCPATH]] |
| Tmp[*Index][1].uw = Arr[*Index][1] * Num; |
| // Same here, don't generate tbaa for the loads: |
| // CHECK: %uh[[UH1:[0-9]*]] = bitcast %union.vect32 |
| // CHECK: %arrayidx[[AX1:[0-9]*]] = getelementptr{{.*}}%uh[[UH1]] |
| // CHECK: load i16, i16* %arrayidx[[AX1]] |
| // CHECK: tbaa ![[OCPATH]] |
| // CHECK: store |
| Vec[0] = Tmp[*Index][0].uh[1]; |
| // CHECK: %uh[[UH2:[0-9]*]] = bitcast %union.vect32 |
| // CHECK: %arrayidx[[AX2:[0-9]*]] = getelementptr{{.*}}%uh[[UH2]] |
| // CHECK: load i16, i16* %arrayidx[[AX2]] |
| // CHECK: tbaa ![[OCPATH]] |
| // CHECK: store |
| Vec[1] = Tmp[*Index][1].uh[1]; |
| bar(Tmp); |
| } |
| |
| // CHECK-DAG: ![[CHAR:[0-9]+]] = !{!"omnipotent char" |
| // CHECK-DAG: ![[OCPATH]] = !{![[CHAR]], ![[CHAR]], i64 0} |