diff options
author | Shilei Tian <i@tianshilei.me> | 2022-07-22 13:46:31 -0400 |
---|---|---|
committer | Shilei Tian <i@tianshilei.me> | 2022-07-22 13:46:45 -0400 |
commit | 602e0eb9f0c69db455185b5fbe6766ad2573f6e6 (patch) | |
tree | 30883b2fb0bb17db9de2783546adfe2fc7a3108b /openmp | |
parent | a2035c566f5dd1508c16144f6439b62a049f7c8d (diff) | |
download | llvm-602e0eb9f0c69db455185b5fbe6766ad2573f6e6.zip llvm-602e0eb9f0c69db455185b5fbe6766ad2573f6e6.tar.gz llvm-602e0eb9f0c69db455185b5fbe6766ad2573f6e6.tar.bz2 |
[OpenMP][DeviceRTL] Fix the issue that multiple calls to `omp_get_wtime` is optimized out by mistake
Multiple calls to `omp_get_wtime` could be optimized out due to the function
is mistakenly marked as `readnone`. This patch fixes the issue, and also add the
support to run optimization on `libomptarget` tests.
Reviewed By: jdoerfert
Differential Revision: https://reviews.llvm.org/D130179
Diffstat (limited to 'openmp')
-rw-r--r-- | openmp/libomptarget/DeviceRTL/src/Misc.cpp | 2 | ||||
-rw-r--r-- | openmp/libomptarget/test/lit.cfg | 54 | ||||
-rw-r--r-- | openmp/libomptarget/test/offloading/wtime.c | 24 |
3 files changed, 78 insertions, 2 deletions
diff --git a/openmp/libomptarget/DeviceRTL/src/Misc.cpp b/openmp/libomptarget/DeviceRTL/src/Misc.cpp index 554a13a..7166925 100644 --- a/openmp/libomptarget/DeviceRTL/src/Misc.cpp +++ b/openmp/libomptarget/DeviceRTL/src/Misc.cpp @@ -52,7 +52,7 @@ double getWTick() { double getWTime() { unsigned long long nsecs; - asm("mov.u64 %0, %%globaltimer;" : "=l"(nsecs)); + asm volatile("mov.u64 %0, %%globaltimer;" : "=l"(nsecs)); return (double)nsecs * getWTick(); } diff --git a/openmp/libomptarget/test/lit.cfg b/openmp/libomptarget/test/lit.cfg index 5436d32..f0eadea 100644 --- a/openmp/libomptarget/test/lit.cfg +++ b/openmp/libomptarget/test/lit.cfg @@ -128,7 +128,7 @@ for libomptarget_target in config.libomptarget_all_targets: # Is this target in the current system? If so create a compile, run and test # command. Otherwise create command that return false. if libomptarget_target == config.libomptarget_current_target: - config.substitutions.append(("%libomptarget-compilexx-run-and-check-generic", + config.substitutions.append(("%libomptarget-compilexx-run-and-check-generic", "%libomptarget-compilexx-run-and-check-" + libomptarget_target)) config.substitutions.append(("%libomptarget-compile-run-and-check-generic", "%libomptarget-compile-run-and-check-" + libomptarget_target)) @@ -140,6 +140,18 @@ for libomptarget_target in config.libomptarget_all_targets: "%libomptarget-compilexx-" + libomptarget_target)) config.substitutions.append(("%libomptarget-compile-generic", "%libomptarget-compile-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileoptxx-run-and-check-generic", + "%libomptarget-compileoptxx-run-and-check-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileopt-run-and-check-generic", + "%libomptarget-compileopt-run-and-check-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileoptxx-and-run-generic", + "%libomptarget-compileoptxx-and-run-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileopt-and-run-generic", + "%libomptarget-compileopt-and-run-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileoptxx-generic", + "%libomptarget-compileoptxx-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileopt-generic", + "%libomptarget-compileopt-" + libomptarget_target)) config.substitutions.append(("%libomptarget-run-generic", "%libomptarget-run-" + libomptarget_target)) config.substitutions.append(("%libomptarget-run-fail-generic", @@ -174,6 +186,28 @@ for libomptarget_target in config.libomptarget_all_targets: config.substitutions.append(("%libomptarget-compile-" + \ libomptarget_target, \ "%clang-" + libomptarget_target + " %s -o %t")) + config.substitutions.append(("%libomptarget-compileoptxx-run-and-check-" + \ + libomptarget_target, \ + "%libomptarget-compileoptxx-and-run-" + libomptarget_target + \ + " | " + config.libomptarget_filecheck + " %s")) + config.substitutions.append(("%libomptarget-compileopt-run-and-check-" + \ + libomptarget_target, \ + "%libomptarget-compileopt-and-run-" + libomptarget_target + \ + " | " + config.libomptarget_filecheck + " %s")) + config.substitutions.append(("%libomptarget-compileoptxx-and-run-" + \ + libomptarget_target, \ + "%libomptarget-compileoptxx-" + libomptarget_target + " && " + \ + "%libomptarget-run-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileopt-and-run-" + \ + libomptarget_target, \ + "%libomptarget-compileopt-" + libomptarget_target + " && " + \ + "%libomptarget-run-" + libomptarget_target)) + config.substitutions.append(("%libomptarget-compileoptxx-" + \ + libomptarget_target, \ + "%clangxx-" + libomptarget_target + " -O3 %s -o %t")) + config.substitutions.append(("%libomptarget-compileopt-" + \ + libomptarget_target, \ + "%clang-" + libomptarget_target + " -O3 %s -o %t")) config.substitutions.append(("%libomptarget-run-" + \ libomptarget_target, \ "%t")) @@ -207,6 +241,24 @@ for libomptarget_target in config.libomptarget_all_targets: config.substitutions.append(("%libomptarget-compile-" + \ libomptarget_target, \ "echo ignored-command")) + config.substitutions.append(("%libomptarget-compileopt-run-and-check-" + \ + libomptarget_target, \ + "echo ignored-command")) + config.substitutions.append(("%libomptarget-compileoptxx-run-and-check-" + \ + libomptarget_target, \ + "echo ignored-command")) + config.substitutions.append(("%libomptarget-compileopt-and-run-" + \ + libomptarget_target, \ + "echo ignored-command")) + config.substitutions.append(("%libomptarget-compileoptxx-and-run-" + \ + libomptarget_target, \ + "echo ignored-command")) + config.substitutions.append(("%libomptarget-compileoptxx-" + \ + libomptarget_target, \ + "echo ignored-command")) + config.substitutions.append(("%libomptarget-compileopt-" + \ + libomptarget_target, \ + "echo ignored-command")) config.substitutions.append(("%libomptarget-run-" + \ libomptarget_target, \ "echo ignored-command")) diff --git a/openmp/libomptarget/test/offloading/wtime.c b/openmp/libomptarget/test/offloading/wtime.c new file mode 100644 index 0000000..bc2e1f7 --- /dev/null +++ b/openmp/libomptarget/test/offloading/wtime.c @@ -0,0 +1,24 @@ +// RUN: %libomptarget-compileopt-run-and-check-generic + +// UNSUPPORTED: amdgcn-amd-amdhsa +// UNSUPPORTED: amdgcn-amd-amdhsa-oldDriver +// UNSUPPORTED: amdgcn-amd-amdhsa-LTO + +#include <omp.h> +#include <stdio.h> + +int main(int argc, char *argv[]) { + int data[1024]; +#pragma omp target + { + double start = omp_get_wtime(); + for (int i = 0; i < 1024; ++i) + data[i] = i; + double end = omp_get_wtime(); + double duration = end - start; + printf("duration: %lfs\n", duration); + } + return 0; +} + +// CHECK: duration: [1-9]+ |