|  | // 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} |