| Krzysztof Parzyszek | 5960a57 | 2017-05-25 12:55:47 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 %s -triple hexagon-unknown-elf -O2 -emit-llvm -o - | FileCheck %s |
| 2 | |
| 3 | typedef union __attribute__((aligned(4))) { |
| 4 | unsigned short uh[2]; |
| 5 | unsigned uw; |
| 6 | } vect32; |
| 7 | |
| 8 | void bar(vect32 p[][2]); |
| 9 | |
| 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); |
| 41 | } |
| 42 | |
| 43 | // CHECK-DAG: ![[CHAR:[0-9]+]] = !{!"omnipotent char" |
| 44 | // CHECK-DAG: ![[OCPATH]] = !{![[CHAR]], ![[CHAR]], i64 0} |