annotate gcc/testsuite/gcc.dg/tm/20100610.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do compile } */
kono
parents:
diff changeset
2 /* { dg-options "-fgnu-tm -O3" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 /* The function calculateCircumCircle() should get inlined into the TM
kono
parents:
diff changeset
5 clone for TMelement_alloc(), so we don't need to generate a TM
kono
parents:
diff changeset
6 clone for calculateCircumCircle(). We also don't need to put its
kono
parents:
diff changeset
7 entry into the clone table since it's static. */
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 /* { dg-final { scan-assembler-not "ZGTt21calculateCircumCircle" } } */
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 extern double sqrt(double) __attribute__((transaction_pure));
kono
parents:
diff changeset
12 extern void *xmalloc(int) __attribute__((transaction_safe));
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 typedef struct coordinate {
kono
parents:
diff changeset
15 double x;
kono
parents:
diff changeset
16 double y;
kono
parents:
diff changeset
17 } coordinate_t;
kono
parents:
diff changeset
18 typedef struct element {
kono
parents:
diff changeset
19 coordinate_t coordinates[3];
kono
parents:
diff changeset
20 long numCoordinate;
kono
parents:
diff changeset
21 coordinate_t circumCenter;
kono
parents:
diff changeset
22 double circumRadius;
kono
parents:
diff changeset
23 } element_t;
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 __attribute__((transaction_safe))
kono
parents:
diff changeset
26 double
kono
parents:
diff changeset
27 coordinate_distance (coordinate_t* coordinatePtr, coordinate_t* aPtr)
kono
parents:
diff changeset
28 {
kono
parents:
diff changeset
29 return sqrt( coordinatePtr->x );
kono
parents:
diff changeset
30 }
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 __attribute__((transaction_safe))
kono
parents:
diff changeset
33 static void
kono
parents:
diff changeset
34 calculateCircumCircle (element_t* elementPtr)
kono
parents:
diff changeset
35 {
kono
parents:
diff changeset
36 long numCoordinate = elementPtr->numCoordinate;
kono
parents:
diff changeset
37 coordinate_t* coordinates = elementPtr->coordinates;
kono
parents:
diff changeset
38 coordinate_t* circumCenterPtr = &elementPtr->circumCenter;
kono
parents:
diff changeset
39 ((void) (0));
kono
parents:
diff changeset
40 if (numCoordinate == 2) {
kono
parents:
diff changeset
41 circumCenterPtr->x = (coordinates[0].x + coordinates[1].x) / 2.0;
kono
parents:
diff changeset
42 circumCenterPtr->y = (coordinates[0].y + coordinates[1].y) / 2.0;
kono
parents:
diff changeset
43 }
kono
parents:
diff changeset
44 else {
kono
parents:
diff changeset
45 double ax = coordinates[0].x;
kono
parents:
diff changeset
46 double ay = coordinates[0].y;
kono
parents:
diff changeset
47 double bx = coordinates[1].x;
kono
parents:
diff changeset
48 double by = coordinates[1].y;
kono
parents:
diff changeset
49 double cx = coordinates[2].x;
kono
parents:
diff changeset
50 double cy = coordinates[2].y;
kono
parents:
diff changeset
51 double bxDelta = bx - ax;
kono
parents:
diff changeset
52 double byDelta = by - ay;
kono
parents:
diff changeset
53 double cxDelta = cx - ax;
kono
parents:
diff changeset
54 double cyDelta = cy - ay;
kono
parents:
diff changeset
55 double bDistance2 = (bxDelta * bxDelta) + (byDelta * byDelta);
kono
parents:
diff changeset
56 double cDistance2 = (cxDelta * cxDelta) + (cyDelta * cyDelta);
kono
parents:
diff changeset
57 double xNumerator = (byDelta * cDistance2) - (cyDelta * bDistance2);
kono
parents:
diff changeset
58 double yNumerator = (bxDelta * cDistance2) - (cxDelta * bDistance2);
kono
parents:
diff changeset
59 double denominator = 2 * ((bxDelta * cyDelta) - (cxDelta * byDelta));
kono
parents:
diff changeset
60 double rx = ax - (xNumerator / denominator);
kono
parents:
diff changeset
61 double ry = ay + (yNumerator / denominator);
kono
parents:
diff changeset
62 circumCenterPtr->x = rx;
kono
parents:
diff changeset
63 circumCenterPtr->y = ry;
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65 elementPtr->circumRadius = coordinate_distance(circumCenterPtr,
kono
parents:
diff changeset
66 &coordinates[0]);
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 element_t*
kono
parents:
diff changeset
70 element_alloc (coordinate_t* coordinates, long numCoordinate)
kono
parents:
diff changeset
71 {
kono
parents:
diff changeset
72 element_t* elementPtr;
kono
parents:
diff changeset
73 elementPtr = (element_t*)xmalloc(sizeof(element_t));
kono
parents:
diff changeset
74 if (elementPtr) {
kono
parents:
diff changeset
75 calculateCircumCircle(elementPtr);
kono
parents:
diff changeset
76 }
kono
parents:
diff changeset
77 return elementPtr;
kono
parents:
diff changeset
78 }
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 __attribute__((transaction_safe))
kono
parents:
diff changeset
81 element_t*
kono
parents:
diff changeset
82 TMelement_alloc (coordinate_t* coordinates, long numCoordinate)
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 element_t* elementPtr;
kono
parents:
diff changeset
85 elementPtr = (element_t*)xmalloc(sizeof(element_t));
kono
parents:
diff changeset
86 if (elementPtr) {
kono
parents:
diff changeset
87 calculateCircumCircle(elementPtr);
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89 return elementPtr;
kono
parents:
diff changeset
90 }