Skip to content

Commit ddad7c3

Browse files
[AArch64] add some more tests for FMV (#91490)
Add a couple of tests to make it clear: - when FMV should be enabled and disabled by the driver. - which extensions are enabled/disabled based on the dependencies specified in TargetParser.
1 parent 8ac928f commit ddad7c3

File tree

2 files changed

+267
-0
lines changed

2 files changed

+267
-0
lines changed
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
// Test/document all of the dependencies between possible AArch64 FMV extensions.
2+
// Also test the name mangling.
3+
4+
// RUN: %clang --target=aarch64-linux-gnu --rtlib=compiler-rt -emit-llvm -S -o - %s | FileCheck %s
5+
6+
// CHECK: define dso_local i32 @fmv._Maes() #[[ATTR0:[0-9]+]] {
7+
__attribute__((target_version("aes"))) int fmv(void) { return 0; }
8+
9+
// CHECK: define dso_local i32 @fmv._Mbf16() #[[bf16_ebf16:[0-9]+]] {
10+
__attribute__((target_version("bf16"))) int fmv(void) { return 0; }
11+
12+
// CHECK: define dso_local i32 @fmv._Mbti() #[[bti:[0-9]+]] {
13+
__attribute__((target_version("bti"))) int fmv(void) { return 0; }
14+
15+
// CHECK: define dso_local i32 @fmv._Mcrc() #[[crc:[0-9]+]] {
16+
__attribute__((target_version("crc"))) int fmv(void) { return 0; }
17+
18+
// CHECK: define dso_local i32 @fmv._Mdgh() #[[ATTR0:[0-9]+]] {
19+
__attribute__((target_version("dgh"))) int fmv(void) { return 0; }
20+
21+
// CHECK: define dso_local i32 @fmv._Mdit() #[[dit:[0-9]+]] {
22+
__attribute__((target_version("dit"))) int fmv(void) { return 0; }
23+
24+
// CHECK: define dso_local i32 @fmv._Mdotprod() #[[dotprod:[0-9]+]] {
25+
__attribute__((target_version("dotprod"))) int fmv(void) { return 0; }
26+
27+
// CHECK: define dso_local i32 @fmv._Mdpb() #[[dpb:[0-9]+]] {
28+
__attribute__((target_version("dpb"))) int fmv(void) { return 0; }
29+
30+
// CHECK: define dso_local i32 @fmv._Mdpb2() #[[dpb2:[0-9]+]] {
31+
__attribute__((target_version("dpb2"))) int fmv(void) { return 0; }
32+
33+
// CHECK: define dso_local i32 @fmv._Mebf16() #[[bf16_ebf16:[0-9]+]] {
34+
__attribute__((target_version("ebf16"))) int fmv(void) { return 0; }
35+
36+
// CHECK: define dso_local i32 @fmv._Mf32mm() #[[f32mm:[0-9]+]] {
37+
__attribute__((target_version("f32mm"))) int fmv(void) { return 0; }
38+
39+
// CHECK: define dso_local i32 @fmv._Mf64mm() #[[f64mm:[0-9]+]] {
40+
__attribute__((target_version("f64mm"))) int fmv(void) { return 0; }
41+
42+
// CHECK: define dso_local i32 @fmv._Mfcma() #[[fcma:[0-9]+]] {
43+
__attribute__((target_version("fcma"))) int fmv(void) { return 0; }
44+
45+
// CHECK: define dso_local i32 @fmv._Mflagm() #[[flagm:[0-9]+]] {
46+
__attribute__((target_version("flagm"))) int fmv(void) { return 0; }
47+
48+
// CHECK: define dso_local i32 @fmv._Mflagm2() #[[flagm2:[0-9]+]] {
49+
__attribute__((target_version("flagm2"))) int fmv(void) { return 0; }
50+
51+
// CHECK: define dso_local i32 @fmv._Mfp() #[[ATTR0:[0-9]+]] {
52+
__attribute__((target_version("fp"))) int fmv(void) { return 0; }
53+
54+
// CHECK: define dso_local i32 @fmv._Mfp16() #[[fp16:[0-9]+]] {
55+
__attribute__((target_version("fp16"))) int fmv(void) { return 0; }
56+
57+
// CHECK: define dso_local i32 @fmv._Mfp16fml() #[[fp16fml:[0-9]+]] {
58+
__attribute__((target_version("fp16fml"))) int fmv(void) { return 0; }
59+
60+
// CHECK: define dso_local i32 @fmv._Mfrintts() #[[frintts:[0-9]+]] {
61+
__attribute__((target_version("frintts"))) int fmv(void) { return 0; }
62+
63+
// CHECK: define dso_local i32 @fmv._Mi8mm() #[[i8mm:[0-9]+]] {
64+
__attribute__((target_version("i8mm"))) int fmv(void) { return 0; }
65+
66+
// CHECK: define dso_local i32 @fmv._Mjscvt() #[[jscvt:[0-9]+]] {
67+
__attribute__((target_version("jscvt"))) int fmv(void) { return 0; }
68+
69+
// CHECK: define dso_local i32 @fmv._Mls64() #[[ATTR0:[0-9]+]] {
70+
__attribute__((target_version("ls64"))) int fmv(void) { return 0; }
71+
72+
// CHECK: define dso_local i32 @fmv._Mls64_accdata() #[[ls64_accdata:[0-9]+]] {
73+
__attribute__((target_version("ls64_accdata"))) int fmv(void) { return 0; }
74+
75+
// CHECK: define dso_local i32 @fmv._Mls64_v() #[[ATTR0:[0-9]+]] {
76+
__attribute__((target_version("ls64_v"))) int fmv(void) { return 0; }
77+
78+
// CHECK: define dso_local i32 @fmv._Mlse() #[[lse:[0-9]+]] {
79+
__attribute__((target_version("lse"))) int fmv(void) { return 0; }
80+
81+
// CHECK: define dso_local i32 @fmv._Mmemtag() #[[ATTR0:[0-9]+]] {
82+
__attribute__((target_version("memtag"))) int fmv(void) { return 0; }
83+
84+
// CHECK: define dso_local i32 @fmv._Mmemtag2() #[[memtag2:[0-9]+]] {
85+
__attribute__((target_version("memtag2"))) int fmv(void) { return 0; }
86+
87+
// CHECK: define dso_local i32 @fmv._Mmemtag3() #[[memtag2:[0-9]+]] {
88+
__attribute__((target_version("memtag3"))) int fmv(void) { return 0; }
89+
90+
// CHECK: define dso_local i32 @fmv._Mmops() #[[mops:[0-9]+]] {
91+
__attribute__((target_version("mops"))) int fmv(void) { return 0; }
92+
93+
// CHECK: define dso_local i32 @fmv._Mpmull() #[[pmull:[0-9]+]] {
94+
__attribute__((target_version("pmull"))) int fmv(void) { return 0; }
95+
96+
// CHECK: define dso_local i32 @fmv._Mpredres() #[[predres:[0-9]+]] {
97+
__attribute__((target_version("predres"))) int fmv(void) { return 0; }
98+
99+
// CHECK: define dso_local i32 @fmv._Mrcpc() #[[rcpc:[0-9]+]] {
100+
__attribute__((target_version("rcpc"))) int fmv(void) { return 0; }
101+
102+
// CHECK: define dso_local i32 @fmv._Mrcpc2() #[[rcpc:[0-9]+]] {
103+
__attribute__((target_version("rcpc2"))) int fmv(void) { return 0; }
104+
105+
// CHECK: define dso_local i32 @fmv._Mrcpc3() #[[rcpc3:[0-9]+]] {
106+
__attribute__((target_version("rcpc3"))) int fmv(void) { return 0; }
107+
108+
// CHECK: define dso_local i32 @fmv._Mrdm() #[[rdm:[0-9]+]] {
109+
__attribute__((target_version("rdm"))) int fmv(void) { return 0; }
110+
111+
// CHECK: define dso_local i32 @fmv._Mrng() #[[rng:[0-9]+]] {
112+
__attribute__((target_version("rng"))) int fmv(void) { return 0; }
113+
114+
// CHECK: define dso_local i32 @fmv._Mrpres() #[[ATTR0:[0-9]+]] {
115+
__attribute__((target_version("rpres"))) int fmv(void) { return 0; }
116+
117+
// CHECK: define dso_local i32 @fmv._Msb() #[[sb:[0-9]+]] {
118+
__attribute__((target_version("sb"))) int fmv(void) { return 0; }
119+
120+
// CHECK: define dso_local i32 @fmv._Msha1() #[[ATTR0:[0-9]+]] {
121+
__attribute__((target_version("sha1"))) int fmv(void) { return 0; }
122+
123+
// CHECK: define dso_local i32 @fmv._Msha2() #[[sha2:[0-9]+]] {
124+
__attribute__((target_version("sha2"))) int fmv(void) { return 0; }
125+
126+
// CHECK: define dso_local i32 @fmv._Msha3() #[[sha3:[0-9]+]] {
127+
__attribute__((target_version("sha3"))) int fmv(void) { return 0; }
128+
129+
// CHECK: define dso_local i32 @fmv._Msimd() #[[ATTR0:[0-9]+]] {
130+
__attribute__((target_version("simd"))) int fmv(void) { return 0; }
131+
132+
// CHECK: define dso_local i32 @fmv._Msm4() #[[sm4:[0-9]+]] {
133+
__attribute__((target_version("sm4"))) int fmv(void) { return 0; }
134+
135+
// CHECK: define dso_local i32 @fmv._Msme() #[[sme:[0-9]+]] {
136+
__attribute__((target_version("sme"))) int fmv(void) { return 0; }
137+
138+
// CHECK: define dso_local i32 @fmv._Msme-f64f64() #[[sme_f64f64:[0-9]+]] {
139+
__attribute__((target_version("sme-f64f64"))) int fmv(void) { return 0; }
140+
141+
// CHECK: define dso_local i32 @fmv._Msme-i16i64() #[[sme_i16i64:[0-9]+]] {
142+
__attribute__((target_version("sme-i16i64"))) int fmv(void) { return 0; }
143+
144+
// CHECK: define dso_local i32 @fmv._Msme2() #[[sme2:[0-9]+]] {
145+
__attribute__((target_version("sme2"))) int fmv(void) { return 0; }
146+
147+
// CHECK: define dso_local i32 @fmv._Mssbs() #[[ATTR0:[0-9]+]] {
148+
__attribute__((target_version("ssbs"))) int fmv(void) { return 0; }
149+
150+
// CHECK: define dso_local i32 @fmv._Mssbs2() #[[ssbs2:[0-9]+]] {
151+
__attribute__((target_version("ssbs2"))) int fmv(void) { return 0; }
152+
153+
// CHECK: define dso_local i32 @fmv._Msve() #[[sve:[0-9]+]] {
154+
__attribute__((target_version("sve"))) int fmv(void) { return 0; }
155+
156+
// CHECK: define dso_local i32 @fmv._Msve-bf16() #[[sve_bf16_ebf16:[0-9]+]] {
157+
__attribute__((target_version("sve-bf16"))) int fmv(void) { return 0; }
158+
159+
// CHECK: define dso_local i32 @fmv._Msve-ebf16() #[[sve_bf16_ebf16:[0-9]+]] {
160+
__attribute__((target_version("sve-ebf16"))) int fmv(void) { return 0; }
161+
162+
// CHECK: define dso_local i32 @fmv._Msve-i8mm() #[[sve_i8mm:[0-9]+]] {
163+
__attribute__((target_version("sve-i8mm"))) int fmv(void) { return 0; }
164+
165+
// CHECK: define dso_local i32 @fmv._Msve2() #[[sve2:[0-9]+]] {
166+
__attribute__((target_version("sve2"))) int fmv(void) { return 0; }
167+
168+
// CHECK: define dso_local i32 @fmv._Msve2-aes() #[[sve2_aes_sve2_pmull128:[0-9]+]] {
169+
__attribute__((target_version("sve2-aes"))) int fmv(void) { return 0; }
170+
171+
// CHECK: define dso_local i32 @fmv._Msve2-bitperm() #[[sve2_bitperm:[0-9]+]] {
172+
__attribute__((target_version("sve2-bitperm"))) int fmv(void) { return 0; }
173+
174+
// CHECK: define dso_local i32 @fmv._Msve2-pmull128() #[[sve2_aes_sve2_pmull128:[0-9]+]] {
175+
__attribute__((target_version("sve2-pmull128"))) int fmv(void) { return 0; }
176+
177+
// CHECK: define dso_local i32 @fmv._Msve2-sha3() #[[sve2_sha3:[0-9]+]] {
178+
__attribute__((target_version("sve2-sha3"))) int fmv(void) { return 0; }
179+
180+
// CHECK: define dso_local i32 @fmv._Msve2-sm4() #[[sve2_sm4:[0-9]+]] {
181+
__attribute__((target_version("sve2-sm4"))) int fmv(void) { return 0; }
182+
183+
// CHECK: define dso_local i32 @fmv._Mwfxt() #[[wfxt:[0-9]+]] {
184+
__attribute__((target_version("wfxt"))) int fmv(void) { return 0; }
185+
186+
// CHECK-NOT: define dso_local i32 @fmv._M{{.*}}
187+
__attribute__((target_version("non_existent_extension"))) int fmv(void);
188+
189+
__attribute__((target_version("default"))) int fmv(void);
190+
191+
int caller() {
192+
return fmv();
193+
}
194+
195+
// CHECK: attributes #[[ATTR0:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+v8a"
196+
// CHECK: attributes #[[bf16_ebf16:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+v8a"
197+
// CHECK: attributes #[[bti:[0-9]+]] = { {{.*}} "target-features"="+bti,+fp-armv8,+neon,+outline-atomics,+v8a"
198+
// CHECK: attributes #[[crc:[0-9]+]] = { {{.*}} "target-features"="+crc,+fp-armv8,+neon,+outline-atomics,+v8a"
199+
// CHECK: attributes #[[dit:[0-9]+]] = { {{.*}} "target-features"="+dit,+fp-armv8,+neon,+outline-atomics,+v8a"
200+
// CHECK: attributes #[[dotprod:[0-9]+]] = { {{.*}} "target-features"="+dotprod,+fp-armv8,+neon,+outline-atomics,+v8a"
201+
// CHECK: attributes #[[dpb:[0-9]+]] = { {{.*}} "target-features"="+ccpp,+fp-armv8,+neon,+outline-atomics,+v8a"
202+
// CHECK: attributes #[[dpb2:[0-9]+]] = { {{.*}} "target-features"="+ccdp,+ccpp,+fp-armv8,+neon,+outline-atomics,+v8a"
203+
// CHECK: attributes #[[f32mm:[0-9]+]] = { {{.*}} "target-features"="+f32mm,+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a"
204+
// CHECK: attributes #[[f64mm:[0-9]+]] = { {{.*}} "target-features"="+f64mm,+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a"
205+
// CHECK: attributes #[[fcma:[0-9]+]] = { {{.*}} "target-features"="+complxnum,+fp-armv8,+neon,+outline-atomics,+v8a"
206+
// CHECK: attributes #[[flagm:[0-9]+]] = { {{.*}} "target-features"="+flagm,+fp-armv8,+neon,+outline-atomics,+v8a"
207+
// CHECK: attributes #[[flagm2:[0-9]+]] = { {{.*}} "target-features"="+altnzcv,+flagm,+fp-armv8,+neon,+outline-atomics,+v8a"
208+
// CHECK: attributes #[[fp16:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+v8a"
209+
// CHECK: attributes #[[fp16fml:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fp16fml,+fullfp16,+neon,+outline-atomics,+v8a"
210+
// CHECK: attributes #[[frintts:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fptoint,+neon,+outline-atomics,+v8a"
211+
// CHECK: attributes #[[i8mm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+i8mm,+neon,+outline-atomics,+v8a"
212+
// CHECK: attributes #[[jscvt:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+jsconv,+neon,+outline-atomics,+v8a"
213+
// CHECK: attributes #[[ls64_accdata:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+ls64,+neon,+outline-atomics,+v8a"
214+
// CHECK: attributes #[[lse:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+lse,+neon,+outline-atomics,+v8a"
215+
// CHECK: attributes #[[memtag2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+mte,+neon,+outline-atomics,+v8a"
216+
// CHECK: attributes #[[mops:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+mops,+neon,+outline-atomics,+v8a"
217+
// CHECK: attributes #[[pmull:[0-9]+]] = { {{.*}} "target-features"="+aes,+fp-armv8,+neon,+outline-atomics,+v8a"
218+
// CHECK: attributes #[[predres:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+predres,+v8a"
219+
// CHECK: attributes #[[rcpc:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+v8a"
220+
// CHECK: attributes #[[rcpc3:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+rcpc3,+v8a"
221+
// CHECK: attributes #[[rdm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rdm,+v8a"
222+
// CHECK: attributes #[[rng:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rand,+v8a"
223+
// CHECK: attributes #[[sb:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sb,+v8a"
224+
// CHECK: attributes #[[sha2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sha2,+v8a"
225+
// CHECK: attributes #[[sha3:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sha2,+sha3,+v8a"
226+
// CHECK: attributes #[[sm4:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sm4,+v8a"
227+
// CHECK: attributes #[[sme:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+v8a"
228+
// CHECK: attributes #[[sme_f64f64:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+sme-f64f64,+v8a"
229+
// CHECK: attributes #[[sme_i16i64:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+sme-i16i64,+v8a"
230+
// CHECK: attributes #[[sme2:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+neon,+outline-atomics,+sme,+sme2,+v8a"
231+
// CHECK: attributes #[[ssbs2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+ssbs,+v8a"
232+
// CHECK: attributes #[[sve:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a"
233+
// CHECK: attributes #[[sve_bf16_ebf16:[0-9]+]] = { {{.*}} "target-features"="+bf16,+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+v8a"
234+
// CHECK: attributes #[[sve_i8mm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+i8mm,+neon,+outline-atomics,+sve,+v8a"
235+
// CHECK: attributes #[[sve2:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+v8a"
236+
// CHECK: attributes #[[sve2_aes_sve2_pmull128:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-aes,+v8a"
237+
// CHECK: attributes #[[sve2_bitperm:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-bitperm,+v8a"
238+
// CHECK: attributes #[[sve2_sha3:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-sha3,+v8a"
239+
// CHECK: attributes #[[sve2_sm4:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-sm4,+v8a"
240+
// CHECK: attributes #[[wfxt:[0-9]+]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+v8a,+wfxt"

clang/test/Driver/aarch64-fmv.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Test which driver flags enable/disable Function Multiversioning on aarch64.
2+
3+
// FMV is enabled for non-android aarch64 targets:
4+
// RUN: %clang --target=aarch64 --rtlib=compiler-rt -### -c %s 2>&1 | FileCheck -check-prefix=FMV-ENABLED %s
5+
// RUN: %clang --target=aarch64-linux-gnu --rtlib=compiler-rt -### -c %s 2>&1 | FileCheck -check-prefix=FMV-ENABLED %s
6+
// RUN: %clang --target=arm64-apple-ios --rtlib=compiler-rt -### -c %s 2>&1 | FileCheck -check-prefix=FMV-ENABLED %s
7+
// RUN: %clang --target=arm64-apple-macosx --rtlib=compiler-rt -### -c %s 2>&1 | FileCheck -check-prefix=FMV-ENABLED %s
8+
9+
// android23 defaults to --rtlib=compiler-rt:
10+
// RUN: %clang --target=aarch64-linux-android23 -### -c %s 2>&1 | FileCheck -check-prefix=FMV-ENABLED %s
11+
// RUN: %clang --target=aarch64-linux-android23 --rtlib=compiler-rt -### -c %s 2>&1 | FileCheck -check-prefix=FMV-ENABLED %s
12+
13+
// FMV is disabled without compiler-rt:
14+
// RUN: %clang --target=aarch64 -### -c %s 2>&1 | FileCheck -check-prefix=FMV-DISABLED %s
15+
// RUN: %clang --target=aarch64-linux-gnu -### -c %s 2>&1 | FileCheck -check-prefix=FMV-DISABLED %s
16+
17+
// Disabled for older android versions:
18+
// RUN: %clang --rtlib=compiler-rt --target=aarch64-linux-android -### -c %s 2>&1 | FileCheck -check-prefix=FMV-DISABLED %s
19+
// RUN: %clang --rtlib=compiler-rt --target=aarch64-linux-android22 -### -c %s 2>&1 | FileCheck -check-prefix=FMV-DISABLED %s
20+
// RUN: %clang --rtlib=compiler-rt --target=aarch64-linux-android22 -mno-fmv -### -c %s 2>&1 | FileCheck -check-prefix=FMV-DISABLED %s
21+
22+
// Disabled explicitly:
23+
// RUN: %clang --rtlib=compiler-rt --target=aarch64 -mno-fmv -### -c %s 2>&1 | FileCheck -check-prefix=FMV-DISABLED %s
24+
// RUN: %clang --rtlib=compiler-rt --target=aarch64-linux-android23 -mno-fmv -### -c %s 2>&1 | FileCheck -check-prefix=FMV-DISABLED %s
25+
26+
// FMV-ENABLED-NOT: "-target-feature" "-fmv"
27+
// FMV-DISABLED: "-target-feature" "-fmv"

0 commit comments

Comments
 (0)