11// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2- // RUN: %clang_cc1 -disable-llvm-passes -O3 -triple x86_64 %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK
2+ // RUN: %clang_cc1 -x c++ -std=c++20 - disable-llvm-passes -O3 -triple x86_64 %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK
33
44typedef _Float16 half8 __attribute__((ext_vector_type (8 )));
5+ typedef __bf16 bf16x8 __attribute__((ext_vector_type (8 )));
56typedef float float4 __attribute__((ext_vector_type (4 )));
67typedef double double2 __attribute__((ext_vector_type (2 )));
78typedef long double ldouble2 __attribute__((ext_vector_type (2 )));
89
9- // CHECK-LABEL: define dso_local half @fmin16 (
10+ // CHECK-LABEL: define dso_local noundef half @_Z6fmin16DF16_DF16_ (
1011// CHECK-SAME: half noundef [[A:%.*]], half noundef [[B:%.*]]) #[[ATTR0:[0-9]+]] {
1112// CHECK-NEXT: [[ENTRY:.*:]]
1213// CHECK-NEXT: [[A_ADDR:%.*]] = alloca half, align 2
@@ -21,7 +22,7 @@ typedef long double ldouble2 __attribute__((ext_vector_type(2)));
2122_Float16 fmin16 (_Float16 a , _Float16 b ) {
2223 return __builtin_minnum (a , b );
2324}
24- // CHECK-LABEL: define dso_local <8 x half> @pfmin16 (
25+ // CHECK-LABEL: define dso_local noundef <8 x half> @_Z7pfmin16Dv8_DF16_S_ (
2526// CHECK-SAME: <8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR2:[0-9]+]] {
2627// CHECK-NEXT: [[ENTRY:.*:]]
2728// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <8 x half>, align 16
@@ -36,22 +37,53 @@ _Float16 fmin16(_Float16 a, _Float16 b) {
3637half8 pfmin16 (half8 a , half8 b ) {
3738 return __builtin_elementwise_minnum (a , b );
3839}
39- // CHECK-LABEL: define dso_local float @fmin32(
40+
41+ // CHECK-LABEL: define dso_local noundef bfloat @_Z7fmin16bDF16bDF16b(
42+ // CHECK-SAME: bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] {
43+ // CHECK-NEXT: [[ENTRY:.*:]]
44+ // CHECK-NEXT: [[A_ADDR:%.*]] = alloca bfloat, align 2
45+ // CHECK-NEXT: [[B_ADDR:%.*]] = alloca bfloat, align 2
46+ // CHECK-NEXT: store bfloat [[A]], ptr [[A_ADDR]], align 2, !tbaa [[TBAA7:![0-9]+]]
47+ // CHECK-NEXT: store bfloat [[B]], ptr [[B_ADDR]], align 2, !tbaa [[TBAA7]]
48+ // CHECK-NEXT: [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2, !tbaa [[TBAA7]]
49+ // CHECK-NEXT: [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2, !tbaa [[TBAA7]]
50+ // CHECK-NEXT: [[TMP2:%.*]] = call bfloat @llvm.minnum.bf16(bfloat [[TMP0]], bfloat [[TMP1]])
51+ // CHECK-NEXT: ret bfloat [[TMP2]]
52+ //
53+ __bf16 fmin16b (__bf16 a , __bf16 b ) {
54+ return __builtin_minnum (a , b );
55+ }
56+ // CHECK-LABEL: define dso_local noundef <8 x bfloat> @_Z8pfmin16bDv8_DF16bS_(
57+ // CHECK-SAME: <8 x bfloat> noundef [[A:%.*]], <8 x bfloat> noundef [[B:%.*]]) #[[ATTR2]] {
58+ // CHECK-NEXT: [[ENTRY:.*:]]
59+ // CHECK-NEXT: [[A_ADDR:%.*]] = alloca <8 x bfloat>, align 16
60+ // CHECK-NEXT: [[B_ADDR:%.*]] = alloca <8 x bfloat>, align 16
61+ // CHECK-NEXT: store <8 x bfloat> [[A]], ptr [[A_ADDR]], align 16, !tbaa [[TBAA6]]
62+ // CHECK-NEXT: store <8 x bfloat> [[B]], ptr [[B_ADDR]], align 16, !tbaa [[TBAA6]]
63+ // CHECK-NEXT: [[TMP0:%.*]] = load <8 x bfloat>, ptr [[A_ADDR]], align 16, !tbaa [[TBAA6]]
64+ // CHECK-NEXT: [[TMP1:%.*]] = load <8 x bfloat>, ptr [[B_ADDR]], align 16, !tbaa [[TBAA6]]
65+ // CHECK-NEXT: [[ELT_MINNUM:%.*]] = call <8 x bfloat> @llvm.minnum.v8bf16(<8 x bfloat> [[TMP0]], <8 x bfloat> [[TMP1]])
66+ // CHECK-NEXT: ret <8 x bfloat> [[ELT_MINNUM]]
67+ //
68+ bf16x8 pfmin16b (bf16x8 a , bf16x8 b ) {
69+ return __builtin_elementwise_minnum (a , b );
70+ }
71+ // CHECK-LABEL: define dso_local noundef float @_Z6fmin32ff(
4072// CHECK-SAME: float noundef [[A:%.*]], float noundef [[B:%.*]]) #[[ATTR0]] {
4173// CHECK-NEXT: [[ENTRY:.*:]]
4274// CHECK-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
4375// CHECK-NEXT: [[B_ADDR:%.*]] = alloca float, align 4
44- // CHECK-NEXT: store float [[A]], ptr [[A_ADDR]], align 4, !tbaa [[TBAA7 :![0-9]+]]
45- // CHECK-NEXT: store float [[B]], ptr [[B_ADDR]], align 4, !tbaa [[TBAA7 ]]
46- // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4, !tbaa [[TBAA7 ]]
47- // CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 4, !tbaa [[TBAA7 ]]
76+ // CHECK-NEXT: store float [[A]], ptr [[A_ADDR]], align 4, !tbaa [[TBAA9 :![0-9]+]]
77+ // CHECK-NEXT: store float [[B]], ptr [[B_ADDR]], align 4, !tbaa [[TBAA9 ]]
78+ // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4, !tbaa [[TBAA9 ]]
79+ // CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 4, !tbaa [[TBAA9 ]]
4880// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.minnum.f32(float [[TMP0]], float [[TMP1]])
4981// CHECK-NEXT: ret float [[TMP2]]
5082//
5183float fmin32 (float a , float b ) {
5284 return __builtin_minnum (a , b );
5385}
54- // CHECK-LABEL: define dso_local <4 x float> @pfmin32 (
86+ // CHECK-LABEL: define dso_local noundef <4 x float> @_Z7pfmin32Dv4_fS_ (
5587// CHECK-SAME: <4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR2]] {
5688// CHECK-NEXT: [[ENTRY:.*:]]
5789// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <4 x float>, align 16
@@ -66,22 +98,22 @@ float fmin32(float a, float b) {
6698float4 pfmin32 (float4 a , float4 b ) {
6799 return __builtin_elementwise_minnum (a , b );
68100}
69- // CHECK-LABEL: define dso_local double @fmin64 (
101+ // CHECK-LABEL: define dso_local noundef double @_Z6fmin64dd (
70102// CHECK-SAME: double noundef [[A:%.*]], double noundef [[B:%.*]]) #[[ATTR0]] {
71103// CHECK-NEXT: [[ENTRY:.*:]]
72104// CHECK-NEXT: [[A_ADDR:%.*]] = alloca double, align 8
73105// CHECK-NEXT: [[B_ADDR:%.*]] = alloca double, align 8
74- // CHECK-NEXT: store double [[A]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA9 :![0-9]+]]
75- // CHECK-NEXT: store double [[B]], ptr [[B_ADDR]], align 8, !tbaa [[TBAA9 ]]
76- // CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR]], align 8, !tbaa [[TBAA9 ]]
77- // CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[B_ADDR]], align 8, !tbaa [[TBAA9 ]]
106+ // CHECK-NEXT: store double [[A]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA11 :![0-9]+]]
107+ // CHECK-NEXT: store double [[B]], ptr [[B_ADDR]], align 8, !tbaa [[TBAA11 ]]
108+ // CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR]], align 8, !tbaa [[TBAA11 ]]
109+ // CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[B_ADDR]], align 8, !tbaa [[TBAA11 ]]
78110// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.minnum.f64(double [[TMP0]], double [[TMP1]])
79111// CHECK-NEXT: ret double [[TMP2]]
80112//
81113double fmin64 (double a , double b ) {
82114 return __builtin_minnum (a , b );
83115}
84- // CHECK-LABEL: define dso_local <2 x double> @pfmin64 (
116+ // CHECK-LABEL: define dso_local noundef <2 x double> @_Z7pfmin64Dv2_dS_ (
85117// CHECK-SAME: <2 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR2]] {
86118// CHECK-NEXT: [[ENTRY:.*:]]
87119// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <2 x double>, align 16
@@ -97,22 +129,22 @@ double2 pfmin64(double2 a, double2 b) {
97129 return __builtin_elementwise_minnum (a , b );
98130}
99131
100- // CHECK-LABEL: define dso_local x86_fp80 @fmin80 (
132+ // CHECK-LABEL: define dso_local noundef x86_fp80 @_Z6fmin80ee (
101133// CHECK-SAME: x86_fp80 noundef [[A:%.*]], x86_fp80 noundef [[B:%.*]]) #[[ATTR0]] {
102134// CHECK-NEXT: [[ENTRY:.*:]]
103135// CHECK-NEXT: [[A_ADDR:%.*]] = alloca x86_fp80, align 16
104136// CHECK-NEXT: [[B_ADDR:%.*]] = alloca x86_fp80, align 16
105- // CHECK-NEXT: store x86_fp80 [[A]], ptr [[A_ADDR]], align 16, !tbaa [[TBAA11 :![0-9]+]]
106- // CHECK-NEXT: store x86_fp80 [[B]], ptr [[B_ADDR]], align 16, !tbaa [[TBAA11 ]]
107- // CHECK-NEXT: [[TMP0:%.*]] = load x86_fp80, ptr [[A_ADDR]], align 16, !tbaa [[TBAA11 ]]
108- // CHECK-NEXT: [[TMP1:%.*]] = load x86_fp80, ptr [[B_ADDR]], align 16, !tbaa [[TBAA11 ]]
137+ // CHECK-NEXT: store x86_fp80 [[A]], ptr [[A_ADDR]], align 16, !tbaa [[TBAA13 :![0-9]+]]
138+ // CHECK-NEXT: store x86_fp80 [[B]], ptr [[B_ADDR]], align 16, !tbaa [[TBAA13 ]]
139+ // CHECK-NEXT: [[TMP0:%.*]] = load x86_fp80, ptr [[A_ADDR]], align 16, !tbaa [[TBAA13 ]]
140+ // CHECK-NEXT: [[TMP1:%.*]] = load x86_fp80, ptr [[B_ADDR]], align 16, !tbaa [[TBAA13 ]]
109141// CHECK-NEXT: [[TMP2:%.*]] = call x86_fp80 @llvm.minnum.f80(x86_fp80 [[TMP0]], x86_fp80 [[TMP1]])
110142// CHECK-NEXT: ret x86_fp80 [[TMP2]]
111143//
112144long double fmin80 (long double a , long double b ) {
113145 return __builtin_minnum (a , b );
114146}
115- // CHECK-LABEL: define dso_local <2 x x86_fp80> @pfmin80 (
147+ // CHECK-LABEL: define dso_local noundef <2 x x86_fp80> @_Z7pfmin80Dv2_eS_ (
116148// CHECK-SAME: ptr noundef byval(<2 x x86_fp80>) align 32 [[TMP0:%.*]], ptr noundef byval(<2 x x86_fp80>) align 32 [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {
117149// CHECK-NEXT: [[ENTRY:.*:]]
118150// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <2 x x86_fp80>, align 32
@@ -130,7 +162,7 @@ ldouble2 pfmin80(ldouble2 a, ldouble2 b) {
130162 return __builtin_elementwise_minnum (a , b );
131163}
132164
133- // CHECK-LABEL: define dso_local half @fmax16 (
165+ // CHECK-LABEL: define dso_local noundef half @_Z6fmax16DF16_DF16_ (
134166// CHECK-SAME: half noundef [[A:%.*]], half noundef [[B:%.*]]) #[[ATTR0]] {
135167// CHECK-NEXT: [[ENTRY:.*:]]
136168// CHECK-NEXT: [[A_ADDR:%.*]] = alloca half, align 2
@@ -145,7 +177,7 @@ ldouble2 pfmin80(ldouble2 a, ldouble2 b) {
145177_Float16 fmax16 (_Float16 a , _Float16 b ) {
146178 return __builtin_maxnum (a , b );
147179}
148- // CHECK-LABEL: define dso_local <8 x half> @pfmax16 (
180+ // CHECK-LABEL: define dso_local noundef <8 x half> @_Z7pfmax16Dv8_DF16_S_ (
149181// CHECK-SAME: <8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR2]] {
150182// CHECK-NEXT: [[ENTRY:.*:]]
151183// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <8 x half>, align 16
@@ -160,22 +192,52 @@ _Float16 fmax16(_Float16 a, _Float16 b) {
160192half8 pfmax16 (half8 a , half8 b ) {
161193 return __builtin_elementwise_maxnum (a , b );
162194}
163- // CHECK-LABEL: define dso_local float @fmax32(
195+ // CHECK-LABEL: define dso_local noundef bfloat @_Z7fmax16bDF16bDF16b(
196+ // CHECK-SAME: bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] {
197+ // CHECK-NEXT: [[ENTRY:.*:]]
198+ // CHECK-NEXT: [[A_ADDR:%.*]] = alloca bfloat, align 2
199+ // CHECK-NEXT: [[B_ADDR:%.*]] = alloca bfloat, align 2
200+ // CHECK-NEXT: store bfloat [[A]], ptr [[A_ADDR]], align 2, !tbaa [[TBAA7]]
201+ // CHECK-NEXT: store bfloat [[B]], ptr [[B_ADDR]], align 2, !tbaa [[TBAA7]]
202+ // CHECK-NEXT: [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2, !tbaa [[TBAA7]]
203+ // CHECK-NEXT: [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2, !tbaa [[TBAA7]]
204+ // CHECK-NEXT: [[TMP2:%.*]] = call bfloat @llvm.maxnum.bf16(bfloat [[TMP0]], bfloat [[TMP1]])
205+ // CHECK-NEXT: ret bfloat [[TMP2]]
206+ //
207+ __bf16 fmax16b (__bf16 a , __bf16 b ) {
208+ return __builtin_maxnum (a , b );
209+ }
210+ // CHECK-LABEL: define dso_local noundef <8 x bfloat> @_Z8pfmax16bDv8_DF16bS_(
211+ // CHECK-SAME: <8 x bfloat> noundef [[A:%.*]], <8 x bfloat> noundef [[B:%.*]]) #[[ATTR2]] {
212+ // CHECK-NEXT: [[ENTRY:.*:]]
213+ // CHECK-NEXT: [[A_ADDR:%.*]] = alloca <8 x bfloat>, align 16
214+ // CHECK-NEXT: [[B_ADDR:%.*]] = alloca <8 x bfloat>, align 16
215+ // CHECK-NEXT: store <8 x bfloat> [[A]], ptr [[A_ADDR]], align 16, !tbaa [[TBAA6]]
216+ // CHECK-NEXT: store <8 x bfloat> [[B]], ptr [[B_ADDR]], align 16, !tbaa [[TBAA6]]
217+ // CHECK-NEXT: [[TMP0:%.*]] = load <8 x bfloat>, ptr [[A_ADDR]], align 16, !tbaa [[TBAA6]]
218+ // CHECK-NEXT: [[TMP1:%.*]] = load <8 x bfloat>, ptr [[B_ADDR]], align 16, !tbaa [[TBAA6]]
219+ // CHECK-NEXT: [[ELT_MAXNUM:%.*]] = call <8 x bfloat> @llvm.maxnum.v8bf16(<8 x bfloat> [[TMP0]], <8 x bfloat> [[TMP1]])
220+ // CHECK-NEXT: ret <8 x bfloat> [[ELT_MAXNUM]]
221+ //
222+ bf16x8 pfmax16b (bf16x8 a , bf16x8 b ) {
223+ return __builtin_elementwise_maxnum (a , b );
224+ }
225+ // CHECK-LABEL: define dso_local noundef float @_Z6fmax32ff(
164226// CHECK-SAME: float noundef [[A:%.*]], float noundef [[B:%.*]]) #[[ATTR0]] {
165227// CHECK-NEXT: [[ENTRY:.*:]]
166228// CHECK-NEXT: [[A_ADDR:%.*]] = alloca float, align 4
167229// CHECK-NEXT: [[B_ADDR:%.*]] = alloca float, align 4
168- // CHECK-NEXT: store float [[A]], ptr [[A_ADDR]], align 4, !tbaa [[TBAA7 ]]
169- // CHECK-NEXT: store float [[B]], ptr [[B_ADDR]], align 4, !tbaa [[TBAA7 ]]
170- // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4, !tbaa [[TBAA7 ]]
171- // CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 4, !tbaa [[TBAA7 ]]
230+ // CHECK-NEXT: store float [[A]], ptr [[A_ADDR]], align 4, !tbaa [[TBAA9 ]]
231+ // CHECK-NEXT: store float [[B]], ptr [[B_ADDR]], align 4, !tbaa [[TBAA9 ]]
232+ // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4, !tbaa [[TBAA9 ]]
233+ // CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 4, !tbaa [[TBAA9 ]]
172234// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.maxnum.f32(float [[TMP0]], float [[TMP1]])
173235// CHECK-NEXT: ret float [[TMP2]]
174236//
175237float fmax32 (float a , float b ) {
176238 return __builtin_maxnum (a , b );
177239}
178- // CHECK-LABEL: define dso_local <4 x float> @pfmax32 (
240+ // CHECK-LABEL: define dso_local noundef <4 x float> @_Z7pfmax32Dv4_fS_ (
179241// CHECK-SAME: <4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR2]] {
180242// CHECK-NEXT: [[ENTRY:.*:]]
181243// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <4 x float>, align 16
@@ -190,22 +252,22 @@ float fmax32(float a, float b) {
190252float4 pfmax32 (float4 a , float4 b ) {
191253 return __builtin_elementwise_maxnum (a , b );
192254}
193- // CHECK-LABEL: define dso_local double @fmax64 (
255+ // CHECK-LABEL: define dso_local noundef double @_Z6fmax64dd (
194256// CHECK-SAME: double noundef [[A:%.*]], double noundef [[B:%.*]]) #[[ATTR0]] {
195257// CHECK-NEXT: [[ENTRY:.*:]]
196258// CHECK-NEXT: [[A_ADDR:%.*]] = alloca double, align 8
197259// CHECK-NEXT: [[B_ADDR:%.*]] = alloca double, align 8
198- // CHECK-NEXT: store double [[A]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA9 ]]
199- // CHECK-NEXT: store double [[B]], ptr [[B_ADDR]], align 8, !tbaa [[TBAA9 ]]
200- // CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR]], align 8, !tbaa [[TBAA9 ]]
201- // CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[B_ADDR]], align 8, !tbaa [[TBAA9 ]]
260+ // CHECK-NEXT: store double [[A]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA11 ]]
261+ // CHECK-NEXT: store double [[B]], ptr [[B_ADDR]], align 8, !tbaa [[TBAA11 ]]
262+ // CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR]], align 8, !tbaa [[TBAA11 ]]
263+ // CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[B_ADDR]], align 8, !tbaa [[TBAA11 ]]
202264// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.maxnum.f64(double [[TMP0]], double [[TMP1]])
203265// CHECK-NEXT: ret double [[TMP2]]
204266//
205267double fmax64 (double a , double b ) {
206268 return __builtin_maxnum (a , b );
207269}
208- // CHECK-LABEL: define dso_local <2 x double> @pfmax64 (
270+ // CHECK-LABEL: define dso_local noundef <2 x double> @_Z7pfmax64Dv2_dS_ (
209271// CHECK-SAME: <2 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR2]] {
210272// CHECK-NEXT: [[ENTRY:.*:]]
211273// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <2 x double>, align 16
@@ -221,22 +283,22 @@ double2 pfmax64(double2 a, double2 b) {
221283 return __builtin_elementwise_maxnum (a , b );
222284}
223285
224- // CHECK-LABEL: define dso_local x86_fp80 @fmax80 (
286+ // CHECK-LABEL: define dso_local noundef x86_fp80 @_Z6fmax80ee (
225287// CHECK-SAME: x86_fp80 noundef [[A:%.*]], x86_fp80 noundef [[B:%.*]]) #[[ATTR0]] {
226288// CHECK-NEXT: [[ENTRY:.*:]]
227289// CHECK-NEXT: [[A_ADDR:%.*]] = alloca x86_fp80, align 16
228290// CHECK-NEXT: [[B_ADDR:%.*]] = alloca x86_fp80, align 16
229- // CHECK-NEXT: store x86_fp80 [[A]], ptr [[A_ADDR]], align 16, !tbaa [[TBAA11 ]]
230- // CHECK-NEXT: store x86_fp80 [[B]], ptr [[B_ADDR]], align 16, !tbaa [[TBAA11 ]]
231- // CHECK-NEXT: [[TMP0:%.*]] = load x86_fp80, ptr [[A_ADDR]], align 16, !tbaa [[TBAA11 ]]
232- // CHECK-NEXT: [[TMP1:%.*]] = load x86_fp80, ptr [[B_ADDR]], align 16, !tbaa [[TBAA11 ]]
291+ // CHECK-NEXT: store x86_fp80 [[A]], ptr [[A_ADDR]], align 16, !tbaa [[TBAA13 ]]
292+ // CHECK-NEXT: store x86_fp80 [[B]], ptr [[B_ADDR]], align 16, !tbaa [[TBAA13 ]]
293+ // CHECK-NEXT: [[TMP0:%.*]] = load x86_fp80, ptr [[A_ADDR]], align 16, !tbaa [[TBAA13 ]]
294+ // CHECK-NEXT: [[TMP1:%.*]] = load x86_fp80, ptr [[B_ADDR]], align 16, !tbaa [[TBAA13 ]]
233295// CHECK-NEXT: [[TMP2:%.*]] = call x86_fp80 @llvm.maxnum.f80(x86_fp80 [[TMP0]], x86_fp80 [[TMP1]])
234296// CHECK-NEXT: ret x86_fp80 [[TMP2]]
235297//
236298long double fmax80 (long double a , long double b ) {
237299 return __builtin_maxnum (a , b );
238300}
239- // CHECK-LABEL: define dso_local <2 x x86_fp80> @pfmax80 (
301+ // CHECK-LABEL: define dso_local noundef <2 x x86_fp80> @_Z7pfmax80Dv2_eS_ (
240302// CHECK-SAME: ptr noundef byval(<2 x x86_fp80>) align 32 [[TMP0:%.*]], ptr noundef byval(<2 x x86_fp80>) align 32 [[TMP1:%.*]]) #[[ATTR3]] {
241303// CHECK-NEXT: [[ENTRY:.*:]]
242304// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <2 x x86_fp80>, align 32
@@ -258,12 +320,14 @@ ldouble2 pfmax80(ldouble2 a, ldouble2 b) {
258320// CHECK: [[TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
259321// CHECK: [[META3]] = !{!"_Float16", [[META4:![0-9]+]], i64 0}
260322// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}
261- // CHECK: [[META5]] = !{!"Simple C/C ++ TBAA"}
323+ // CHECK: [[META5]] = !{!"Simple C++ TBAA"}
262324// CHECK: [[TBAA6]] = !{[[META4]], [[META4]], i64 0}
263325// CHECK: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
264- // CHECK: [[META8]] = !{!"float ", [[META4]], i64 0}
326+ // CHECK: [[META8]] = !{!"__bf16 ", [[META4]], i64 0}
265327// CHECK: [[TBAA9]] = !{[[META10:![0-9]+]], [[META10]], i64 0}
266- // CHECK: [[META10]] = !{!"double ", [[META4]], i64 0}
328+ // CHECK: [[META10]] = !{!"float ", [[META4]], i64 0}
267329// CHECK: [[TBAA11]] = !{[[META12:![0-9]+]], [[META12]], i64 0}
268- // CHECK: [[META12]] = !{!"long double", [[META4]], i64 0}
330+ // CHECK: [[META12]] = !{!"double", [[META4]], i64 0}
331+ // CHECK: [[TBAA13]] = !{[[META14:![0-9]+]], [[META14]], i64 0}
332+ // CHECK: [[META14]] = !{!"long double", [[META4]], i64 0}
269333//.
0 commit comments