diff options
| author | Jonas Hahnfeld <hahnjo@hahnjo.de> | 2017-09-27 18:12:34 +0000 |
|---|---|---|
| committer | Jonas Hahnfeld <hahnjo@hahnjo.de> | 2017-09-27 18:12:34 +0000 |
| commit | 757e61fa4f980379f3a98c9e13e94670955138be (patch) | |
| tree | 6caf70a28ca4f97f68199775ded63a2e85d303e3 | |
| parent | 85f19958e9f51a3631fe94ac9c7cda725d03eb2c (diff) | |
| download | bcm5719-llvm-757e61fa4f980379f3a98c9e13e94670955138be.tar.gz bcm5719-llvm-757e61fa4f980379f3a98c9e13e94670955138be.zip | |
[OpenMP] Fix passing of -m arguments to device toolchain
AuxTriple is not set if host and device share a toolchain. Also,
removing an argument modifies the DAL which needs to be returned
for future use.
(Move tests back to offload-openmp.c as they are not related to GPUs.)
Differential Revision: https://reviews.llvm.org/D38258
llvm-svn: 314329
| -rw-r--r-- | clang/lib/Driver/ToolChain.cpp | 15 | ||||
| -rw-r--r-- | clang/test/Driver/openmp-offload-gpu.c | 32 | ||||
| -rw-r--r-- | clang/test/Driver/openmp-offload.c | 48 |
3 files changed, 57 insertions, 38 deletions
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index e131ffea5cb..d6d84e4719c 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -807,16 +807,19 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOpenMPTargetArgs( if (DeviceOffloadKind == Action::OFK_OpenMP) { DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); const OptTable &Opts = getDriver().getOpts(); - bool NewArgAdded = false; + bool Modified = false; // Handle -Xopenmp-target flags for (Arg *A : Args) { // Exclude flags which may only apply to the host toolchain. - // Do not exclude flags when the host triple (AuxTriple), - // matches the current toolchain triple. + // Do not exclude flags when the host triple (AuxTriple) + // matches the current toolchain triple. If it is not present + // at all, target and host share a toolchain. if (A->getOption().matches(options::OPT_m_Group)) { - if (getAuxTriple() && getAuxTriple()->str() == getTriple().str()) + if (!getAuxTriple() || getAuxTriple()->str() == getTriple().str()) DAL->append(A); + else + Modified = true; continue; } @@ -857,10 +860,10 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOpenMPTargetArgs( A = XOpenMPTargetArg.release(); AllocatedArgs.push_back(A); DAL->append(A); - NewArgAdded = true; + Modified = true; } - if (NewArgAdded) { + if (Modified) { return DAL; } else { delete DAL; diff --git a/clang/test/Driver/openmp-offload-gpu.c b/clang/test/Driver/openmp-offload-gpu.c index de183b2a392..abef552a6e6 100644 --- a/clang/test/Driver/openmp-offload-gpu.c +++ b/clang/test/Driver/openmp-offload-gpu.c @@ -9,38 +9,6 @@ /// ########################################################################### -/// Check -Xopenmp-target=powerpc64le-ibm-linux-gnu -march=pwr7 is passed when compiling for the device. -// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-FOPENMP-EQ-TARGET %s - -// CHK-FOPENMP-EQ-TARGET: clang{{.*}} "-target-cpu" "pwr7" - -/// ########################################################################### - -/// Check -Xopenmp-target -march=pwr7 is passed when compiling for the device. -// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr7 %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET %s - -// CHK-FOPENMP-TARGET: clang{{.*}} "-target-cpu" "pwr7" - -/// ########################################################################### - -/// Check -Xopenmp-target triggers error when multiple triples are used. -// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu,powerpc64le-unknown-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR %s - -// CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR: clang{{.*}} error: cannot deduce implicit triple value for -Xopenmp-target, specify triple using -Xopenmp-target=<triple> - -/// ########################################################################### - -/// Check -Xopenmp-target triggers error when an option requiring arguments is passed to it. -// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target -mcpu=pwr8 %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR %s - -// CHK-FOPENMP-TARGET-NESTED-ERROR: clang{{.*}} error: invalid -Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are unsupported - -/// ########################################################################### - /// Check -Xopenmp-target uses one of the archs provided when several archs are used. // RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=nvptx64-nvidia-cuda -Xopenmp-target -march=sm_35 -Xopenmp-target -march=sm_60 %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-ARCHS %s diff --git a/clang/test/Driver/openmp-offload.c b/clang/test/Driver/openmp-offload.c index d43aa331c9d..a26e86723de 100644 --- a/clang/test/Driver/openmp-offload.c +++ b/clang/test/Driver/openmp-offload.c @@ -39,6 +39,54 @@ /// ########################################################################### +/// Check -Xopenmp-target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 is passed when compiling for the device. +// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FOPENMP-EQ-TARGET %s + +// CHK-FOPENMP-EQ-TARGET: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-device" + +/// ########################################################################### + +/// Check -Xopenmp-target -mcpu=pwr7 is passed when compiling for the device. +// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr7 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET %s + +// CHK-FOPENMP-TARGET: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-device" + +/// ########################################################################## + +/// Check -mcpu=pwr7 is passed to the same triple. +// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -target powerpc64le-ibm-linux-gnu -mcpu=pwr7 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FOPENMP-MCPU-TO-SAME-TRIPLE %s + +// CHK-FOPENMP-MCPU-TO-SAME-TRIPLE: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-device" + +/// ########################################################################## + +/// Check -march=pwr7 is NOT passed to nvptx64-nvidia-cuda. +// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=nvptx64-nvidia-cuda -march=pwr7 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FOPENMP-MARCH-TO-GPU %s + +// CHK-FOPENMP-MARCH-TO-GPU-NOT: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-device" + +/// ########################################################################### + +/// Check -Xopenmp-target triggers error when multiple triples are used. +// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu,powerpc64le-unknown-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR %s + +// CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR: clang{{.*}} error: cannot deduce implicit triple value for -Xopenmp-target, specify triple using -Xopenmp-target=<triple> + +/// ########################################################################### + +/// Check -Xopenmp-target triggers error when an option requiring arguments is passed to it. +// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target -mcpu=pwr8 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR %s + +// CHK-FOPENMP-TARGET-NESTED-ERROR: clang{{.*}} error: invalid -Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are unsupported + +/// ########################################################################### + /// Check the phases graph when using a single target, different from the host. /// We should have an offload action joining the host compile and device /// preprocessor and another one joining the device linking outputs to the host |

