aboutsummaryrefslogtreecommitdiff
path: root/openmp
diff options
context:
space:
mode:
authorShilei Tian <i@tianshilei.me>2022-07-22 13:46:31 -0400
committerShilei Tian <i@tianshilei.me>2022-07-22 13:46:45 -0400
commit602e0eb9f0c69db455185b5fbe6766ad2573f6e6 (patch)
tree30883b2fb0bb17db9de2783546adfe2fc7a3108b /openmp
parenta2035c566f5dd1508c16144f6439b62a049f7c8d (diff)
downloadllvm-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.cpp2
-rw-r--r--openmp/libomptarget/test/lit.cfg54
-rw-r--r--openmp/libomptarget/test/offloading/wtime.c24
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]+