[PATCH] D51650: Implement target_clones multiversioning
Jorge Gorbe Moya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 11 17:56:36 PST 2021
jgorbe added a comment.
This breaks some existing code (we have found this issue building the JPEG XL library at github.com/libjxl). This is a very simplified version of the problem:
#pragma clang attribute push(__attribute__((target("sse2,ssse3"))), apply_to = function)
__attribute__((target("sse2"))) void f() {
}
#pragma clang attribute pop
This used to build before this patch, but now fails with
$ clang -c a.cc
a.cc:1:45: error: attribute 'target' cannot appear more than once on a declaration
#pragma clang attribute push(__attribute__((target("sse2,ssse3"))), apply_to = function)
^
a.cc:2:1: note: when applied to this declaration
__attribute__((target("sse2"))) void f() {
^
a.cc:2:16: note: conflicting attribute is here
__attribute__((target("sse2"))) void f() {
^
1 error generated.
Before this patch, the function-level attribute would win. Here's the relevant part of the generated IR for that example:
; Function Attrs: mustprogress noinline nounwind optnone uwtable
define dso_local void @_Z1fv() #0 {
ret void
}
attributes #0 = { mustprogress noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
Note how there's `sse2` (which was in the function-level attribute) but no `ssse3` (which wasn't).
Was this semantic change intentional?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D51650/new/
https://reviews.llvm.org/D51650
More information about the cfe-commits
mailing list