[PATCH] D39708: [OMPT] Fix test cancel_parallel.c

Jonas Hahnfeld via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 6 17:29:51 PST 2017


Hahnfeld created this revision.

If a parallel region is cancelled, execution resumes at the end
of the structured block. That is why this test cannot use the
"normal" macros that print right after inserting the label.
Instead it previously printed the addresses before the pragma
and swapped the checks compared to the other tests.

However, this does not work because FileChecks '*' is greedy
so that RETURN_ADDRESS always matched the second address. This
makes the test fail when an "overflow" occurrs and the first
address matches the value of codeptr_ra.

I discovered this on my MacBook but I'm unable to reproduce the
failure with the current version. Nevertheless we should fix this
problem to avoid that this test fails later after an unrelated change.


https://reviews.llvm.org/D39708

Files:
  runtime/test/ompt/cancel/cancel_parallel.c


Index: runtime/test/ompt/cancel/cancel_parallel.c
===================================================================
--- runtime/test/ompt/cancel/cancel_parallel.c
+++ runtime/test/ompt/cancel/cancel_parallel.c
@@ -6,37 +6,48 @@
 #include "callback.h"
 #include "omp.h"

-int main()
-{
+int main() {
+  // We have to save the addresses because the compiler outlines the parallel
+  // regions and labels are only valid within one function.
+  void *master, *worker;
   #pragma omp parallel num_threads(2)
   {
-    if(omp_get_thread_num() == 0)
-    {
-      printf("%" PRIu64 ": fuzzy_address=0x%lx or 0x%lx\n", ompt_get_thread_data()->value, ((uint64_t)(char*)(&& ompt_label_1))/256-1, ((uint64_t)(char*)(&& ompt_label_1))/256);
+    if (omp_get_thread_num() == 0) {
+      master = get_ompt_label_address(1);
       #pragma omp cancel parallel
-      print_fuzzy_address(1); //does not actually print the address but provides a label
-    }
-    else
-    {
+      define_ompt_label(1);
+      // We cannot print at this location because the parallel region is cancelled!
+    } else {
       delay(100);
-      printf("%" PRIu64 ": fuzzy_address=0x%lx or 0x%lx\n", ompt_get_thread_data()->value, ((uint64_t)(char*)(&& ompt_label_2))/256-1, ((uint64_t)(char*)(&& ompt_label_2))/256);
+      worker = get_ompt_label_address(2);
       #pragma omp cancellation point parallel
-      print_fuzzy_address(2); //does not actually print the address but provides a label
+      define_ompt_label(2);
+      // We cannot print at this location because the parallel region is cancelled!
+    }
+  }
+
+  // We will get the same threads from libomp.
+  #pragma omp parallel num_threads(2)
+  {
+    if (omp_get_thread_num() == 0) {
+      print_fuzzy_address_blocks(master);
+    } else {
+      print_fuzzy_address_blocks(worker);
     }
   }


   // Check if libomp supports the callbacks for this test.
   // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_task_create'
   // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_cancel'

   // CHECK: {{^}}0: NULL_POINTER=[[NULL:.*$]]
   // CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_task_create: parent_task_id=[[PARENT_TASK_ID:[0-9]+]], parent_task_frame.exit=[[NULL]], parent_task_frame.reenter=[[NULL]], new_task_id=[[TASK_ID:[0-9]+]], codeptr_ra=[[NULL]], task_type=ompt_task_initial=1, has_dependences=no
-  // CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[RETURN_ADDRESS:0x[0-f]+]]
-  // CHECK: {{^}}[[MASTER_ID]]: ompt_event_cancel: task_data=[[TASK_ID:[0-9]+]], flags=ompt_cancel_parallel|ompt_cancel_activated=17, codeptr_ra=[[RETURN_ADDRESS]]{{[0-f][0-f]}}
+  // CHECK: {{^}}[[MASTER_ID]]: ompt_event_cancel: task_data=[[TASK_ID:[0-9]+]], flags=ompt_cancel_parallel|ompt_cancel_activated=17, codeptr_ra=[[RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
+  // CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[RETURN_ADDRESS]]

-  // CHECK: {{^}}[[THREAD_ID:[0-9]+]]: fuzzy_address={{.*}}[[OTHER_RETURN_ADDRESS:0x[0-f]+]]
-  // CHECK: {{^}}[[THREAD_ID]]: ompt_event_cancel: task_data=[[TASK_ID:[0-9]+]], flags=ompt_cancel_parallel|ompt_cancel_detected=33, codeptr_ra=[[OTHER_RETURN_ADDRESS]]{{[0-f][0-f]}}
+  // CHECK: {{^}}[[THREAD_ID:[0-9]+]]: ompt_event_cancel: task_data=[[TASK_ID:[0-9]+]], flags=ompt_cancel_parallel|ompt_cancel_detected=33, codeptr_ra=[[OTHER_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
+  // CHECK: {{^}}[[THREAD_ID]]: fuzzy_address={{.*}}[[OTHER_RETURN_ADDRESS]]

   return 0;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39708.121823.patch
Type: text/x-patch
Size: 3477 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171107/020a4c8f/attachment.bin>


More information about the cfe-commits mailing list