|
| 1 | +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py |
1 | 2 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
|
2 | 3 |
|
3 | 4 | typedef double * __attribute__((align_value(64))) aligned_double;
|
4 | 5 |
|
| 6 | +// CHECK-LABEL: define {{[^@]+}}@_Z3fooPdS_Rd |
| 7 | +// CHECK-SAME: (double* align 64 [[X:%.*]], double* align 32 [[Y:%.*]], double* nonnull align 128 dereferenceable(8) [[Z:%.*]]) #0 |
| 8 | +// CHECK-NEXT: entry: |
| 9 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 |
| 10 | +// CHECK-NEXT: [[Y_ADDR:%.*]] = alloca double*, align 8 |
| 11 | +// CHECK-NEXT: [[Z_ADDR:%.*]] = alloca double*, align 8 |
| 12 | +// CHECK-NEXT: store double* [[X]], double** [[X_ADDR]], align 8 |
| 13 | +// CHECK-NEXT: store double* [[Y]], double** [[Y_ADDR]], align 8 |
| 14 | +// CHECK-NEXT: store double* [[Z]], double** [[Z_ADDR]], align 8 |
| 15 | +// CHECK-NEXT: ret void |
| 16 | +// |
5 | 17 | void foo(aligned_double x, double * y __attribute__((align_value(32))),
|
6 | 18 | double & z __attribute__((align_value(128)))) { };
|
7 |
| -// CHECK: define void @_Z3fooPdS_Rd(double* align 64 %x, double* align 32 %y, double* nonnull align 128 dereferenceable(8) %z) |
8 | 19 |
|
9 | 20 | struct ad_struct {
|
10 | 21 | aligned_double a;
|
11 | 22 | };
|
12 | 23 |
|
| 24 | +// CHECK-LABEL: define {{[^@]+}}@_Z3fooR9ad_struct |
| 25 | +// CHECK-SAME: (%struct.ad_struct* nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 |
| 26 | +// CHECK-NEXT: entry: |
| 27 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca %struct.ad_struct*, align 8 |
| 28 | +// CHECK-NEXT: store %struct.ad_struct* [[X]], %struct.ad_struct** [[X_ADDR]], align 8 |
| 29 | +// CHECK-NEXT: [[TMP0:%.*]] = load %struct.ad_struct*, %struct.ad_struct** [[X_ADDR]], align 8 |
| 30 | +// CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AD_STRUCT:%.*]], %struct.ad_struct* [[TMP0]], i32 0, i32 0 |
| 31 | +// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[A]], align 8 |
| 32 | +// CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint double* [[TMP1]] to i64 |
| 33 | +// CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63 |
| 34 | +// CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 |
| 35 | +// CHECK-NEXT: call void @llvm.assume(i1 [[MASKCOND]]) |
| 36 | +// CHECK-NEXT: ret double* [[TMP1]] |
| 37 | +// |
13 | 38 | double *foo(ad_struct& x) {
|
14 |
| -// CHECK-LABEL: @_Z3fooR9ad_struct |
15 | 39 |
|
16 |
| -// CHECK: [[PTRINT1:%.+]] = ptrtoint |
17 |
| -// CHECK: [[MASKEDPTR1:%.+]] = and i64 [[PTRINT1]], 63 |
18 |
| -// CHECK: [[MASKCOND1:%.+]] = icmp eq i64 [[MASKEDPTR1]], 0 |
19 |
| -// CHECK: call void @llvm.assume(i1 [[MASKCOND1]]) |
20 | 40 | return x.a;
|
21 | 41 | }
|
22 | 42 |
|
| 43 | +// CHECK-LABEL: define {{[^@]+}}@_Z3gooP9ad_struct |
| 44 | +// CHECK-SAME: (%struct.ad_struct* [[X:%.*]]) #0 |
| 45 | +// CHECK-NEXT: entry: |
| 46 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca %struct.ad_struct*, align 8 |
| 47 | +// CHECK-NEXT: store %struct.ad_struct* [[X]], %struct.ad_struct** [[X_ADDR]], align 8 |
| 48 | +// CHECK-NEXT: [[TMP0:%.*]] = load %struct.ad_struct*, %struct.ad_struct** [[X_ADDR]], align 8 |
| 49 | +// CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AD_STRUCT:%.*]], %struct.ad_struct* [[TMP0]], i32 0, i32 0 |
| 50 | +// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[A]], align 8 |
| 51 | +// CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint double* [[TMP1]] to i64 |
| 52 | +// CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63 |
| 53 | +// CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 |
| 54 | +// CHECK-NEXT: call void @llvm.assume(i1 [[MASKCOND]]) |
| 55 | +// CHECK-NEXT: ret double* [[TMP1]] |
| 56 | +// |
23 | 57 | double *goo(ad_struct *x) {
|
24 |
| -// CHECK-LABEL: @_Z3gooP9ad_struct |
25 | 58 |
|
26 |
| -// CHECK: [[PTRINT2:%.+]] = ptrtoint |
27 |
| -// CHECK: [[MASKEDPTR2:%.+]] = and i64 [[PTRINT2]], 63 |
28 |
| -// CHECK: [[MASKCOND2:%.+]] = icmp eq i64 [[MASKEDPTR2]], 0 |
29 |
| -// CHECK: call void @llvm.assume(i1 [[MASKCOND2]]) |
30 | 59 | return x->a;
|
31 | 60 | }
|
32 | 61 |
|
| 62 | +// CHECK-LABEL: define {{[^@]+}}@_Z3barPPd |
| 63 | +// CHECK-SAME: (double** [[X:%.*]]) #0 |
| 64 | +// CHECK-NEXT: entry: |
| 65 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 |
| 66 | +// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 |
| 67 | +// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 |
| 68 | +// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[TMP0]], align 8 |
| 69 | +// CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint double* [[TMP1]] to i64 |
| 70 | +// CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63 |
| 71 | +// CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 |
| 72 | +// CHECK-NEXT: call void @llvm.assume(i1 [[MASKCOND]]) |
| 73 | +// CHECK-NEXT: ret double* [[TMP1]] |
| 74 | +// |
33 | 75 | double *bar(aligned_double *x) {
|
34 |
| -// CHECK-LABEL: @_Z3barPPd |
35 | 76 |
|
36 |
| -// CHECK: [[PTRINT3:%.+]] = ptrtoint |
37 |
| -// CHECK: [[MASKEDPTR3:%.+]] = and i64 [[PTRINT3]], 63 |
38 |
| -// CHECK: [[MASKCOND3:%.+]] = icmp eq i64 [[MASKEDPTR3]], 0 |
39 |
| -// CHECK: call void @llvm.assume(i1 [[MASKCOND3]]) |
40 | 77 | return *x;
|
41 | 78 | }
|
42 | 79 |
|
| 80 | +// CHECK-LABEL: define {{[^@]+}}@_Z3carRPd |
| 81 | +// CHECK-SAME: (double** nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 |
| 82 | +// CHECK-NEXT: entry: |
| 83 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 |
| 84 | +// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 |
| 85 | +// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 |
| 86 | +// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[TMP0]], align 8 |
| 87 | +// CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint double* [[TMP1]] to i64 |
| 88 | +// CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63 |
| 89 | +// CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 |
| 90 | +// CHECK-NEXT: call void @llvm.assume(i1 [[MASKCOND]]) |
| 91 | +// CHECK-NEXT: ret double* [[TMP1]] |
| 92 | +// |
43 | 93 | double *car(aligned_double &x) {
|
44 |
| -// CHECK-LABEL: @_Z3carRPd |
45 | 94 |
|
46 |
| -// CHECK: [[PTRINT4:%.+]] = ptrtoint |
47 |
| -// CHECK: [[MASKEDPTR4:%.+]] = and i64 [[PTRINT4]], 63 |
48 |
| -// CHECK: [[MASKCOND4:%.+]] = icmp eq i64 [[MASKEDPTR4]], 0 |
49 |
| -// CHECK: call void @llvm.assume(i1 [[MASKCOND4]]) |
50 | 95 | return x;
|
51 | 96 | }
|
52 | 97 |
|
| 98 | +// CHECK-LABEL: define {{[^@]+}}@_Z3darPPd |
| 99 | +// CHECK-SAME: (double** [[X:%.*]]) #0 |
| 100 | +// CHECK-NEXT: entry: |
| 101 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 |
| 102 | +// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 |
| 103 | +// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 |
| 104 | +// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double*, double** [[TMP0]], i64 5 |
| 105 | +// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[ARRAYIDX]], align 8 |
| 106 | +// CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint double* [[TMP1]] to i64 |
| 107 | +// CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63 |
| 108 | +// CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 |
| 109 | +// CHECK-NEXT: call void @llvm.assume(i1 [[MASKCOND]]) |
| 110 | +// CHECK-NEXT: ret double* [[TMP1]] |
| 111 | +// |
53 | 112 | double *dar(aligned_double *x) {
|
54 |
| -// CHECK-LABEL: @_Z3darPPd |
55 | 113 |
|
56 |
| -// CHECK: [[PTRINT5:%.+]] = ptrtoint |
57 |
| -// CHECK: [[MASKEDPTR5:%.+]] = and i64 [[PTRINT5]], 63 |
58 |
| -// CHECK: [[MASKCOND5:%.+]] = icmp eq i64 [[MASKEDPTR5]], 0 |
59 |
| -// CHECK: call void @llvm.assume(i1 [[MASKCOND5]]) |
60 | 114 | return x[5];
|
61 | 115 | }
|
62 | 116 |
|
63 | 117 | aligned_double eep();
|
| 118 | +// CHECK-LABEL: define {{[^@]+}}@_Z3retv() #0 |
| 119 | +// CHECK-NEXT: entry: |
| 120 | +// CHECK-NEXT: [[CALL:%.*]] = call double* @_Z3eepv() |
| 121 | +// CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint double* [[CALL]] to i64 |
| 122 | +// CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63 |
| 123 | +// CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0 |
| 124 | +// CHECK-NEXT: call void @llvm.assume(i1 [[MASKCOND]]) |
| 125 | +// CHECK-NEXT: ret double* [[CALL]] |
| 126 | +// |
64 | 127 | double *ret() {
|
65 |
| -// CHECK-LABEL: @_Z3retv |
66 | 128 |
|
67 |
| -// CHECK: [[PTRINT6:%.+]] = ptrtoint |
68 |
| -// CHECK: [[MASKEDPTR6:%.+]] = and i64 [[PTRINT6]], 63 |
69 |
| -// CHECK: [[MASKCOND6:%.+]] = icmp eq i64 [[MASKEDPTR6]], 0 |
70 |
| -// CHECK: call void @llvm.assume(i1 [[MASKCOND6]]) |
71 | 129 | return eep();
|
72 | 130 | }
|
73 | 131 |
|
| 132 | +// CHECK-LABEL: define {{[^@]+}}@_Z3no1PPd |
| 133 | +// CHECK-SAME: (double** [[X:%.*]]) #0 |
| 134 | +// CHECK-NEXT: entry: |
| 135 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 |
| 136 | +// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 |
| 137 | +// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 |
| 138 | +// CHECK-NEXT: ret double** [[TMP0]] |
| 139 | +// |
74 | 140 | double **no1(aligned_double *x) {
|
75 |
| -// CHECK-LABEL: @_Z3no1PPd |
76 | 141 | return x;
|
77 |
| -// CHECK-NOT: call void @llvm.assume |
78 | 142 | }
|
79 | 143 |
|
| 144 | +// CHECK-LABEL: define {{[^@]+}}@_Z3no2RPd |
| 145 | +// CHECK-SAME: (double** nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 |
| 146 | +// CHECK-NEXT: entry: |
| 147 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 |
| 148 | +// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 |
| 149 | +// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 |
| 150 | +// CHECK-NEXT: ret double** [[TMP0]] |
| 151 | +// |
80 | 152 | double *&no2(aligned_double &x) {
|
81 |
| -// CHECK-LABEL: @_Z3no2RPd |
82 | 153 | return x;
|
83 |
| -// CHECK-NOT: call void @llvm.assume |
84 | 154 | }
|
85 | 155 |
|
| 156 | +// CHECK-LABEL: define {{[^@]+}}@_Z3no3RPd |
| 157 | +// CHECK-SAME: (double** nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 |
| 158 | +// CHECK-NEXT: entry: |
| 159 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 |
| 160 | +// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 |
| 161 | +// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 |
| 162 | +// CHECK-NEXT: ret double** [[TMP0]] |
| 163 | +// |
86 | 164 | double **no3(aligned_double &x) {
|
87 |
| -// CHECK-LABEL: @_Z3no3RPd |
88 | 165 | return &x;
|
89 |
| -// CHECK-NOT: call void @llvm.assume |
90 | 166 | }
|
91 | 167 |
|
| 168 | +// CHECK-LABEL: define {{[^@]+}}@_Z3no3Pd |
| 169 | +// CHECK-SAME: (double* align 64 [[X:%.*]]) #0 |
| 170 | +// CHECK-NEXT: entry: |
| 171 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 |
| 172 | +// CHECK-NEXT: store double* [[X]], double** [[X_ADDR]], align 8 |
| 173 | +// CHECK-NEXT: [[TMP0:%.*]] = load double*, double** [[X_ADDR]], align 8 |
| 174 | +// CHECK-NEXT: [[TMP1:%.*]] = load double, double* [[TMP0]], align 8 |
| 175 | +// CHECK-NEXT: ret double [[TMP1]] |
| 176 | +// |
92 | 177 | double no3(aligned_double x) {
|
93 |
| -// CHECK-LABEL: @_Z3no3Pd |
94 | 178 | return *x;
|
95 |
| -// CHECK-NOT: call void @llvm.assume |
96 | 179 | }
|
97 | 180 |
|
| 181 | +// CHECK-LABEL: define {{[^@]+}}@_Z3no4Pd |
| 182 | +// CHECK-SAME: (double* align 64 [[X:%.*]]) #0 |
| 183 | +// CHECK-NEXT: entry: |
| 184 | +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 |
| 185 | +// CHECK-NEXT: store double* [[X]], double** [[X_ADDR]], align 8 |
| 186 | +// CHECK-NEXT: [[TMP0:%.*]] = load double*, double** [[X_ADDR]], align 8 |
| 187 | +// CHECK-NEXT: ret double* [[TMP0]] |
| 188 | +// |
98 | 189 | double *no4(aligned_double x) {
|
99 |
| -// CHECK-LABEL: @_Z3no4Pd |
100 | 190 | return x;
|
101 |
| -// CHECK-NOT: call void @llvm.assume |
102 | 191 | }
|
103 | 192 |
|
0 commit comments