Skip to content

Commit 5e44069

Browse files
committedFeb 23, 2018
[OMPT] Fix test tasks/serialized.c with optimization
The compiler inlines the user code in the task. Check for that case at runtime by comparing the frame addresses and print the expected exit address. Also showcase how I think the OMPT tests could be reformatted to match LLVM's code style. In my opinion it would be great to that kind of change to all tests that need to be touched for whatever reason... Differential Revision: https://reviews.llvm.org/D43191 llvm-svn: 325921
1 parent fba2044 commit 5e44069

File tree

2 files changed

+114
-54
lines changed

2 files changed

+114
-54
lines changed
 

‎openmp/runtime/test/ompt/callback.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,11 @@ static void print_ids(int level)
6161
printf("%" PRIu64 ": task level %d: parallel_id=%" PRIu64 ", task_id=%" PRIu64 ", frame=%p\n", ompt_get_thread_data()->value, level, exists_task ? parallel_data->value : 0, exists_task ? task_data->value : 0, frame);
6262
}
6363

64-
#define print_frame(level)\
65-
do {\
66-
printf("%" PRIu64 ": __builtin_frame_address(%d)=%p\n", ompt_get_thread_data()->value, level, __builtin_frame_address(level));\
67-
} while(0)
64+
#define get_frame_address(level) __builtin_frame_address(level)
65+
66+
#define print_frame(level) \
67+
printf("%" PRIu64 ": __builtin_frame_address(%d)=%p\n", \
68+
ompt_get_thread_data()->value, level, get_frame_address(level))
6869

6970
// clang (version 5.0 and above) adds an intermediate function call with debug flag (-g)
7071
#if defined(TEST_NEED_PRINT_FRAME_FROM_OUTLINED_FN)

‎openmp/runtime/test/ompt/tasks/serialized.c

+109-50
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,33 @@
33
// UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7
44
#define TEST_NEED_PRINT_FRAME_FROM_OUTLINED_FN
55
#include "callback.h"
6-
#include <omp.h>
6+
#include <omp.h>
77
#include <math.h>
88

9-
int main()
10-
{
9+
int main() {
1110
omp_set_nested(0);
1211
print_frame(0);
13-
#pragma omp parallel num_threads(2)
12+
#pragma omp parallel num_threads(2)
1413
{
1514
print_frame_from_outlined_fn(1);
1615
print_ids(0);
1716
print_ids(1);
1817
print_frame(0);
19-
#pragma omp master
18+
#pragma omp master
2019
{
2120
print_ids(0);
21+
void *creator_frame = get_frame_address(0);
2222
int t = (int)sin(0.1);
23-
#pragma omp task if(t)
23+
#pragma omp task if (t)
2424
{
25-
print_frame(1);
25+
void *task_frame = get_frame_address(0);
26+
if (creator_frame == task_frame) {
27+
// Assume this code was inlined which the compiler is allowed to do.
28+
print_frame(0);
29+
} else {
30+
// The exit frame must be our parent!
31+
print_frame_from_outlined_fn(1);
32+
}
2633
print_ids(0);
2734
print_ids(1);
2835
print_ids(2);
@@ -33,63 +40,115 @@ int main()
3340
print_ids(0);
3441
}
3542

36-
3743
// Check if libomp supports the callbacks for this test.
38-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_task_create'
39-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_task_schedule'
40-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_parallel_begin'
41-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_parallel_end'
42-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_implicit_task'
43-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_mutex_acquire'
44-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_mutex_acquired'
45-
// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_mutex_released'
46-
47-
44+
// CHECK-NOT: {{^}}0: Could not register callback
45+
4846
// CHECK: {{^}}0: NULL_POINTER=[[NULL:.*$]]
4947

5048
// make sure initial data pointers are null
5149
// CHECK-NOT: 0: new_task_data initially not null
52-
53-
// CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_task_create: parent_task_id={{[0-9]+}}, parent_task_frame.exit=[[NULL]], parent_task_frame.reenter=[[NULL]], new_task_id={{[0-9]+}}, codeptr_ra=[[NULL]], task_type=ompt_task_initial=1, has_dependences=no
54-
// CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address(0)=[[MAIN_REENTER:0x[0-f]+]]
55-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_begin: parent_task_id=[[PARENT_TASK_ID:[0-9]+]], parent_task_frame.exit=[[NULL]], parent_task_frame.reenter=[[MAIN_REENTER]], parallel_id=[[PARALLEL_ID:[0-9]+]], requested_team_size=2, codeptr_ra=0x{{[0-f]+}}, invoker=[[PARALLEL_INVOKER:[0-9]+]]
50+
51+
// CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_task_create
52+
// CHECK-SAME: parent_task_id={{[0-9]+}}, parent_task_frame.exit=[[NULL]]
53+
// CHECK-SAME: parent_task_frame.reenter=[[NULL]]
54+
// CHECK-SAME: new_task_id={{[0-9]+}}, codeptr_ra=[[NULL]]
55+
// CHECK-SAME: task_type=ompt_task_initial=1, has_dependences=no
56+
// CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address(0)
57+
// CHECK-SAME: =[[MAIN_REENTER:0x[0-f]+]]
58+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_begin
59+
// CHECK-SAME: parent_task_id=[[PARENT_TASK_ID:[0-9]+]]
60+
// CHECK-SAME: parent_task_frame.exit=[[NULL]]
61+
// CHECK-SAME: parent_task_frame.reenter=[[MAIN_REENTER]]
62+
// CHECK-SAME: parallel_id=[[PARALLEL_ID:[0-9]+]], requested_team_size=2
63+
// CHECK-SAME: codeptr_ra=0x{{[0-f]+}}, invoker={{[0-9]+}}
5664

5765
// nested parallel masters
58-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_begin: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID:[0-9]+]]
59-
// CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address({{.}})=[[EXIT:0x[0-f]+]]
60-
// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT]], reenter_frame=[[NULL]]
61-
// CHECK: {{^}}[[MASTER_ID]]: task level 1: parallel_id=[[IMPLICIT_PARALLEL_ID:[0-9]+]], task_id=[[PARENT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[MAIN_REENTER]]
66+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_begin
67+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]]
68+
// CHECK-SAME: task_id=[[IMPLICIT_TASK_ID:[0-9]+]]
69+
// CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address
70+
// CHECK-SAME: =[[EXIT:0x[0-f]+]]
71+
72+
// CHECK: {{^}}[[MASTER_ID]]: task level 0
73+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
74+
// CHECK-SAME: exit_frame=[[EXIT]], reenter_frame=[[NULL]]
75+
76+
// CHECK: {{^}}[[MASTER_ID]]: task level 1
77+
// CHECK-SAME: parallel_id=[[IMPLICIT_PARALLEL_ID:[0-9]+]]
78+
// CHECK-SAME: task_id=[[PARENT_TASK_ID]],
79+
// CHECK-SAME: exit_frame=[[NULL]], reenter_frame=[[MAIN_REENTER]]
80+
6281
// CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address(0)=[[REENTER:0x[0-f]+]]
63-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_create: parent_task_id=[[IMPLICIT_TASK_ID]], parent_task_frame.exit=[[EXIT]], parent_task_frame.reenter=[[REENTER]], new_task_id=[[TASK_ID:[0-9]+]], codeptr_ra=[[RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
64-
// <- ompt_event_task_schedule ([[IMPLICIT_TASK_ID]], [[TASK_ID]]) would be expected here
65-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_schedule: first_task_id=[[IMPLICIT_TASK_ID]], second_task_id=[[TASK_ID]]
66-
// CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address(1)=[[TASK_EXIT:0x[0-f]+]]
67-
// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]], task_id=[[TASK_ID]], exit_frame=[[TASK_EXIT]], reenter_frame=[[NULL]]
68-
// CHECK: {{^}}[[MASTER_ID]]: task level 1: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT]], reenter_frame=[[REENTER]]
69-
// CHECK: {{^}}[[MASTER_ID]]: task level 2: parallel_id=[[IMPLICIT_PARALLEL_ID]], task_id=[[PARENT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[MAIN_REENTER]]
70-
// <- ompt_event_task_schedule ([[TASK_ID]], [[IMPLICIT_TASK_ID]]) would be expected here
71-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_schedule: first_task_id=[[TASK_ID]], second_task_id=[[IMPLICIT_TASK_ID]]
82+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_create
83+
// CHECK-SAME: parent_task_id=[[IMPLICIT_TASK_ID]]
84+
// CHECK-SAME: parent_task_frame.exit=[[EXIT]]
85+
// CHECK-SAME: parent_task_frame.reenter=[[REENTER]]
86+
// CHECK-SAME: new_task_id=[[TASK_ID:[0-9]+]]
87+
// CHECK-SAME: codeptr_ra=[[RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
88+
89+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_schedule:
90+
// CHECK-SAME: first_task_id=[[IMPLICIT_TASK_ID]], second_task_id=[[TASK_ID]]
91+
// CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address
92+
// CHECK-SAME: =[[TASK_EXIT:0x[0-f]+]]
93+
// CHECK: {{^}}[[MASTER_ID]]: task level 0
94+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[TASK_ID]]
95+
// CHECK-SAME: exit_frame=[[TASK_EXIT]], reenter_frame=[[NULL]]
96+
97+
// CHECK: {{^}}[[MASTER_ID]]: task level 1
98+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
99+
// CHECK-SAME: exit_frame=[[EXIT]], reenter_frame=[[REENTER]]
100+
101+
// CHECK: {{^}}[[MASTER_ID]]: task level 2
102+
// CHECK-SAME: parallel_id=[[IMPLICIT_PARALLEL_ID]]
103+
// CHECK-SAME: task_id=[[PARENT_TASK_ID]]
104+
// CHECK-SAME: exit_frame=[[NULL]], reenter_frame=[[MAIN_REENTER]]
105+
106+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_schedule
107+
// CHECK-SAME: first_task_id=[[TASK_ID]], second_task_id=[[IMPLICIT_TASK_ID]]
72108
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_end: task_id=[[TASK_ID]]
73109
// CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[RETURN_ADDRESS]]
74-
// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT]], reen
110+
111+
// CHECK: {{^}}[[MASTER_ID]]: task level 0
112+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
113+
// CHECK-SAME: exit_frame=[[EXIT]], reenter_frame=[[NULL]]
75114

76115
// implicit barrier parallel
77-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_barrier_begin: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
78-
// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[NULL]]
79-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_barrier_end: parallel_id={{[0-9]+}}, task_id=[[IMPLICIT_TASK_ID]]
80-
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end: parallel_id={{[0-9]+}}, task_id=[[IMPLICIT_TASK_ID]]
81-
82-
// CHECK: {{^}}[[THREAD_ID:[0-9]+]]: ompt_event_implicit_task_begin: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID:[0-9]+]]
83-
// CHECK: {{^}}[[THREAD_ID]]: __builtin_frame_address({{.}})=[[EXIT:0x[0-f]+]]
84-
// CHECK: {{^}}[[THREAD_ID]]: task level 0: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT]], reenter_frame=[[NULL]]
85-
// CHECK: {{^}}[[THREAD_ID]]: task level 1: parallel_id=[[IMPLICIT_PARALLEL_ID]], task_id=[[PARENT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[MAIN_REENTER]]
86-
// CHECK: {{^}}[[THREAD_ID]]: __builtin_frame_address(0)=[[REENTER:0x[0-f]+]]
87-
// CHECK: {{^}}[[THREAD_ID]]: ompt_event_barrier_begin: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
88-
// CHECK: {{^}}[[THREAD_ID]]: task level 0: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[NULL]]
89-
// CHECK: {{^}}[[THREAD_ID]]: ompt_event_barrier_end: parallel_id={{[0-9]+}}, task_id=[[IMPLICIT_TASK_ID]]
90-
// CHECK: {{^}}[[THREAD_ID]]: ompt_event_implicit_task_end: parallel_id={{[0-9]+}}, task_id=[[IMPLICIT_TASK_ID]]
116+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_barrier_begin
117+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
118+
// CHECK: {{^}}[[MASTER_ID]]: task level 0
119+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
120+
// CHECK-SAME: exit_frame=[[NULL]], reenter_frame=[[NULL]]
121+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_barrier_end
122+
// FIXME: parallel_id should be 0 because the region ended in the barrier!
123+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
124+
// CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end
125+
// CHECK-SAME: parallel_id=0, task_id=[[IMPLICIT_TASK_ID]]
126+
127+
// CHECK: {{^}}[[THREAD_ID:[0-9]+]]: ompt_event_implicit_task_begin
128+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]]
129+
// CHECK-SAME: task_id=[[IMPLICIT_TASK_ID:[0-9]+]]
130+
// CHECK: {{^}}[[THREAD_ID]]: __builtin_frame_address
131+
// CHECK-SAME: =[[EXIT:0x[0-f]+]]
132+
// CHECK: {{^}}[[THREAD_ID]]: task level 0
133+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
134+
// CHECK-SAME: exit_frame=[[EXIT]], reenter_frame=[[NULL]]
135+
// CHECK: {{^}}[[THREAD_ID]]: task level 1
136+
// CHECK-SAME: parallel_id=[[IMPLICIT_PARALLEL_ID]]
137+
// CHECK-SAME: task_id=[[PARENT_TASK_ID]]
138+
// CHECK-SAME: exit_frame=[[NULL]], reenter_frame=[[MAIN_REENTER]]
91139

140+
// CHECK: {{^}}[[THREAD_ID]]: __builtin_frame_address(0)={{0x[0-f]+}}
141+
// CHECK: {{^}}[[THREAD_ID]]: ompt_event_barrier_begin
142+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
143+
// CHECK: {{^}}[[THREAD_ID]]: task level 0
144+
// CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]
145+
// CHECK-SAME: exit_frame=[[NULL]], reenter_frame=[[NULL]]
146+
// parallel_id is 0 because the region ended in the barrier!
147+
// CHECK: {{^}}[[THREAD_ID]]: ompt_event_barrier_end
148+
// CHECK-SAME: parallel_id=0, task_id=[[IMPLICIT_TASK_ID]]
92149

150+
// CHECK: {{^}}[[THREAD_ID]]: ompt_event_implicit_task_end
151+
// CHECK-SAME: parallel_id=0, task_id=[[IMPLICIT_TASK_ID]]
93152

94153
return 0;
95154
}

0 commit comments

Comments
 (0)
Please sign in to comment.