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; }
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; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits