r233227 - Reapply r232888 after applying a fix for -msse4 code generation.

Duncan P. N. Exon Smith dexonsmith at apple.com
Tue Mar 31 20:59:22 PDT 2015


> On 2015 Mar 25, at 16:14, Eric Christopher <echristo at gmail.com> wrote:
> 
> Author: echristo
> Date: Wed Mar 25 18:14:47 2015
> New Revision: 233227
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=233227&view=rev
> Log:
> Reapply r232888

This is awesome, btw :).

> after applying a fix for -msse4 code generation.
> 
> As a note, any target that uses fake target features via command
> line options will have similar problems.
> 
> Added:
>    cfe/trunk/test/CodeGen/function-target-features.c
> Modified:
>    cfe/trunk/lib/CodeGen/CGCall.cpp
> 
> Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=233227&r1=233226&r2=233227&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Mar 25 18:14:47 2015
> @@ -31,6 +31,7 @@
> #include "llvm/IR/InlineAsm.h"
> #include "llvm/IR/Intrinsics.h"
> #include "llvm/Transforms/Utils/Local.h"
> +#include <sstream>
> using namespace clang;
> using namespace CodeGen;
> 
> @@ -1475,6 +1476,26 @@ void CodeGenModule::ConstructAttributeLi
> 
>     if (!CodeGenOpts.StackRealignment)
>       FuncAttrs.addAttribute("no-realign-stack");
> +
> +    // Add target-cpu and target-features work if they differ from the defaults.
> +    std::string &CPU = getTarget().getTargetOpts().CPU;
> +    if (CPU != "" && CPU != getTarget().getTriple().getArchName())

Why not the following?

    if (CPU != "")

The frontend and backend don't necessarily have the same default CPU.
IMO that's a bug that should be fixed eventually, but I think we
should encode the CPU to ensure that it matches up on the other side.

> +      FuncAttrs.addAttribute("target-cpu", getTarget().getTargetOpts().CPU);

You can reuse the `CPU` local here.

> +
> +    // TODO: FeaturesAsWritten gets us the features on the command line,
> +    // for canonicalization purposes we might want to avoid putting features
> +    // in the target-features set if we know it'll be one of the default
> +    // features in the backend, e.g. corei7-avx and +avx.

Same point as above for target-cpu.  I don't think we should rely on
defaults matching in the backend until the defaults come from the same
codebase.

> +    std::vector<std::string> &Features =
> +        getTarget().getTargetOpts().FeaturesAsWritten;
> +    if (!Features.empty()) {

Even here, shouldn't we just encode `"target-features"=""` when
Features is empty?

> +      std::stringstream S;
> +      std::copy(Features.begin(), Features.end(),
> +                std::ostream_iterator<std::string>(S, ","));
> +      // The drop_back gets rid of the trailing space.
> +      FuncAttrs.addAttribute("target-features",
> +                             StringRef(S.str()).drop_back(1));
> +    }
>   }
> 
>   ClangToLLVMArgMapping IRFunctionArgs(getContext(), FI);
> 
> Added: cfe/trunk/test/CodeGen/function-target-features.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/function-target-features.c?rev=233227&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGen/function-target-features.c (added)
> +++ cfe/trunk/test/CodeGen/function-target-features.c Wed Mar 25 18:14:47 2015
> @@ -0,0 +1,21 @@
> +// This test verifies that we produce target-cpu and target-features attributes
> +// on functions when they're different from the standard cpu and have written
> +// features.
> +
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx | FileCheck %s -check-prefix=AVX-FEATURE
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx | FileCheck %s -check-prefix=AVX-NO-CPU
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx512f -target-feature +avx512er | FileCheck %s -check-prefix=TWO-AVX
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-cpu corei7 | FileCheck %s -check-prefix=CORE-CPU
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-cpu corei7 -target-feature +avx | FileCheck %s -check-prefix=CORE-CPU-AND-FEATURES
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-cpu x86-64 | FileCheck %s -check-prefix=X86-64-CPU-NOT
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-cpu corei7-avx -target-feature -avx | FileCheck %s -check-prefix=AVX-MINUS-FEATURE
> +
> +void foo() {}
> +
> +// AVX-FEATURE: "target-features"="+avx"
> +// AVX-NO-CPU-NOT: target-cpu
> +// TWO-AVX: "target-features"="+avx512f,+avx512er"
> +// CORE-CPU: "target-cpu"="corei7"
> +// CORE-CPU-AND-FEATURES: "target-cpu"="corei7" "target-features"="+avx"
> +// X86-64-CPU-NOT: "target-cpu"
> +// AVX-MINUS-FEATURE: "target-features"="-avx"
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list