* gimple-fold.c (gimple_fold_stmt_to_constant_1): Avoid warning.
[gcc.git] / gcc / trans-mem.c
1 /* Passes for transactional memory support.
2 Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tree.h"
24 #include "gimple.h"
25 #include "tree-flow.h"
26 #include "tree-pass.h"
27 #include "tree-inline.h"
28 #include "diagnostic-core.h"
29 #include "demangle.h"
30 #include "output.h"
31 #include "trans-mem.h"
32 #include "params.h"
33 #include "target.h"
34 #include "langhooks.h"
35 #include "tree-pretty-print.h"
36 #include "gimple-pretty-print.h"
37 #include "cfgloop.h"
38
39
40 #define PROB_VERY_UNLIKELY (REG_BR_PROB_BASE / 2000 - 1)
41 #define PROB_ALWAYS (REG_BR_PROB_BASE)
42
43 #define A_RUNINSTRUMENTEDCODE 0x0001
44 #define A_RUNUNINSTRUMENTEDCODE 0x0002
45 #define A_SAVELIVEVARIABLES 0x0004
46 #define A_RESTORELIVEVARIABLES 0x0008
47 #define A_ABORTTRANSACTION 0x0010
48
49 #define AR_USERABORT 0x0001
50 #define AR_USERRETRY 0x0002
51 #define AR_TMCONFLICT 0x0004
52 #define AR_EXCEPTIONBLOCKABORT 0x0008
53 #define AR_OUTERABORT 0x0010
54
55 #define MODE_SERIALIRREVOCABLE 0x0000
56
57
58 /* The representation of a transaction changes several times during the
59 lowering process. In the beginning, in the front-end we have the
60 GENERIC tree TRANSACTION_EXPR. For example,
61
62 __transaction {
63 local++;
64 if (++global == 10)
65 __tm_abort;
66 }
67
68 During initial gimplification (gimplify.c) the TRANSACTION_EXPR node is
69 trivially replaced with a GIMPLE_TRANSACTION node.
70
71 During pass_lower_tm, we examine the body of transactions looking
72 for aborts. Transactions that do not contain an abort may be
73 merged into an outer transaction. We also add a TRY-FINALLY node
74 to arrange for the transaction to be committed on any exit.
75
76 [??? Think about how this arrangement affects throw-with-commit
77 and throw-with-abort operations. In this case we want the TRY to
78 handle gotos, but not to catch any exceptions because the transaction
79 will already be closed.]
80
81 GIMPLE_TRANSACTION [label=NULL] {
82 try {
83 local = local + 1;
84 t0 = global;
85 t1 = t0 + 1;
86 global = t1;
87 if (t1 == 10)
88 __builtin___tm_abort ();
89 } finally {
90 __builtin___tm_commit ();
91 }
92 }
93
94 During pass_lower_eh, we create EH regions for the transactions,
95 intermixed with the regular EH stuff. This gives us a nice persistent
96 mapping (all the way through rtl) from transactional memory operation
97 back to the transaction, which allows us to get the abnormal edges
98 correct to model transaction aborts and restarts:
99
100 GIMPLE_TRANSACTION [label=over]
101 local = local + 1;
102 t0 = global;
103 t1 = t0 + 1;
104 global = t1;
105 if (t1 == 10)
106 __builtin___tm_abort ();
107 __builtin___tm_commit ();
108 over:
109
110 This is the end of all_lowering_passes, and so is what is present
111 during the IPA passes, and through all of the optimization passes.
112
113 During pass_ipa_tm, we examine all GIMPLE_TRANSACTION blocks in all
114 functions and mark functions for cloning.
115
116 At the end of gimple optimization, before exiting SSA form,
117 pass_tm_edges replaces statements that perform transactional
118 memory operations with the appropriate TM builtins, and swap
119 out function calls with their transactional clones. At this
120 point we introduce the abnormal transaction restart edges and
121 complete lowering of the GIMPLE_TRANSACTION node.
122
123 x = __builtin___tm_start (MAY_ABORT);
124 eh_label:
125 if (x & abort_transaction)
126 goto over;
127 local = local + 1;
128 t0 = __builtin___tm_load (global);
129 t1 = t0 + 1;
130 __builtin___tm_store (&global, t1);
131 if (t1 == 10)
132 __builtin___tm_abort ();
133 __builtin___tm_commit ();
134 over:
135 */
136
137 \f
138 /* Return the attributes we want to examine for X, or NULL if it's not
139 something we examine. We look at function types, but allow pointers
140 to function types and function decls and peek through. */
141
142 static tree
143 get_attrs_for (const_tree x)
144 {
145 switch (TREE_CODE (x))
146 {
147 case FUNCTION_DECL:
148 return TYPE_ATTRIBUTES (TREE_TYPE (x));
149 break;
150
151 default:
152 if (TYPE_P (x))
153 return NULL;
154 x = TREE_TYPE (x);
155 if (TREE_CODE (x) != POINTER_TYPE)
156 return NULL;
157 /* FALLTHRU */
158
159 case POINTER_TYPE:
160 x = TREE_TYPE (x);
161 if (TREE_CODE (x) != FUNCTION_TYPE && TREE_CODE (x) != METHOD_TYPE)
162 return NULL;
163 /* FALLTHRU */
164
165 case FUNCTION_TYPE:
166 case METHOD_TYPE:
167 return TYPE_ATTRIBUTES (x);
168 }
169 }
170
171 /* Return true if X has been marked TM_PURE. */
172
173 bool
174 is_tm_pure (const_tree x)
175 {
176 unsigned flags;
177
178 switch (TREE_CODE (x))
179 {
180 case FUNCTION_DECL:
181 case FUNCTION_TYPE:
182 case METHOD_TYPE:
183 break;
184
185 default:
186 if (TYPE_P (x))
187 return false;
188 x = TREE_TYPE (x);
189 if (TREE_CODE (x) != POINTER_TYPE)
190 return false;
191 /* FALLTHRU */
192
193 case POINTER_TYPE:
194 x = TREE_TYPE (x);
195 if (TREE_CODE (x) != FUNCTION_TYPE && TREE_CODE (x) != METHOD_TYPE)
196 return false;
197 break;
198 }
199
200 flags = flags_from_decl_or_type (x);
201 return (flags & ECF_TM_PURE) != 0;
202 }
203
204 /* Return true if X has been marked TM_IRREVOCABLE. */
205
206 static bool
207 is_tm_irrevocable (tree x)
208 {
209 tree attrs = get_attrs_for (x);
210
211 if (attrs && lookup_attribute ("transaction_unsafe", attrs))
212 return true;
213
214 /* A call to the irrevocable builtin is by definition,
215 irrevocable. */
216 if (TREE_CODE (x) == ADDR_EXPR)
217 x = TREE_OPERAND (x, 0);
218 if (TREE_CODE (x) == FUNCTION_DECL
219 && DECL_BUILT_IN_CLASS (x) == BUILT_IN_NORMAL
220 && DECL_FUNCTION_CODE (x) == BUILT_IN_TM_IRREVOCABLE)
221 return true;
222
223 return false;
224 }
225
226 /* Return true if X has been marked TM_SAFE. */
227
228 bool
229 is_tm_safe (const_tree x)
230 {
231 if (flag_tm)
232 {
233 tree attrs = get_attrs_for (x);
234 if (attrs)
235 {
236 if (lookup_attribute ("transaction_safe", attrs))
237 return true;
238 if (lookup_attribute ("transaction_may_cancel_outer", attrs))
239 return true;
240 }
241 }
242 return false;
243 }
244
245 /* Return true if CALL is const, or tm_pure. */
246
247 static bool
248 is_tm_pure_call (gimple call)
249 {
250 tree fn = gimple_call_fn (call);
251
252 if (TREE_CODE (fn) == ADDR_EXPR)
253 {
254 fn = TREE_OPERAND (fn, 0);
255 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
256 }
257 else
258 fn = TREE_TYPE (fn);
259
260 return is_tm_pure (fn);
261 }
262
263 /* Return true if X has been marked TM_CALLABLE. */
264
265 static bool
266 is_tm_callable (tree x)
267 {
268 tree attrs = get_attrs_for (x);
269 if (attrs)
270 {
271 if (lookup_attribute ("transaction_callable", attrs))
272 return true;
273 if (lookup_attribute ("transaction_safe", attrs))
274 return true;
275 if (lookup_attribute ("transaction_may_cancel_outer", attrs))
276 return true;
277 }
278 return false;
279 }
280
281 /* Return true if X has been marked TRANSACTION_MAY_CANCEL_OUTER. */
282
283 bool
284 is_tm_may_cancel_outer (tree x)
285 {
286 tree attrs = get_attrs_for (x);
287 if (attrs)
288 return lookup_attribute ("transaction_may_cancel_outer", attrs) != NULL;
289 return false;
290 }
291
292 /* Return true for built in functions that "end" a transaction. */
293
294 bool
295 is_tm_ending_fndecl (tree fndecl)
296 {
297 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
298 switch (DECL_FUNCTION_CODE (fndecl))
299 {
300 case BUILT_IN_TM_COMMIT:
301 case BUILT_IN_TM_COMMIT_EH:
302 case BUILT_IN_TM_ABORT:
303 case BUILT_IN_TM_IRREVOCABLE:
304 return true;
305 default:
306 break;
307 }
308
309 return false;
310 }
311
312 /* Return true if STMT is a TM load. */
313
314 static bool
315 is_tm_load (gimple stmt)
316 {
317 tree fndecl;
318
319 if (gimple_code (stmt) != GIMPLE_CALL)
320 return false;
321
322 fndecl = gimple_call_fndecl (stmt);
323 return (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
324 && BUILTIN_TM_LOAD_P (DECL_FUNCTION_CODE (fndecl)));
325 }
326
327 /* Same as above, but for simple TM loads, that is, not the
328 after-write, after-read, etc optimized variants. */
329
330 static bool
331 is_tm_simple_load (gimple stmt)
332 {
333 tree fndecl;
334
335 if (gimple_code (stmt) != GIMPLE_CALL)
336 return false;
337
338 fndecl = gimple_call_fndecl (stmt);
339 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
340 {
341 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
342 return (fcode == BUILT_IN_TM_LOAD_1
343 || fcode == BUILT_IN_TM_LOAD_2
344 || fcode == BUILT_IN_TM_LOAD_4
345 || fcode == BUILT_IN_TM_LOAD_8
346 || fcode == BUILT_IN_TM_LOAD_FLOAT
347 || fcode == BUILT_IN_TM_LOAD_DOUBLE
348 || fcode == BUILT_IN_TM_LOAD_LDOUBLE
349 || fcode == BUILT_IN_TM_LOAD_M64
350 || fcode == BUILT_IN_TM_LOAD_M128
351 || fcode == BUILT_IN_TM_LOAD_M256);
352 }
353 return false;
354 }
355
356 /* Return true if STMT is a TM store. */
357
358 static bool
359 is_tm_store (gimple stmt)
360 {
361 tree fndecl;
362
363 if (gimple_code (stmt) != GIMPLE_CALL)
364 return false;
365
366 fndecl = gimple_call_fndecl (stmt);
367 return (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
368 && BUILTIN_TM_STORE_P (DECL_FUNCTION_CODE (fndecl)));
369 }
370
371 /* Same as above, but for simple TM stores, that is, not the
372 after-write, after-read, etc optimized variants. */
373
374 static bool
375 is_tm_simple_store (gimple stmt)
376 {
377 tree fndecl;
378
379 if (gimple_code (stmt) != GIMPLE_CALL)
380 return false;
381
382 fndecl = gimple_call_fndecl (stmt);
383 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
384 {
385 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
386 return (fcode == BUILT_IN_TM_STORE_1
387 || fcode == BUILT_IN_TM_STORE_2
388 || fcode == BUILT_IN_TM_STORE_4
389 || fcode == BUILT_IN_TM_STORE_8
390 || fcode == BUILT_IN_TM_STORE_FLOAT
391 || fcode == BUILT_IN_TM_STORE_DOUBLE
392 || fcode == BUILT_IN_TM_STORE_LDOUBLE
393 || fcode == BUILT_IN_TM_STORE_M64
394 || fcode == BUILT_IN_TM_STORE_M128
395 || fcode == BUILT_IN_TM_STORE_M256);
396 }
397 return false;
398 }
399
400 /* Return true if FNDECL is BUILT_IN_TM_ABORT. */
401
402 static bool
403 is_tm_abort (tree fndecl)
404 {
405 return (fndecl
406 && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
407 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_TM_ABORT);
408 }
409
410 /* Build a GENERIC tree for a user abort. This is called by front ends
411 while transforming the __tm_abort statement. */
412
413 tree
414 build_tm_abort_call (location_t loc, bool is_outer)
415 {
416 return build_call_expr_loc (loc, builtin_decl_explicit (BUILT_IN_TM_ABORT), 1,
417 build_int_cst (integer_type_node,
418 AR_USERABORT
419 | (is_outer ? AR_OUTERABORT : 0)));
420 }
421
422 /* Common gateing function for several of the TM passes. */
423
424 static bool
425 gate_tm (void)
426 {
427 return flag_tm;
428 }
429 \f
430 /* Map for aribtrary function replacement under TM, as created
431 by the tm_wrap attribute. */
432
433 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
434 htab_t tm_wrap_map;
435
436 void
437 record_tm_replacement (tree from, tree to)
438 {
439 struct tree_map **slot, *h;
440
441 /* Do not inline wrapper functions that will get replaced in the TM
442 pass.
443
444 Suppose you have foo() that will get replaced into tmfoo(). Make
445 sure the inliner doesn't try to outsmart us and inline foo()
446 before we get a chance to do the TM replacement. */
447 DECL_UNINLINABLE (from) = 1;
448
449 if (tm_wrap_map == NULL)
450 tm_wrap_map = htab_create_ggc (32, tree_map_hash, tree_map_eq, 0);
451
452 h = ggc_alloc_tree_map ();
453 h->hash = htab_hash_pointer (from);
454 h->base.from = from;
455 h->to = to;
456
457 slot = (struct tree_map **)
458 htab_find_slot_with_hash (tm_wrap_map, h, h->hash, INSERT);
459 *slot = h;
460 }
461
462 /* Return a TM-aware replacement function for DECL. */
463
464 static tree
465 find_tm_replacement_function (tree fndecl)
466 {
467 if (tm_wrap_map)
468 {
469 struct tree_map *h, in;
470
471 in.base.from = fndecl;
472 in.hash = htab_hash_pointer (fndecl);
473 h = (struct tree_map *) htab_find_with_hash (tm_wrap_map, &in, in.hash);
474 if (h)
475 return h->to;
476 }
477
478 /* ??? We may well want TM versions of most of the common <string.h>
479 functions. For now, we've already these two defined. */
480 /* Adjust expand_call_tm() attributes as necessary for the cases
481 handled here: */
482 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
483 switch (DECL_FUNCTION_CODE (fndecl))
484 {
485 case BUILT_IN_MEMCPY:
486 return builtin_decl_explicit (BUILT_IN_TM_MEMCPY);
487 case BUILT_IN_MEMMOVE:
488 return builtin_decl_explicit (BUILT_IN_TM_MEMMOVE);
489 case BUILT_IN_MEMSET:
490 return builtin_decl_explicit (BUILT_IN_TM_MEMSET);
491 default:
492 return NULL;
493 }
494
495 return NULL;
496 }
497
498 /* When appropriate, record TM replacement for memory allocation functions.
499
500 FROM is the FNDECL to wrap. */
501 void
502 tm_malloc_replacement (tree from)
503 {
504 const char *str;
505 tree to;
506
507 if (TREE_CODE (from) != FUNCTION_DECL)
508 return;
509
510 /* If we have a previous replacement, the user must be explicitly
511 wrapping malloc/calloc/free. They better know what they're
512 doing... */
513 if (find_tm_replacement_function (from))
514 return;
515
516 str = IDENTIFIER_POINTER (DECL_NAME (from));
517
518 if (!strcmp (str, "malloc"))
519 to = builtin_decl_explicit (BUILT_IN_TM_MALLOC);
520 else if (!strcmp (str, "calloc"))
521 to = builtin_decl_explicit (BUILT_IN_TM_CALLOC);
522 else if (!strcmp (str, "free"))
523 to = builtin_decl_explicit (BUILT_IN_TM_FREE);
524 else
525 return;
526
527 TREE_NOTHROW (to) = 0;
528
529 record_tm_replacement (from, to);
530 }
531 \f
532 /* Diagnostics for tm_safe functions/regions. Called by the front end
533 once we've lowered the function to high-gimple. */
534
535 /* Subroutine of diagnose_tm_safe_errors, called through walk_gimple_seq.
536 Process exactly one statement. WI->INFO is set to non-null when in
537 the context of a tm_safe function, and null for a __transaction block. */
538
539 #define DIAG_TM_OUTER 1
540 #define DIAG_TM_SAFE 2
541 #define DIAG_TM_RELAXED 4
542
543 struct diagnose_tm
544 {
545 unsigned int summary_flags : 8;
546 unsigned int block_flags : 8;
547 unsigned int func_flags : 8;
548 unsigned int saw_volatile : 1;
549 gimple stmt;
550 };
551
552 /* Tree callback function for diagnose_tm pass. */
553
554 static tree
555 diagnose_tm_1_op (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
556 void *data)
557 {
558 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
559 struct diagnose_tm *d = (struct diagnose_tm *) wi->info;
560 enum tree_code code = TREE_CODE (*tp);
561
562 if ((code == VAR_DECL
563 || code == RESULT_DECL
564 || code == PARM_DECL)
565 && d->block_flags & (DIAG_TM_SAFE | DIAG_TM_RELAXED)
566 && TREE_THIS_VOLATILE (TREE_TYPE (*tp))
567 && !d->saw_volatile)
568 {
569 d->saw_volatile = 1;
570 error_at (gimple_location (d->stmt),
571 "invalid volatile use of %qD inside transaction",
572 *tp);
573 }
574
575 return NULL_TREE;
576 }
577
578 static tree
579 diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p,
580 struct walk_stmt_info *wi)
581 {
582 gimple stmt = gsi_stmt (*gsi);
583 struct diagnose_tm *d = (struct diagnose_tm *) wi->info;
584
585 /* Save stmt for use in leaf analysis. */
586 d->stmt = stmt;
587
588 switch (gimple_code (stmt))
589 {
590 case GIMPLE_CALL:
591 {
592 tree fn = gimple_call_fn (stmt);
593
594 if ((d->summary_flags & DIAG_TM_OUTER) == 0
595 && is_tm_may_cancel_outer (fn))
596 error_at (gimple_location (stmt),
597 "%<transaction_may_cancel_outer%> function call not within"
598 " outer transaction or %<transaction_may_cancel_outer%>");
599
600 if (d->summary_flags & DIAG_TM_SAFE)
601 {
602 bool is_safe, direct_call_p;
603 tree replacement;
604
605 if (TREE_CODE (fn) == ADDR_EXPR
606 && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL)
607 {
608 direct_call_p = true;
609 replacement = TREE_OPERAND (fn, 0);
610 replacement = find_tm_replacement_function (replacement);
611 if (replacement)
612 fn = replacement;
613 }
614 else
615 {
616 direct_call_p = false;
617 replacement = NULL_TREE;
618 }
619
620 if (is_tm_safe_or_pure (fn))
621 is_safe = true;
622 else if (is_tm_callable (fn) || is_tm_irrevocable (fn))
623 {
624 /* A function explicitly marked transaction_callable as
625 opposed to transaction_safe is being defined to be
626 unsafe as part of its ABI, regardless of its contents. */
627 is_safe = false;
628 }
629 else if (direct_call_p)
630 {
631 if (flags_from_decl_or_type (fn) & ECF_TM_BUILTIN)
632 is_safe = true;
633 else if (replacement)
634 {
635 /* ??? At present we've been considering replacements
636 merely transaction_callable, and therefore might
637 enter irrevocable. The tm_wrap attribute has not
638 yet made it into the new language spec. */
639 is_safe = false;
640 }
641 else
642 {
643 /* ??? Diagnostics for unmarked direct calls moved into
644 the IPA pass. Section 3.2 of the spec details how
645 functions not marked should be considered "implicitly
646 safe" based on having examined the function body. */
647 is_safe = true;
648 }
649 }
650 else
651 {
652 /* An unmarked indirect call. Consider it unsafe even
653 though optimization may yet figure out how to inline. */
654 is_safe = false;
655 }
656
657 if (!is_safe)
658 {
659 if (TREE_CODE (fn) == ADDR_EXPR)
660 fn = TREE_OPERAND (fn, 0);
661 if (d->block_flags & DIAG_TM_SAFE)
662 {
663 if (direct_call_p)
664 error_at (gimple_location (stmt),
665 "unsafe function call %qD within "
666 "atomic transaction", fn);
667 else
668 {
669 if (!DECL_P (fn) || DECL_NAME (fn))
670 error_at (gimple_location (stmt),
671 "unsafe function call %qE within "
672 "atomic transaction", fn);
673 else
674 error_at (gimple_location (stmt),
675 "unsafe indirect function call within "
676 "atomic transaction");
677 }
678 }
679 else
680 {
681 if (direct_call_p)
682 error_at (gimple_location (stmt),
683 "unsafe function call %qD within "
684 "%<transaction_safe%> function", fn);
685 else
686 {
687 if (!DECL_P (fn) || DECL_NAME (fn))
688 error_at (gimple_location (stmt),
689 "unsafe function call %qE within "
690 "%<transaction_safe%> function", fn);
691 else
692 error_at (gimple_location (stmt),
693 "unsafe indirect function call within "
694 "%<transaction_safe%> function");
695 }
696 }
697 }
698 }
699 }
700 break;
701
702 case GIMPLE_ASM:
703 /* ??? We ought to come up with a way to add attributes to
704 asm statements, and then add "transaction_safe" to it.
705 Either that or get the language spec to resurrect __tm_waiver. */
706 if (d->block_flags & DIAG_TM_SAFE)
707 error_at (gimple_location (stmt),
708 "asm not allowed in atomic transaction");
709 else if (d->func_flags & DIAG_TM_SAFE)
710 error_at (gimple_location (stmt),
711 "asm not allowed in %<transaction_safe%> function");
712 break;
713
714 case GIMPLE_TRANSACTION:
715 {
716 unsigned char inner_flags = DIAG_TM_SAFE;
717
718 if (gimple_transaction_subcode (stmt) & GTMA_IS_RELAXED)
719 {
720 if (d->block_flags & DIAG_TM_SAFE)
721 error_at (gimple_location (stmt),
722 "relaxed transaction in atomic transaction");
723 else if (d->func_flags & DIAG_TM_SAFE)
724 error_at (gimple_location (stmt),
725 "relaxed transaction in %<transaction_safe%> function");
726 inner_flags = DIAG_TM_RELAXED;
727 }
728 else if (gimple_transaction_subcode (stmt) & GTMA_IS_OUTER)
729 {
730 if (d->block_flags)
731 error_at (gimple_location (stmt),
732 "outer transaction in transaction");
733 else if (d->func_flags & DIAG_TM_OUTER)
734 error_at (gimple_location (stmt),
735 "outer transaction in "
736 "%<transaction_may_cancel_outer%> function");
737 else if (d->func_flags & DIAG_TM_SAFE)
738 error_at (gimple_location (stmt),
739 "outer transaction in %<transaction_safe%> function");
740 inner_flags |= DIAG_TM_OUTER;
741 }
742
743 *handled_ops_p = true;
744 if (gimple_transaction_body (stmt))
745 {
746 struct walk_stmt_info wi_inner;
747 struct diagnose_tm d_inner;
748
749 memset (&d_inner, 0, sizeof (d_inner));
750 d_inner.func_flags = d->func_flags;
751 d_inner.block_flags = d->block_flags | inner_flags;
752 d_inner.summary_flags = d_inner.func_flags | d_inner.block_flags;
753
754 memset (&wi_inner, 0, sizeof (wi_inner));
755 wi_inner.info = &d_inner;
756
757 walk_gimple_seq (gimple_transaction_body (stmt),
758 diagnose_tm_1, diagnose_tm_1_op, &wi_inner);
759 }
760 }
761 break;
762
763 default:
764 break;
765 }
766
767 return NULL_TREE;
768 }
769
770 static unsigned int
771 diagnose_tm_blocks (void)
772 {
773 struct walk_stmt_info wi;
774 struct diagnose_tm d;
775
776 memset (&d, 0, sizeof (d));
777 if (is_tm_may_cancel_outer (current_function_decl))
778 d.func_flags = DIAG_TM_OUTER | DIAG_TM_SAFE;
779 else if (is_tm_safe (current_function_decl))
780 d.func_flags = DIAG_TM_SAFE;
781 d.summary_flags = d.func_flags;
782
783 memset (&wi, 0, sizeof (wi));
784 wi.info = &d;
785
786 walk_gimple_seq (gimple_body (current_function_decl),
787 diagnose_tm_1, diagnose_tm_1_op, &wi);
788
789 return 0;
790 }
791
792 struct gimple_opt_pass pass_diagnose_tm_blocks =
793 {
794 {
795 GIMPLE_PASS,
796 "*diagnose_tm_blocks", /* name */
797 gate_tm, /* gate */
798 diagnose_tm_blocks, /* execute */
799 NULL, /* sub */
800 NULL, /* next */
801 0, /* static_pass_number */
802 TV_TRANS_MEM, /* tv_id */
803 PROP_gimple_any, /* properties_required */
804 0, /* properties_provided */
805 0, /* properties_destroyed */
806 0, /* todo_flags_start */
807 0, /* todo_flags_finish */
808 }
809 };
810 \f
811 /* Instead of instrumenting thread private memory, we save the
812 addresses in a log which we later use to save/restore the addresses
813 upon transaction start/restart.
814
815 The log is keyed by address, where each element contains individual
816 statements among different code paths that perform the store.
817
818 This log is later used to generate either plain save/restore of the
819 addresses upon transaction start/restart, or calls to the ITM_L*
820 logging functions.
821
822 So for something like:
823
824 struct large { int x[1000]; };
825 struct large lala = { 0 };
826 __transaction {
827 lala.x[i] = 123;
828 ...
829 }
830
831 We can either save/restore:
832
833 lala = { 0 };
834 trxn = _ITM_startTransaction ();
835 if (trxn & a_saveLiveVariables)
836 tmp_lala1 = lala.x[i];
837 else if (a & a_restoreLiveVariables)
838 lala.x[i] = tmp_lala1;
839
840 or use the logging functions:
841
842 lala = { 0 };
843 trxn = _ITM_startTransaction ();
844 _ITM_LU4 (&lala.x[i]);
845
846 Obviously, if we use _ITM_L* to log, we prefer to call _ITM_L* as
847 far up the dominator tree to shadow all of the writes to a given
848 location (thus reducing the total number of logging calls), but not
849 so high as to be called on a path that does not perform a
850 write. */
851
852 /* One individual log entry. We may have multiple statements for the
853 same location if neither dominate each other (on different
854 execution paths). */
855 typedef struct tm_log_entry
856 {
857 /* Address to save. */
858 tree addr;
859 /* Entry block for the transaction this address occurs in. */
860 basic_block entry_block;
861 /* Dominating statements the store occurs in. */
862 gimple_vec stmts;
863 /* Initially, while we are building the log, we place a nonzero
864 value here to mean that this address *will* be saved with a
865 save/restore sequence. Later, when generating the save sequence
866 we place the SSA temp generated here. */
867 tree save_var;
868 } *tm_log_entry_t;
869
870 /* The actual log. */
871 static htab_t tm_log;
872
873 /* Addresses to log with a save/restore sequence. These should be in
874 dominator order. */
875 static VEC(tree,heap) *tm_log_save_addresses;
876
877 /* Map for an SSA_NAME originally pointing to a non aliased new piece
878 of memory (malloc, alloc, etc). */
879 static htab_t tm_new_mem_hash;
880
881 enum thread_memory_type
882 {
883 mem_non_local = 0,
884 mem_thread_local,
885 mem_transaction_local,
886 mem_max
887 };
888
889 typedef struct tm_new_mem_map
890 {
891 /* SSA_NAME being dereferenced. */
892 tree val;
893 enum thread_memory_type local_new_memory;
894 } tm_new_mem_map_t;
895
896 /* Htab support. Return hash value for a `tm_log_entry'. */
897 static hashval_t
898 tm_log_hash (const void *p)
899 {
900 const struct tm_log_entry *log = (const struct tm_log_entry *) p;
901 return iterative_hash_expr (log->addr, 0);
902 }
903
904 /* Htab support. Return true if two log entries are the same. */
905 static int
906 tm_log_eq (const void *p1, const void *p2)
907 {
908 const struct tm_log_entry *log1 = (const struct tm_log_entry *) p1;
909 const struct tm_log_entry *log2 = (const struct tm_log_entry *) p2;
910
911 /* FIXME:
912
913 rth: I suggest that we get rid of the component refs etc.
914 I.e. resolve the reference to base + offset.
915
916 We may need to actually finish a merge with mainline for this,
917 since we'd like to be presented with Richi's MEM_REF_EXPRs more
918 often than not. But in the meantime your tm_log_entry could save
919 the results of get_inner_reference.
920
921 See: g++.dg/tm/pr46653.C
922 */
923
924 /* Special case plain equality because operand_equal_p() below will
925 return FALSE if the addresses are equal but they have
926 side-effects (e.g. a volatile address). */
927 if (log1->addr == log2->addr)
928 return true;
929
930 return operand_equal_p (log1->addr, log2->addr, 0);
931 }
932
933 /* Htab support. Free one tm_log_entry. */
934 static void
935 tm_log_free (void *p)
936 {
937 struct tm_log_entry *lp = (struct tm_log_entry *) p;
938 VEC_free (gimple, heap, lp->stmts);
939 free (lp);
940 }
941
942 /* Initialize logging data structures. */
943 static void
944 tm_log_init (void)
945 {
946 tm_log = htab_create (10, tm_log_hash, tm_log_eq, tm_log_free);
947 tm_new_mem_hash = htab_create (5, struct_ptr_hash, struct_ptr_eq, free);
948 tm_log_save_addresses = VEC_alloc (tree, heap, 5);
949 }
950
951 /* Free logging data structures. */
952 static void
953 tm_log_delete (void)
954 {
955 htab_delete (tm_log);
956 htab_delete (tm_new_mem_hash);
957 VEC_free (tree, heap, tm_log_save_addresses);
958 }
959
960 /* Return true if MEM is a transaction invariant memory for the TM
961 region starting at REGION_ENTRY_BLOCK. */
962 static bool
963 transaction_invariant_address_p (const_tree mem, basic_block region_entry_block)
964 {
965 if ((TREE_CODE (mem) == INDIRECT_REF || TREE_CODE (mem) == MEM_REF)
966 && TREE_CODE (TREE_OPERAND (mem, 0)) == SSA_NAME)
967 {
968 basic_block def_bb;
969
970 def_bb = gimple_bb (SSA_NAME_DEF_STMT (TREE_OPERAND (mem, 0)));
971 return def_bb != region_entry_block
972 && dominated_by_p (CDI_DOMINATORS, region_entry_block, def_bb);
973 }
974
975 mem = strip_invariant_refs (mem);
976 return mem && (CONSTANT_CLASS_P (mem) || decl_address_invariant_p (mem));
977 }
978
979 /* Given an address ADDR in STMT, find it in the memory log or add it,
980 making sure to keep only the addresses highest in the dominator
981 tree.
982
983 ENTRY_BLOCK is the entry_block for the transaction.
984
985 If we find the address in the log, make sure it's either the same
986 address, or an equivalent one that dominates ADDR.
987
988 If we find the address, but neither ADDR dominates the found
989 address, nor the found one dominates ADDR, we're on different
990 execution paths. Add it.
991
992 If known, ENTRY_BLOCK is the entry block for the region, otherwise
993 NULL. */
994 static void
995 tm_log_add (basic_block entry_block, tree addr, gimple stmt)
996 {
997 void **slot;
998 struct tm_log_entry l, *lp;
999
1000 l.addr = addr;
1001 slot = htab_find_slot (tm_log, &l, INSERT);
1002 if (!*slot)
1003 {
1004 tree type = TREE_TYPE (addr);
1005
1006 lp = XNEW (struct tm_log_entry);
1007 lp->addr = addr;
1008 *slot = lp;
1009
1010 /* Small invariant addresses can be handled as save/restores. */
1011 if (entry_block
1012 && transaction_invariant_address_p (lp->addr, entry_block)
1013 && TYPE_SIZE_UNIT (type) != NULL
1014 && host_integerp (TYPE_SIZE_UNIT (type), 1)
1015 && (tree_low_cst (TYPE_SIZE_UNIT (type), 1)
1016 < PARAM_VALUE (PARAM_TM_MAX_AGGREGATE_SIZE))
1017 /* We must be able to copy this type normally. I.e., no
1018 special constructors and the like. */
1019 && !TREE_ADDRESSABLE (type))
1020 {
1021 lp->save_var = create_tmp_reg (TREE_TYPE (lp->addr), "tm_save");
1022 add_referenced_var (lp->save_var);
1023 lp->stmts = NULL;
1024 lp->entry_block = entry_block;
1025 /* Save addresses separately in dominator order so we don't
1026 get confused by overlapping addresses in the save/restore
1027 sequence. */
1028 VEC_safe_push (tree, heap, tm_log_save_addresses, lp->addr);
1029 }
1030 else
1031 {
1032 /* Use the logging functions. */
1033 lp->stmts = VEC_alloc (gimple, heap, 5);
1034 VEC_quick_push (gimple, lp->stmts, stmt);
1035 lp->save_var = NULL;
1036 }
1037 }
1038 else
1039 {
1040 size_t i;
1041 gimple oldstmt;
1042
1043 lp = (struct tm_log_entry *) *slot;
1044
1045 /* If we're generating a save/restore sequence, we don't care
1046 about statements. */
1047 if (lp->save_var)
1048 return;
1049
1050 for (i = 0; VEC_iterate (gimple, lp->stmts, i, oldstmt); ++i)
1051 {
1052 if (stmt == oldstmt)
1053 return;
1054 /* We already have a store to the same address, higher up the
1055 dominator tree. Nothing to do. */
1056 if (dominated_by_p (CDI_DOMINATORS,
1057 gimple_bb (stmt), gimple_bb (oldstmt)))
1058 return;
1059 /* We should be processing blocks in dominator tree order. */
1060 gcc_assert (!dominated_by_p (CDI_DOMINATORS,
1061 gimple_bb (oldstmt), gimple_bb (stmt)));
1062 }
1063 /* Store is on a different code path. */
1064 VEC_safe_push (gimple, heap, lp->stmts, stmt);
1065 }
1066 }
1067
1068 /* Gimplify the address of a TARGET_MEM_REF. Return the SSA_NAME
1069 result, insert the new statements before GSI. */
1070
1071 static tree
1072 gimplify_addr (gimple_stmt_iterator *gsi, tree x)
1073 {
1074 if (TREE_CODE (x) == TARGET_MEM_REF)
1075 x = tree_mem_ref_addr (build_pointer_type (TREE_TYPE (x)), x);
1076 else
1077 x = build_fold_addr_expr (x);
1078 return force_gimple_operand_gsi (gsi, x, true, NULL, true, GSI_SAME_STMT);
1079 }
1080
1081 /* Instrument one address with the logging functions.
1082 ADDR is the address to save.
1083 STMT is the statement before which to place it. */
1084 static void
1085 tm_log_emit_stmt (tree addr, gimple stmt)
1086 {
1087 tree type = TREE_TYPE (addr);
1088 tree size = TYPE_SIZE_UNIT (type);
1089 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
1090 gimple log;
1091 enum built_in_function code = BUILT_IN_TM_LOG;
1092
1093 if (type == float_type_node)
1094 code = BUILT_IN_TM_LOG_FLOAT;
1095 else if (type == double_type_node)
1096 code = BUILT_IN_TM_LOG_DOUBLE;
1097 else if (type == long_double_type_node)
1098 code = BUILT_IN_TM_LOG_LDOUBLE;
1099 else if (host_integerp (size, 1))
1100 {
1101 unsigned int n = tree_low_cst (size, 1);
1102 switch (n)
1103 {
1104 case 1:
1105 code = BUILT_IN_TM_LOG_1;
1106 break;
1107 case 2:
1108 code = BUILT_IN_TM_LOG_2;
1109 break;
1110 case 4:
1111 code = BUILT_IN_TM_LOG_4;
1112 break;
1113 case 8:
1114 code = BUILT_IN_TM_LOG_8;
1115 break;
1116 default:
1117 code = BUILT_IN_TM_LOG;
1118 if (TREE_CODE (type) == VECTOR_TYPE)
1119 {
1120 if (n == 8 && builtin_decl_explicit (BUILT_IN_TM_LOG_M64))
1121 code = BUILT_IN_TM_LOG_M64;
1122 else if (n == 16 && builtin_decl_explicit (BUILT_IN_TM_LOG_M128))
1123 code = BUILT_IN_TM_LOG_M128;
1124 else if (n == 32 && builtin_decl_explicit (BUILT_IN_TM_LOG_M256))
1125 code = BUILT_IN_TM_LOG_M256;
1126 }
1127 break;
1128 }
1129 }
1130
1131 addr = gimplify_addr (&gsi, addr);
1132 if (code == BUILT_IN_TM_LOG)
1133 log = gimple_build_call (builtin_decl_explicit (code), 2, addr, size);
1134 else
1135 log = gimple_build_call (builtin_decl_explicit (code), 1, addr);
1136 gsi_insert_before (&gsi, log, GSI_SAME_STMT);
1137 }
1138
1139 /* Go through the log and instrument address that must be instrumented
1140 with the logging functions. Leave the save/restore addresses for
1141 later. */
1142 static void
1143 tm_log_emit (void)
1144 {
1145 htab_iterator hi;
1146 struct tm_log_entry *lp;
1147
1148 FOR_EACH_HTAB_ELEMENT (tm_log, lp, tm_log_entry_t, hi)
1149 {
1150 size_t i;
1151 gimple stmt;
1152
1153 if (dump_file)
1154 {
1155 fprintf (dump_file, "TM thread private mem logging: ");
1156 print_generic_expr (dump_file, lp->addr, 0);
1157 fprintf (dump_file, "\n");
1158 }
1159
1160 if (lp->save_var)
1161 {
1162 if (dump_file)
1163 fprintf (dump_file, "DUMPING to variable\n");
1164 continue;
1165 }
1166 else
1167 {
1168 if (dump_file)
1169 fprintf (dump_file, "DUMPING with logging functions\n");
1170 for (i = 0; VEC_iterate (gimple, lp->stmts, i, stmt); ++i)
1171 tm_log_emit_stmt (lp->addr, stmt);
1172 }
1173 }
1174 }
1175
1176 /* Emit the save sequence for the corresponding addresses in the log.
1177 ENTRY_BLOCK is the entry block for the transaction.
1178 BB is the basic block to insert the code in. */
1179 static void
1180 tm_log_emit_saves (basic_block entry_block, basic_block bb)
1181 {
1182 size_t i;
1183 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1184 gimple stmt;
1185 struct tm_log_entry l, *lp;
1186
1187 for (i = 0; i < VEC_length (tree, tm_log_save_addresses); ++i)
1188 {
1189 l.addr = VEC_index (tree, tm_log_save_addresses, i);
1190 lp = (struct tm_log_entry *) *htab_find_slot (tm_log, &l, NO_INSERT);
1191 gcc_assert (lp->save_var != NULL);
1192
1193 /* We only care about variables in the current transaction. */
1194 if (lp->entry_block != entry_block)
1195 continue;
1196
1197 stmt = gimple_build_assign (lp->save_var, unshare_expr (lp->addr));
1198
1199 /* Make sure we can create an SSA_NAME for this type. For
1200 instance, aggregates aren't allowed, in which case the system
1201 will create a VOP for us and everything will just work. */
1202 if (is_gimple_reg_type (TREE_TYPE (lp->save_var)))
1203 {
1204 lp->save_var = make_ssa_name (lp->save_var, stmt);
1205 gimple_assign_set_lhs (stmt, lp->save_var);
1206 }
1207
1208 gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1209 }
1210 }
1211
1212 /* Emit the restore sequence for the corresponding addresses in the log.
1213 ENTRY_BLOCK is the entry block for the transaction.
1214 BB is the basic block to insert the code in. */
1215 static void
1216 tm_log_emit_restores (basic_block entry_block, basic_block bb)
1217 {
1218 int i;
1219 struct tm_log_entry l, *lp;
1220 gimple_stmt_iterator gsi;
1221 gimple stmt;
1222
1223 for (i = VEC_length (tree, tm_log_save_addresses) - 1; i >= 0; i--)
1224 {
1225 l.addr = VEC_index (tree, tm_log_save_addresses, i);
1226 lp = (struct tm_log_entry *) *htab_find_slot (tm_log, &l, NO_INSERT);
1227 gcc_assert (lp->save_var != NULL);
1228
1229 /* We only care about variables in the current transaction. */
1230 if (lp->entry_block != entry_block)
1231 continue;
1232
1233 /* Restores are in LIFO order from the saves in case we have
1234 overlaps. */
1235 gsi = gsi_start_bb (bb);
1236
1237 stmt = gimple_build_assign (unshare_expr (lp->addr), lp->save_var);
1238 gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
1239 }
1240 }
1241
1242 /* Emit the checks for performing either a save or a restore sequence.
1243
1244 TRXN_PROP is either A_SAVELIVEVARIABLES or A_RESTORELIVEVARIABLES.
1245
1246 The code sequence is inserted in a new basic block created in
1247 END_BB which is inserted between BEFORE_BB and the destination of
1248 FALLTHRU_EDGE.
1249
1250 STATUS is the return value from _ITM_beginTransaction.
1251 ENTRY_BLOCK is the entry block for the transaction.
1252 EMITF is a callback to emit the actual save/restore code.
1253
1254 The basic block containing the conditional checking for TRXN_PROP
1255 is returned. */
1256 static basic_block
1257 tm_log_emit_save_or_restores (basic_block entry_block,
1258 unsigned trxn_prop,
1259 tree status,
1260 void (*emitf)(basic_block, basic_block),
1261 basic_block before_bb,
1262 edge fallthru_edge,
1263 basic_block *end_bb)
1264 {
1265 basic_block cond_bb, code_bb;
1266 gimple cond_stmt, stmt;
1267 gimple_stmt_iterator gsi;
1268 tree t1, t2;
1269 int old_flags = fallthru_edge->flags;
1270
1271 cond_bb = create_empty_bb (before_bb);
1272 code_bb = create_empty_bb (cond_bb);
1273 *end_bb = create_empty_bb (code_bb);
1274 if (current_loops && before_bb->loop_father)
1275 {
1276 add_bb_to_loop (cond_bb, before_bb->loop_father);
1277 add_bb_to_loop (code_bb, before_bb->loop_father);
1278 add_bb_to_loop (*end_bb, before_bb->loop_father);
1279 }
1280 redirect_edge_pred (fallthru_edge, *end_bb);
1281 fallthru_edge->flags = EDGE_FALLTHRU;
1282 make_edge (before_bb, cond_bb, old_flags);
1283
1284 set_immediate_dominator (CDI_DOMINATORS, cond_bb, before_bb);
1285 set_immediate_dominator (CDI_DOMINATORS, code_bb, cond_bb);
1286
1287 gsi = gsi_last_bb (cond_bb);
1288
1289 /* t1 = status & A_{property}. */
1290 t1 = make_rename_temp (TREE_TYPE (status), NULL);
1291 t2 = build_int_cst (TREE_TYPE (status), trxn_prop);
1292 stmt = gimple_build_assign_with_ops (BIT_AND_EXPR, t1, status, t2);
1293 gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
1294
1295 /* if (t1). */
1296 t2 = build_int_cst (TREE_TYPE (status), 0);
1297 cond_stmt = gimple_build_cond (NE_EXPR, t1, t2, NULL, NULL);
1298 gsi_insert_after (&gsi, cond_stmt, GSI_CONTINUE_LINKING);
1299
1300 emitf (entry_block, code_bb);
1301
1302 make_edge (cond_bb, code_bb, EDGE_TRUE_VALUE);
1303 make_edge (cond_bb, *end_bb, EDGE_FALSE_VALUE);
1304 make_edge (code_bb, *end_bb, EDGE_FALLTHRU);
1305
1306 return cond_bb;
1307 }
1308 \f
1309 static tree lower_sequence_tm (gimple_stmt_iterator *, bool *,
1310 struct walk_stmt_info *);
1311 static tree lower_sequence_no_tm (gimple_stmt_iterator *, bool *,
1312 struct walk_stmt_info *);
1313
1314 /* Evaluate an address X being dereferenced and determine if it
1315 originally points to a non aliased new chunk of memory (malloc,
1316 alloca, etc).
1317
1318 Return MEM_THREAD_LOCAL if it points to a thread-local address.
1319 Return MEM_TRANSACTION_LOCAL if it points to a transaction-local address.
1320 Return MEM_NON_LOCAL otherwise.
1321
1322 ENTRY_BLOCK is the entry block to the transaction containing the
1323 dereference of X. */
1324 static enum thread_memory_type
1325 thread_private_new_memory (basic_block entry_block, tree x)
1326 {
1327 gimple stmt = NULL;
1328 enum tree_code code;
1329 void **slot;
1330 tm_new_mem_map_t elt, *elt_p;
1331 tree val = x;
1332 enum thread_memory_type retval = mem_transaction_local;
1333
1334 if (!entry_block
1335 || TREE_CODE (x) != SSA_NAME
1336 /* Possible uninitialized use, or a function argument. In
1337 either case, we don't care. */
1338 || SSA_NAME_IS_DEFAULT_DEF (x))
1339 return mem_non_local;
1340
1341 /* Look in cache first. */
1342 elt.val = x;
1343 slot = htab_find_slot (tm_new_mem_hash, &elt, INSERT);
1344 elt_p = (tm_new_mem_map_t *) *slot;
1345 if (elt_p)
1346 return elt_p->local_new_memory;
1347
1348 /* Optimistically assume the memory is transaction local during
1349 processing. This catches recursion into this variable. */
1350 *slot = elt_p = XNEW (tm_new_mem_map_t);
1351 elt_p->val = val;
1352 elt_p->local_new_memory = mem_transaction_local;
1353
1354 /* Search DEF chain to find the original definition of this address. */
1355 do
1356 {
1357 if (ptr_deref_may_alias_global_p (x))
1358 {
1359 /* Address escapes. This is not thread-private. */
1360 retval = mem_non_local;
1361 goto new_memory_ret;
1362 }
1363
1364 stmt = SSA_NAME_DEF_STMT (x);
1365
1366 /* If the malloc call is outside the transaction, this is
1367 thread-local. */
1368 if (retval != mem_thread_local
1369 && !dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt), entry_block))
1370 retval = mem_thread_local;
1371
1372 if (is_gimple_assign (stmt))
1373 {
1374 code = gimple_assign_rhs_code (stmt);
1375 /* x = foo ==> foo */
1376 if (code == SSA_NAME)
1377 x = gimple_assign_rhs1 (stmt);
1378 /* x = foo + n ==> foo */
1379 else if (code == POINTER_PLUS_EXPR)
1380 x = gimple_assign_rhs1 (stmt);
1381 /* x = (cast*) foo ==> foo */
1382 else if (code == VIEW_CONVERT_EXPR || code == NOP_EXPR)
1383 x = gimple_assign_rhs1 (stmt);
1384 else
1385 {
1386 retval = mem_non_local;
1387 goto new_memory_ret;
1388 }
1389 }
1390 else
1391 {
1392 if (gimple_code (stmt) == GIMPLE_PHI)
1393 {
1394 unsigned int i;
1395 enum thread_memory_type mem;
1396 tree phi_result = gimple_phi_result (stmt);
1397
1398 /* If any of the ancestors are non-local, we are sure to
1399 be non-local. Otherwise we can avoid doing anything
1400 and inherit what has already been generated. */
1401 retval = mem_max;
1402 for (i = 0; i < gimple_phi_num_args (stmt); ++i)
1403 {
1404 tree op = PHI_ARG_DEF (stmt, i);
1405
1406 /* Exclude self-assignment. */
1407 if (phi_result == op)
1408 continue;
1409
1410 mem = thread_private_new_memory (entry_block, op);
1411 if (mem == mem_non_local)
1412 {
1413 retval = mem;
1414 goto new_memory_ret;
1415 }
1416 retval = MIN (retval, mem);
1417 }
1418 goto new_memory_ret;
1419 }
1420 break;
1421 }
1422 }
1423 while (TREE_CODE (x) == SSA_NAME);
1424
1425 if (stmt && is_gimple_call (stmt) && gimple_call_flags (stmt) & ECF_MALLOC)
1426 /* Thread-local or transaction-local. */
1427 ;
1428 else
1429 retval = mem_non_local;
1430
1431 new_memory_ret:
1432 elt_p->local_new_memory = retval;
1433 return retval;
1434 }
1435
1436 /* Determine whether X has to be instrumented using a read
1437 or write barrier.
1438
1439 ENTRY_BLOCK is the entry block for the region where stmt resides
1440 in. NULL if unknown.
1441
1442 STMT is the statement in which X occurs in. It is used for thread
1443 private memory instrumentation. If no TPM instrumentation is
1444 desired, STMT should be null. */
1445 static bool
1446 requires_barrier (basic_block entry_block, tree x, gimple stmt)
1447 {
1448 tree orig = x;
1449 while (handled_component_p (x))
1450 x = TREE_OPERAND (x, 0);
1451
1452 switch (TREE_CODE (x))
1453 {
1454 case INDIRECT_REF:
1455 case MEM_REF:
1456 {
1457 enum thread_memory_type ret;
1458
1459 ret = thread_private_new_memory (entry_block, TREE_OPERAND (x, 0));
1460 if (ret == mem_non_local)
1461 return true;
1462 if (stmt && ret == mem_thread_local)
1463 /* ?? Should we pass `orig', or the INDIRECT_REF X. ?? */
1464 tm_log_add (entry_block, orig, stmt);
1465
1466 /* Transaction-locals require nothing at all. For malloc, a
1467 transaction restart frees the memory and we reallocate.
1468 For alloca, the stack pointer gets reset by the retry and
1469 we reallocate. */
1470 return false;
1471 }
1472
1473 case TARGET_MEM_REF:
1474 if (TREE_CODE (TMR_BASE (x)) != ADDR_EXPR)
1475 return true;
1476 x = TREE_OPERAND (TMR_BASE (x), 0);
1477 if (TREE_CODE (x) == PARM_DECL)
1478 return false;
1479 gcc_assert (TREE_CODE (x) == VAR_DECL);
1480 /* FALLTHRU */
1481
1482 case PARM_DECL:
1483 case RESULT_DECL:
1484 case VAR_DECL:
1485 if (DECL_BY_REFERENCE (x))
1486 {
1487 /* ??? This value is a pointer, but aggregate_value_p has been
1488 jigged to return true which confuses needs_to_live_in_memory.
1489 This ought to be cleaned up generically.
1490
1491 FIXME: Verify this still happens after the next mainline
1492 merge. Testcase ie g++.dg/tm/pr47554.C.
1493 */
1494 return false;
1495 }
1496
1497 if (is_global_var (x))
1498 return !TREE_READONLY (x);
1499 if (/* FIXME: This condition should actually go below in the
1500 tm_log_add() call, however is_call_clobbered() depends on
1501 aliasing info which is not available during
1502 gimplification. Since requires_barrier() gets called
1503 during lower_sequence_tm/gimplification, leave the call
1504 to needs_to_live_in_memory until we eliminate
1505 lower_sequence_tm altogether. */
1506 needs_to_live_in_memory (x))
1507 return true;
1508 else
1509 {
1510 /* For local memory that doesn't escape (aka thread private
1511 memory), we can either save the value at the beginning of
1512 the transaction and restore on restart, or call a tm
1513 function to dynamically save and restore on restart
1514 (ITM_L*). */
1515 if (stmt)
1516 tm_log_add (entry_block, orig, stmt);
1517 return false;
1518 }
1519
1520 default:
1521 return false;
1522 }
1523 }
1524
1525 /* Mark the GIMPLE_ASSIGN statement as appropriate for being inside
1526 a transaction region. */
1527
1528 static void
1529 examine_assign_tm (unsigned *state, gimple_stmt_iterator *gsi)
1530 {
1531 gimple stmt = gsi_stmt (*gsi);
1532
1533 if (requires_barrier (/*entry_block=*/NULL, gimple_assign_rhs1 (stmt), NULL))
1534 *state |= GTMA_HAVE_LOAD;
1535 if (requires_barrier (/*entry_block=*/NULL, gimple_assign_lhs (stmt), NULL))
1536 *state |= GTMA_HAVE_STORE;
1537 }
1538
1539 /* Mark a GIMPLE_CALL as appropriate for being inside a transaction. */
1540
1541 static void
1542 examine_call_tm (unsigned *state, gimple_stmt_iterator *gsi)
1543 {
1544 gimple stmt = gsi_stmt (*gsi);
1545 tree fn;
1546
1547 if (is_tm_pure_call (stmt))
1548 return;
1549
1550 /* Check if this call is a transaction abort. */
1551 fn = gimple_call_fndecl (stmt);
1552 if (is_tm_abort (fn))
1553 *state |= GTMA_HAVE_ABORT;
1554
1555 /* Note that something may happen. */
1556 *state |= GTMA_HAVE_LOAD | GTMA_HAVE_STORE;
1557 }
1558
1559 /* Lower a GIMPLE_TRANSACTION statement. */
1560
1561 static void
1562 lower_transaction (gimple_stmt_iterator *gsi, struct walk_stmt_info *wi)
1563 {
1564 gimple g, stmt = gsi_stmt (*gsi);
1565 unsigned int *outer_state = (unsigned int *) wi->info;
1566 unsigned int this_state = 0;
1567 struct walk_stmt_info this_wi;
1568
1569 /* First, lower the body. The scanning that we do inside gives
1570 us some idea of what we're dealing with. */
1571 memset (&this_wi, 0, sizeof (this_wi));
1572 this_wi.info = (void *) &this_state;
1573 walk_gimple_seq (gimple_transaction_body (stmt),
1574 lower_sequence_tm, NULL, &this_wi);
1575
1576 /* If there was absolutely nothing transaction related inside the
1577 transaction, we may elide it. Likewise if this is a nested
1578 transaction and does not contain an abort. */
1579 if (this_state == 0
1580 || (!(this_state & GTMA_HAVE_ABORT) && outer_state != NULL))
1581 {
1582 if (outer_state)
1583 *outer_state |= this_state;
1584
1585 gsi_insert_seq_before (gsi, gimple_transaction_body (stmt),
1586 GSI_SAME_STMT);
1587 gimple_transaction_set_body (stmt, NULL);
1588
1589 gsi_remove (gsi, true);
1590 wi->removed_stmt = true;
1591 return;
1592 }
1593
1594 /* Wrap the body of the transaction in a try-finally node so that
1595 the commit call is always properly called. */
1596 g = gimple_build_call (builtin_decl_explicit (BUILT_IN_TM_COMMIT), 0);
1597 if (flag_exceptions)
1598 {
1599 tree ptr;
1600 gimple_seq n_seq, e_seq;
1601
1602 n_seq = gimple_seq_alloc_with_stmt (g);
1603 e_seq = gimple_seq_alloc ();
1604
1605 g = gimple_build_call (builtin_decl_explicit (BUILT_IN_EH_POINTER),
1606 1, integer_zero_node);
1607 ptr = create_tmp_var (ptr_type_node, NULL);
1608 gimple_call_set_lhs (g, ptr);
1609 gimple_seq_add_stmt (&e_seq, g);
1610
1611 g = gimple_build_call (builtin_decl_explicit (BUILT_IN_TM_COMMIT_EH),
1612 1, ptr);
1613 gimple_seq_add_stmt (&e_seq, g);
1614
1615 g = gimple_build_eh_else (n_seq, e_seq);
1616 }
1617
1618 g = gimple_build_try (gimple_transaction_body (stmt),
1619 gimple_seq_alloc_with_stmt (g), GIMPLE_TRY_FINALLY);
1620 gsi_insert_after (gsi, g, GSI_CONTINUE_LINKING);
1621
1622 gimple_transaction_set_body (stmt, NULL);
1623
1624 /* If the transaction calls abort or if this is an outer transaction,
1625 add an "over" label afterwards. */
1626 if ((this_state & (GTMA_HAVE_ABORT))
1627 || (gimple_transaction_subcode(stmt) & GTMA_IS_OUTER))
1628 {
1629 tree label = create_artificial_label (UNKNOWN_LOCATION);
1630 gimple_transaction_set_label (stmt, label);
1631 gsi_insert_after (gsi, gimple_build_label (label), GSI_CONTINUE_LINKING);
1632 }
1633
1634 /* Record the set of operations found for use later. */
1635 this_state |= gimple_transaction_subcode (stmt) & GTMA_DECLARATION_MASK;
1636 gimple_transaction_set_subcode (stmt, this_state);
1637 }
1638
1639 /* Iterate through the statements in the sequence, lowering them all
1640 as appropriate for being in a transaction. */
1641
1642 static tree
1643 lower_sequence_tm (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1644 struct walk_stmt_info *wi)
1645 {
1646 unsigned int *state = (unsigned int *) wi->info;
1647 gimple stmt = gsi_stmt (*gsi);
1648
1649 *handled_ops_p = true;
1650 switch (gimple_code (stmt))
1651 {
1652 case GIMPLE_ASSIGN:
1653 /* Only memory reads/writes need to be instrumented. */
1654 if (gimple_assign_single_p (stmt))
1655 examine_assign_tm (state, gsi);
1656 break;
1657
1658 case GIMPLE_CALL:
1659 examine_call_tm (state, gsi);
1660 break;
1661
1662 case GIMPLE_ASM:
1663 *state |= GTMA_MAY_ENTER_IRREVOCABLE;
1664 break;
1665
1666 case GIMPLE_TRANSACTION:
1667 lower_transaction (gsi, wi);
1668 break;
1669
1670 default:
1671 *handled_ops_p = !gimple_has_substatements (stmt);
1672 break;
1673 }
1674
1675 return NULL_TREE;
1676 }
1677
1678 /* Iterate through the statements in the sequence, lowering them all
1679 as appropriate for being outside of a transaction. */
1680
1681 static tree
1682 lower_sequence_no_tm (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1683 struct walk_stmt_info * wi)
1684 {
1685 gimple stmt = gsi_stmt (*gsi);
1686
1687 if (gimple_code (stmt) == GIMPLE_TRANSACTION)
1688 {
1689 *handled_ops_p = true;
1690 lower_transaction (gsi, wi);
1691 }
1692 else
1693 *handled_ops_p = !gimple_has_substatements (stmt);
1694
1695 return NULL_TREE;
1696 }
1697
1698 /* Main entry point for flattening GIMPLE_TRANSACTION constructs. After
1699 this, GIMPLE_TRANSACTION nodes still exist, but the nested body has
1700 been moved out, and all the data required for constructing a proper
1701 CFG has been recorded. */
1702
1703 static unsigned int
1704 execute_lower_tm (void)
1705 {
1706 struct walk_stmt_info wi;
1707
1708 /* Transactional clones aren't created until a later pass. */
1709 gcc_assert (!decl_is_tm_clone (current_function_decl));
1710
1711 memset (&wi, 0, sizeof (wi));
1712 walk_gimple_seq (gimple_body (current_function_decl),
1713 lower_sequence_no_tm, NULL, &wi);
1714
1715 return 0;
1716 }
1717
1718 struct gimple_opt_pass pass_lower_tm =
1719 {
1720 {
1721 GIMPLE_PASS,
1722 "tmlower", /* name */
1723 gate_tm, /* gate */
1724 execute_lower_tm, /* execute */
1725 NULL, /* sub */
1726 NULL, /* next */
1727 0, /* static_pass_number */
1728 TV_TRANS_MEM, /* tv_id */
1729 PROP_gimple_lcf, /* properties_required */
1730 0, /* properties_provided */
1731 0, /* properties_destroyed */
1732 0, /* todo_flags_start */
1733 TODO_dump_func /* todo_flags_finish */
1734 }
1735 };
1736 \f
1737 /* Collect region information for each transaction. */
1738
1739 struct tm_region
1740 {
1741 /* Link to the next unnested transaction. */
1742 struct tm_region *next;
1743
1744 /* Link to the next inner transaction. */
1745 struct tm_region *inner;
1746
1747 /* Link to the next outer transaction. */
1748 struct tm_region *outer;
1749
1750 /* The GIMPLE_TRANSACTION statement beginning this transaction. */
1751 gimple transaction_stmt;
1752
1753 /* The entry block to this region. */
1754 basic_block entry_block;
1755
1756 /* The set of all blocks that end the region; NULL if only EXIT_BLOCK.
1757 These blocks are still a part of the region (i.e., the border is
1758 inclusive). Note that this set is only complete for paths in the CFG
1759 starting at ENTRY_BLOCK, and that there is no exit block recorded for
1760 the edge to the "over" label. */
1761 bitmap exit_blocks;
1762
1763 /* The set of all blocks that have an TM_IRREVOCABLE call. */
1764 bitmap irr_blocks;
1765 };
1766
1767 typedef struct tm_region *tm_region_p;
1768 DEF_VEC_P (tm_region_p);
1769 DEF_VEC_ALLOC_P (tm_region_p, heap);
1770
1771 /* True if there are pending edge statements to be committed for the
1772 current function being scanned in the tmmark pass. */
1773 bool pending_edge_inserts_p;
1774
1775 static struct tm_region *all_tm_regions;
1776 static bitmap_obstack tm_obstack;
1777
1778
1779 /* A subroutine of tm_region_init. Record the existance of the
1780 GIMPLE_TRANSACTION statement in a tree of tm_region elements. */
1781
1782 static struct tm_region *
1783 tm_region_init_0 (struct tm_region *outer, basic_block bb, gimple stmt)
1784 {
1785 struct tm_region *region;
1786
1787 region = (struct tm_region *)
1788 obstack_alloc (&tm_obstack.obstack, sizeof (struct tm_region));
1789
1790 if (outer)
1791 {
1792 region->next = outer->inner;
1793 outer->inner = region;
1794 }
1795 else
1796 {
1797 region->next = all_tm_regions;
1798 all_tm_regions = region;
1799 }
1800 region->inner = NULL;
1801 region->outer = outer;
1802
1803 region->transaction_stmt = stmt;
1804
1805 /* There are either one or two edges out of the block containing
1806 the GIMPLE_TRANSACTION, one to the actual region and one to the
1807 "over" label if the region contains an abort. The former will
1808 always be the one marked FALLTHRU. */
1809 region->entry_block = FALLTHRU_EDGE (bb)->dest;
1810
1811 region->exit_blocks = BITMAP_ALLOC (&tm_obstack);
1812 region->irr_blocks = BITMAP_ALLOC (&tm_obstack);
1813
1814 return region;
1815 }
1816
1817 /* A subroutine of tm_region_init. Record all the exit and
1818 irrevocable blocks in BB into the region's exit_blocks and
1819 irr_blocks bitmaps. Returns the new region being scanned. */
1820
1821 static struct tm_region *
1822 tm_region_init_1 (struct tm_region *region, basic_block bb)
1823 {
1824 gimple_stmt_iterator gsi;
1825 gimple g;
1826
1827 if (!region
1828 || (!region->irr_blocks && !region->exit_blocks))
1829 return region;
1830
1831 /* Check to see if this is the end of a region by seeing if it
1832 contains a call to __builtin_tm_commit{,_eh}. Note that the
1833 outermost region for DECL_IS_TM_CLONE need not collect this. */
1834 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
1835 {
1836 g = gsi_stmt (gsi);
1837 if (gimple_code (g) == GIMPLE_CALL)
1838 {
1839 tree fn = gimple_call_fndecl (g);
1840 if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
1841 {
1842 if ((DECL_FUNCTION_CODE (fn) == BUILT_IN_TM_COMMIT
1843 || DECL_FUNCTION_CODE (fn) == BUILT_IN_TM_COMMIT_EH)
1844 && region->exit_blocks)
1845 {
1846 bitmap_set_bit (region->exit_blocks, bb->index);
1847 region = region->outer;
1848 break;
1849 }
1850 if (DECL_FUNCTION_CODE (fn) == BUILT_IN_TM_IRREVOCABLE)
1851 bitmap_set_bit (region->irr_blocks, bb->index);
1852 }
1853 }
1854 }
1855 return region;
1856 }
1857
1858 /* Collect all of the transaction regions within the current function
1859 and record them in ALL_TM_REGIONS. The REGION parameter may specify
1860 an "outermost" region for use by tm clones. */
1861
1862 static void
1863 tm_region_init (struct tm_region *region)
1864 {
1865 gimple g;
1866 edge_iterator ei;
1867 edge e;
1868 basic_block bb;
1869 VEC(basic_block, heap) *queue = NULL;
1870 bitmap visited_blocks = BITMAP_ALLOC (NULL);
1871 struct tm_region *old_region;
1872 VEC(tm_region_p, heap) *bb_regions = NULL;
1873
1874 all_tm_regions = region;
1875 bb = single_succ (ENTRY_BLOCK_PTR);
1876
1877 /* We could store this information in bb->aux, but we may get called
1878 through get_all_tm_blocks() from another pass that may be already
1879 using bb->aux. */
1880 VEC_safe_grow_cleared (tm_region_p, heap, bb_regions, last_basic_block);
1881
1882 VEC_safe_push (basic_block, heap, queue, bb);
1883 VEC_replace (tm_region_p, bb_regions, bb->index, region);
1884 do
1885 {
1886 bb = VEC_pop (basic_block, queue);
1887 region = VEC_index (tm_region_p, bb_regions, bb->index);
1888 VEC_replace (tm_region_p, bb_regions, bb->index, NULL);
1889
1890 /* Record exit and irrevocable blocks. */
1891 region = tm_region_init_1 (region, bb);
1892
1893 /* Check for the last statement in the block beginning a new region. */
1894 g = last_stmt (bb);
1895 old_region = region;
1896 if (g && gimple_code (g) == GIMPLE_TRANSACTION)
1897 region = tm_region_init_0 (region, bb, g);
1898
1899 /* Process subsequent blocks. */
1900 FOR_EACH_EDGE (e, ei, bb->succs)
1901 if (!bitmap_bit_p (visited_blocks, e->dest->index))
1902 {
1903 bitmap_set_bit (visited_blocks, e->dest->index);
1904 VEC_safe_push (basic_block, heap, queue, e->dest);
1905
1906 /* If the current block started a new region, make sure that only
1907 the entry block of the new region is associated with this region.
1908 Other successors are still part of the old region. */
1909 if (old_region != region && e->dest != region->entry_block)
1910 VEC_replace (tm_region_p, bb_regions, e->dest->index, old_region);
1911 else
1912 VEC_replace (tm_region_p, bb_regions, e->dest->index, region);
1913 }
1914 }
1915 while (!VEC_empty (basic_block, queue));
1916 VEC_free (basic_block, heap, queue);
1917 BITMAP_FREE (visited_blocks);
1918 VEC_free (tm_region_p, heap, bb_regions);
1919 }
1920
1921 /* The "gate" function for all transactional memory expansion and optimization
1922 passes. We collect region information for each top-level transaction, and
1923 if we don't find any, we skip all of the TM passes. Each region will have
1924 all of the exit blocks recorded, and the originating statement. */
1925
1926 static bool
1927 gate_tm_init (void)
1928 {
1929 if (!flag_tm)
1930 return false;
1931
1932 calculate_dominance_info (CDI_DOMINATORS);
1933 bitmap_obstack_initialize (&tm_obstack);
1934
1935 /* If the function is a TM_CLONE, then the entire function is the region. */
1936 if (decl_is_tm_clone (current_function_decl))
1937 {
1938 struct tm_region *region = (struct tm_region *)
1939 obstack_alloc (&tm_obstack.obstack, sizeof (struct tm_region));
1940 memset (region, 0, sizeof (*region));
1941 region->entry_block = single_succ (ENTRY_BLOCK_PTR);
1942 /* For a clone, the entire function is the region. But even if
1943 we don't need to record any exit blocks, we may need to
1944 record irrevocable blocks. */
1945 region->irr_blocks = BITMAP_ALLOC (&tm_obstack);
1946
1947 tm_region_init (region);
1948 }
1949 else
1950 {
1951 tm_region_init (NULL);
1952
1953 /* If we didn't find any regions, cleanup and skip the whole tree
1954 of tm-related optimizations. */
1955 if (all_tm_regions == NULL)
1956 {
1957 bitmap_obstack_release (&tm_obstack);
1958 return false;
1959 }
1960 }
1961
1962 return true;
1963 }
1964
1965 struct gimple_opt_pass pass_tm_init =
1966 {
1967 {
1968 GIMPLE_PASS,
1969 "*tminit", /* name */
1970 gate_tm_init, /* gate */
1971 NULL, /* execute */
1972 NULL, /* sub */
1973 NULL, /* next */
1974 0, /* static_pass_number */
1975 TV_TRANS_MEM, /* tv_id */
1976 PROP_ssa | PROP_cfg, /* properties_required */
1977 0, /* properties_provided */
1978 0, /* properties_destroyed */
1979 0, /* todo_flags_start */
1980 0, /* todo_flags_finish */
1981 }
1982 };
1983 \f
1984 /* Add FLAGS to the GIMPLE_TRANSACTION subcode for the transaction region
1985 represented by STATE. */
1986
1987 static inline void
1988 transaction_subcode_ior (struct tm_region *region, unsigned flags)
1989 {
1990 if (region && region->transaction_stmt)
1991 {
1992 flags |= gimple_transaction_subcode (region->transaction_stmt);
1993 gimple_transaction_set_subcode (region->transaction_stmt, flags);
1994 }
1995 }
1996
1997 /* Construct a memory load in a transactional context. Return the
1998 gimple statement performing the load, or NULL if there is no
1999 TM_LOAD builtin of the appropriate size to do the load.
2000
2001 LOC is the location to use for the new statement(s). */
2002
2003 static gimple
2004 build_tm_load (location_t loc, tree lhs, tree rhs, gimple_stmt_iterator *gsi)
2005 {
2006 enum built_in_function code = END_BUILTINS;
2007 tree t, type = TREE_TYPE (rhs), decl;
2008 gimple gcall;
2009
2010 if (type == float_type_node)
2011 code = BUILT_IN_TM_LOAD_FLOAT;
2012 else if (type == double_type_node)
2013 code = BUILT_IN_TM_LOAD_DOUBLE;
2014 else if (type == long_double_type_node)
2015 code = BUILT_IN_TM_LOAD_LDOUBLE;
2016 else if (TYPE_SIZE_UNIT (type) != NULL
2017 && host_integerp (TYPE_SIZE_UNIT (type), 1))
2018 {
2019 switch (tree_low_cst (TYPE_SIZE_UNIT (type), 1))
2020 {
2021 case 1:
2022 code = BUILT_IN_TM_LOAD_1;
2023 break;
2024 case 2:
2025 code = BUILT_IN_TM_LOAD_2;
2026 break;
2027 case 4:
2028 code = BUILT_IN_TM_LOAD_4;
2029 break;
2030 case 8:
2031 code = BUILT_IN_TM_LOAD_8;
2032 break;
2033 }
2034 }
2035
2036 if (code == END_BUILTINS)
2037 {
2038 decl = targetm.vectorize.builtin_tm_load (type);
2039 if (!decl)
2040 return NULL;
2041 }
2042 else
2043 decl = builtin_decl_explicit (code);
2044
2045 t = gimplify_addr (gsi, rhs);
2046 gcall = gimple_build_call (decl, 1, t);
2047 gimple_set_location (gcall, loc);
2048
2049 t = TREE_TYPE (TREE_TYPE (decl));
2050 if (useless_type_conversion_p (type, t))
2051 {
2052 gimple_call_set_lhs (gcall, lhs);
2053 gsi_insert_before (gsi, gcall, GSI_SAME_STMT);
2054 }
2055 else
2056 {
2057 gimple g;
2058 tree temp;
2059
2060 temp = make_rename_temp (t, NULL);
2061 gimple_call_set_lhs (gcall, temp);
2062 gsi_insert_before (gsi, gcall, GSI_SAME_STMT);
2063
2064 t = fold_build1 (VIEW_CONVERT_EXPR, type, temp);
2065 g = gimple_build_assign (lhs, t);
2066 gsi_insert_before (gsi, g, GSI_SAME_STMT);
2067 }
2068
2069 return gcall;
2070 }
2071
2072
2073 /* Similarly for storing TYPE in a transactional context. */
2074
2075 static gimple
2076 build_tm_store (location_t loc, tree lhs, tree rhs, gimple_stmt_iterator *gsi)
2077 {
2078 enum built_in_function code = END_BUILTINS;
2079 tree t, fn, type = TREE_TYPE (rhs), simple_type;
2080 gimple gcall;
2081
2082 if (type == float_type_node)
2083 code = BUILT_IN_TM_STORE_FLOAT;
2084 else if (type == double_type_node)
2085 code = BUILT_IN_TM_STORE_DOUBLE;
2086 else if (type == long_double_type_node)
2087 code = BUILT_IN_TM_STORE_LDOUBLE;
2088 else if (TYPE_SIZE_UNIT (type) != NULL
2089 && host_integerp (TYPE_SIZE_UNIT (type), 1))
2090 {
2091 switch (tree_low_cst (TYPE_SIZE_UNIT (type), 1))
2092 {
2093 case 1:
2094 code = BUILT_IN_TM_STORE_1;
2095 break;
2096 case 2:
2097 code = BUILT_IN_TM_STORE_2;
2098 break;
2099 case 4:
2100 code = BUILT_IN_TM_STORE_4;
2101 break;
2102 case 8:
2103 code = BUILT_IN_TM_STORE_8;
2104 break;
2105 }
2106 }
2107
2108 if (code == END_BUILTINS)
2109 {
2110 fn = targetm.vectorize.builtin_tm_store (type);
2111 if (!fn)
2112 return NULL;
2113 }
2114 else
2115 fn = builtin_decl_explicit (code);
2116
2117 simple_type = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn))));
2118
2119 if (TREE_CODE (rhs) == CONSTRUCTOR)
2120 {
2121 /* Handle the easy initialization to zero. */
2122 if (CONSTRUCTOR_ELTS (rhs) == 0)
2123 rhs = build_int_cst (simple_type, 0);
2124 else
2125 {
2126 /* ...otherwise punt to the caller and probably use
2127 BUILT_IN_TM_MEMMOVE, because we can't wrap a
2128 VIEW_CONVERT_EXPR around a CONSTRUCTOR (below) and produce
2129 valid gimple. */
2130 return NULL;
2131 }
2132 }
2133 else if (!useless_type_conversion_p (simple_type, type))
2134 {
2135 gimple g;
2136 tree temp;
2137
2138 temp = make_rename_temp (simple_type, NULL);
2139 t = fold_build1 (VIEW_CONVERT_EXPR, simple_type, rhs);
2140 g = gimple_build_assign (temp, t);
2141 gimple_set_location (g, loc);
2142 gsi_insert_before (gsi, g, GSI_SAME_STMT);
2143
2144 rhs = temp;
2145 }
2146
2147 t = gimplify_addr (gsi, lhs);
2148 gcall = gimple_build_call (fn, 2, t, rhs);
2149 gimple_set_location (gcall, loc);
2150 gsi_insert_before (gsi, gcall, GSI_SAME_STMT);
2151
2152 return gcall;
2153 }
2154
2155
2156 /* Expand an assignment statement into transactional builtins. */
2157
2158 static void
2159 expand_assign_tm (struct tm_region *region, gimple_stmt_iterator *gsi)
2160 {
2161 gimple stmt = gsi_stmt (*gsi);
2162 location_t loc = gimple_location (stmt);
2163 tree lhs = gimple_assign_lhs (stmt);
2164 tree rhs = gimple_assign_rhs1 (stmt);
2165 bool store_p = requires_barrier (region->entry_block, lhs, NULL);
2166 bool load_p = requires_barrier (region->entry_block, rhs, NULL);
2167 gimple gcall = NULL;
2168
2169 if (!load_p && !store_p)
2170 {
2171 /* Add thread private addresses to log if applicable. */
2172 requires_barrier (region->entry_block, lhs, stmt);
2173 gsi_next (gsi);
2174 return;
2175 }
2176
2177 gsi_remove (gsi, true);
2178
2179 if (load_p && !store_p)
2180 {
2181 transaction_subcode_ior (region, GTMA_HAVE_LOAD);
2182 gcall = build_tm_load (loc, lhs, rhs, gsi);
2183 }
2184 else if (store_p && !load_p)
2185 {
2186 transaction_subcode_ior (region, GTMA_HAVE_STORE);
2187 gcall = build_tm_store (loc, lhs, rhs, gsi);
2188 }
2189 if (!gcall)
2190 {
2191 tree lhs_addr, rhs_addr, tmp;
2192
2193 if (load_p)
2194 transaction_subcode_ior (region, GTMA_HAVE_LOAD);
2195 if (store_p)
2196 transaction_subcode_ior (region, GTMA_HAVE_STORE);
2197
2198 /* ??? Figure out if there's any possible overlap between the LHS
2199 and the RHS and if not, use MEMCPY. */
2200
2201 if (load_p && is_gimple_reg (lhs))
2202 {
2203 tmp = create_tmp_var (TREE_TYPE (lhs), NULL);
2204 lhs_addr = build_fold_addr_expr (tmp);
2205 }
2206 else
2207 {
2208 tmp = NULL_TREE;
2209 lhs_addr = gimplify_addr (gsi, lhs);
2210 }
2211 rhs_addr = gimplify_addr (gsi, rhs);
2212 gcall = gimple_build_call (builtin_decl_explicit (BUILT_IN_TM_MEMMOVE),
2213 3, lhs_addr, rhs_addr,
2214 TYPE_SIZE_UNIT (TREE_TYPE (lhs)));
2215 gimple_set_location (gcall, loc);
2216 gsi_insert_before (gsi, gcall, GSI_SAME_STMT);
2217
2218 if (tmp)
2219 {
2220 gcall = gimple_build_assign (lhs, tmp);
2221 gsi_insert_before (gsi, gcall, GSI_SAME_STMT);
2222 }
2223 }
2224
2225 /* Now that we have the load/store in its instrumented form, add
2226 thread private addresses to the log if applicable. */
2227 if (!store_p)
2228 requires_barrier (region->entry_block, lhs, gcall);
2229
2230 /* add_stmt_to_tm_region (region, gcall); */
2231 }
2232
2233
2234 /* Expand a call statement as appropriate for a transaction. That is,
2235 either verify that the call does not affect the transaction, or
2236 redirect the call to a clone that handles transactions, or change
2237 the transaction state to IRREVOCABLE. Return true if the call is
2238 one of the builtins that end a transaction. */
2239
2240 static bool
2241 expand_call_tm (struct tm_region *region,
2242 gimple_stmt_iterator *gsi)
2243 {
2244 gimple stmt = gsi_stmt (*gsi);
2245 tree lhs = gimple_call_lhs (stmt);
2246 tree fn_decl;
2247 struct cgraph_node *node;
2248 bool retval = false;
2249
2250 fn_decl = gimple_call_fndecl (stmt);
2251
2252 if (fn_decl == builtin_decl_explicit (BUILT_IN_TM_MEMCPY)
2253 || fn_decl == builtin_decl_explicit (BUILT_IN_TM_MEMMOVE))
2254 transaction_subcode_ior (region, GTMA_HAVE_STORE | GTMA_HAVE_LOAD);
2255 if (fn_decl == builtin_decl_explicit (BUILT_IN_TM_MEMSET))
2256 transaction_subcode_ior (region, GTMA_HAVE_STORE);
2257
2258 if (is_tm_pure_call (stmt))
2259 return false;
2260
2261 if (fn_decl)
2262 retval = is_tm_ending_fndecl (fn_decl);
2263 if (!retval)
2264 {
2265 /* Assume all non-const/pure calls write to memory, except
2266 transaction ending builtins. */
2267 transaction_subcode_ior (region, GTMA_HAVE_STORE);
2268 }
2269
2270 /* For indirect calls, we already generated a call into the runtime. */
2271 if (!fn_decl)
2272 {
2273 tree fn = gimple_call_fn (stmt);
2274
2275 /* We are guaranteed never to go irrevocable on a safe or pure
2276 call, and the pure call was handled above. */
2277 if (is_tm_safe (fn))
2278 return false;
2279 else
2280 transaction_subcode_ior (region, GTMA_MAY_ENTER_IRREVOCABLE);
2281
2282 return false;
2283 }
2284
2285 node = cgraph_get_node (fn_decl);
2286 /* All calls should have cgraph here. */
2287 gcc_assert (node);
2288 if (node->local.tm_may_enter_irr)
2289 transaction_subcode_ior (region, GTMA_MAY_ENTER_IRREVOCABLE);
2290
2291 if (is_tm_abort (fn_decl))
2292 {
2293 transaction_subcode_ior (region, GTMA_HAVE_ABORT);
2294 return true;
2295 }
2296
2297 /* Instrument the store if needed.
2298
2299 If the assignment happens inside the function call (return slot
2300 optimization), there is no instrumentation to be done, since
2301 the callee should have done the right thing. */
2302 if (lhs && requires_barrier (region->entry_block, lhs, stmt)
2303 && !gimple_call_return_slot_opt_p (stmt))
2304 {
2305 tree tmp = make_rename_temp (TREE_TYPE (lhs), NULL);
2306 location_t loc = gimple_location (stmt);
2307 edge fallthru_edge = NULL;
2308
2309 /* Remember if the call was going to throw. */
2310 if (stmt_can_throw_internal (stmt))
2311 {
2312 edge_iterator ei;
2313 edge e;
2314 basic_block bb = gimple_bb (stmt);
2315
2316 FOR_EACH_EDGE (e, ei, bb->succs)
2317 if (e->flags & EDGE_FALLTHRU)
2318 {
2319 fallthru_edge = e;
2320 break;
2321 }
2322 }
2323
2324 gimple_call_set_lhs (stmt, tmp);
2325 update_stmt (stmt);
2326 stmt = gimple_build_assign (lhs, tmp);
2327 gimple_set_location (stmt, loc);
2328
2329 /* We cannot throw in the middle of a BB. If the call was going
2330 to throw, place the instrumentation on the fallthru edge, so
2331 the call remains the last statement in the block. */
2332 if (fallthru_edge)
2333 {
2334 gimple_seq fallthru_seq = gimple_seq_alloc_with_stmt (stmt);
2335 gimple_stmt_iterator fallthru_gsi = gsi_start (fallthru_seq);
2336 expand_assign_tm (region, &fallthru_gsi);
2337 gsi_insert_seq_on_edge (fallthru_edge, fallthru_seq);
2338 pending_edge_inserts_p = true;
2339 }
2340 else
2341 {
2342 gsi_insert_after (gsi, stmt, GSI_CONTINUE_LINKING);
2343 expand_assign_tm (region, gsi);
2344 }
2345
2346 transaction_subcode_ior (region, GTMA_HAVE_STORE);
2347 }
2348
2349 return retval;
2350 }
2351
2352
2353 /* Expand all statements in BB as appropriate for being inside
2354 a transaction. */
2355
2356 static void
2357 expand_block_tm (struct tm_region *region, basic_block bb)
2358 {
2359 gimple_stmt_iterator gsi;
2360
2361 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
2362 {
2363 gimple stmt = gsi_stmt (gsi);
2364 switch (gimple_code (stmt))
2365 {
2366 case GIMPLE_ASSIGN:
2367 /* Only memory reads/writes need to be instrumented. */
2368 if (gimple_assign_single_p (stmt)
2369 && !gimple_clobber_p (stmt))
2370 {
2371 expand_assign_tm (region, &gsi);
2372 continue;
2373 }
2374 break;
2375
2376 case GIMPLE_CALL:
2377 if (expand_call_tm (region, &gsi))
2378 return;
2379 break;
2380
2381 case GIMPLE_ASM:
2382 gcc_unreachable ();
2383
2384 default:
2385 break;
2386 }
2387 if (!gsi_end_p (gsi))
2388 gsi_next (&gsi);
2389 }
2390 }
2391
2392 /* Return the list of basic-blocks in REGION.
2393
2394 STOP_AT_IRREVOCABLE_P is true if caller is uninterested in blocks
2395 following a TM_IRREVOCABLE call. */
2396
2397 static VEC (basic_block, heap) *
2398 get_tm_region_blocks (basic_block entry_block,
2399 bitmap exit_blocks,
2400 bitmap irr_blocks,
2401 bitmap all_region_blocks,
2402 bool stop_at_irrevocable_p)
2403 {
2404 VEC(basic_block, heap) *bbs = NULL;
2405 unsigned i;
2406 edge e;
2407 edge_iterator ei;
2408 bitmap visited_blocks = BITMAP_ALLOC (NULL);
2409
2410 i = 0;
2411 VEC_safe_push (basic_block, heap, bbs, entry_block);
2412 bitmap_set_bit (visited_blocks, entry_block->index);
2413
2414 do
2415 {
2416 basic_block bb = VEC_index (basic_block, bbs, i++);
2417
2418 if (exit_blocks &&
2419 bitmap_bit_p (exit_blocks, bb->index))
2420 continue;
2421
2422 if (stop_at_irrevocable_p
2423 && irr_blocks
2424 && bitmap_bit_p (irr_blocks, bb->index))
2425 continue;
2426
2427 FOR_EACH_EDGE (e, ei, bb->succs)
2428 if (!bitmap_bit_p (visited_blocks, e->dest->index))
2429 {
2430 bitmap_set_bit (visited_blocks, e->dest->index);
2431 VEC_safe_push (basic_block, heap, bbs, e->dest);
2432 }
2433 }
2434 while (i < VEC_length (basic_block, bbs));
2435
2436 if (all_region_blocks)
2437 bitmap_ior_into (all_region_blocks, visited_blocks);
2438
2439 BITMAP_FREE (visited_blocks);
2440 return bbs;
2441 }
2442
2443 /* Set the IN_TRANSACTION for all gimple statements that appear in a
2444 transaction. */
2445
2446 void
2447 compute_transaction_bits (void)
2448 {
2449 struct tm_region *region;
2450 VEC (basic_block, heap) *queue;
2451 unsigned int i;
2452 gimple_stmt_iterator gsi;
2453 basic_block bb;
2454
2455 /* ?? Perhaps we need to abstract gate_tm_init further, because we
2456 certainly don't need it to calculate CDI_DOMINATOR info. */
2457 gate_tm_init ();
2458
2459 for (region = all_tm_regions; region; region = region->next)
2460 {
2461 queue = get_tm_region_blocks (region->entry_block,
2462 region->exit_blocks,
2463 region->irr_blocks,
2464 NULL,
2465 /*stop_at_irr_p=*/true);
2466 for (i = 0; VEC_iterate (basic_block, queue, i, bb); ++i)
2467 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2468 {
2469 gimple stmt = gsi_stmt (gsi);
2470 gimple_set_in_transaction (stmt, true);
2471 }
2472 VEC_free (basic_block, heap, queue);
2473 }
2474
2475 if (all_tm_regions)
2476 bitmap_obstack_release (&tm_obstack);
2477 }
2478
2479 /* Entry point to the MARK phase of TM expansion. Here we replace
2480 transactional memory statements with calls to builtins, and function
2481 calls with their transactional clones (if available). But we don't
2482 yet lower GIMPLE_TRANSACTION or add the transaction restart back-edges. */
2483
2484 static unsigned int
2485 execute_tm_mark (void)
2486 {
2487 struct tm_region *region;
2488 basic_block bb;
2489 VEC (basic_block, heap) *queue;
2490 size_t i;
2491
2492 queue = VEC_alloc (basic_block, heap, 10);
2493 pending_edge_inserts_p = false;
2494
2495 for (region = all_tm_regions; region ; region = region->next)
2496 {
2497 tm_log_init ();
2498 /* If we have a transaction... */
2499 if (region->exit_blocks)
2500 {
2501 unsigned int subcode
2502 = gimple_transaction_subcode (region->transaction_stmt);
2503
2504 /* Collect a new SUBCODE set, now that optimizations are done... */
2505 if (subcode & GTMA_DOES_GO_IRREVOCABLE)
2506 subcode &= (GTMA_DECLARATION_MASK | GTMA_DOES_GO_IRREVOCABLE
2507 | GTMA_MAY_ENTER_IRREVOCABLE);
2508 else
2509 subcode &= GTMA_DECLARATION_MASK;
2510 gimple_transaction_set_subcode (region->transaction_stmt, subcode);
2511 }
2512
2513 queue = get_tm_region_blocks (region->entry_block,
2514 region->exit_blocks,
2515 region->irr_blocks,
2516 NULL,
2517 /*stop_at_irr_p=*/true);
2518 for (i = 0; VEC_iterate (basic_block, queue, i, bb); ++i)
2519 expand_block_tm (region, bb);
2520 VEC_free (basic_block, heap, queue);
2521
2522 tm_log_emit ();
2523 }
2524
2525 if (pending_edge_inserts_p)
2526 gsi_commit_edge_inserts ();
2527 return 0;
2528 }
2529
2530 struct gimple_opt_pass pass_tm_mark =
2531 {
2532 {
2533 GIMPLE_PASS,
2534 "tmmark", /* name */
2535 NULL, /* gate */
2536 execute_tm_mark, /* execute */
2537 NULL, /* sub */
2538 NULL, /* next */
2539 0, /* static_pass_number */
2540 TV_TRANS_MEM, /* tv_id */
2541 PROP_ssa | PROP_cfg, /* properties_required */
2542 0, /* properties_provided */
2543 0, /* properties_destroyed */
2544 0, /* todo_flags_start */
2545 TODO_update_ssa
2546 | TODO_verify_ssa
2547 | TODO_dump_func, /* todo_flags_finish */
2548 }
2549 };
2550 \f
2551 /* Create an abnormal call edge from BB to the first block of the region
2552 represented by STATE. Also record the edge in the TM_RESTART map. */
2553
2554 static inline void
2555 make_tm_edge (gimple stmt, basic_block bb, struct tm_region *region)
2556 {
2557 void **slot;
2558 struct tm_restart_node *n, dummy;
2559
2560 if (cfun->gimple_df->tm_restart == NULL)
2561 cfun->gimple_df->tm_restart = htab_create_ggc (31, struct_ptr_hash,
2562 struct_ptr_eq, ggc_free);
2563
2564 dummy.stmt = stmt;
2565 dummy.label_or_list = gimple_block_label (region->entry_block);
2566 slot = htab_find_slot (cfun->gimple_df->tm_restart, &dummy, INSERT);
2567 n = (struct tm_restart_node *) *slot;
2568 if (n == NULL)
2569 {
2570 n = ggc_alloc_tm_restart_node ();
2571 *n = dummy;
2572 }
2573 else
2574 {
2575 tree old = n->label_or_list;
2576 if (TREE_CODE (old) == LABEL_DECL)
2577 old = tree_cons (NULL, old, NULL);
2578 n->label_or_list = tree_cons (NULL, dummy.label_or_list, old);
2579 }
2580
2581 make_edge (bb, region->entry_block, EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
2582 }
2583
2584
2585 /* Split block BB as necessary for every builtin function we added, and
2586 wire up the abnormal back edges implied by the transaction restart. */
2587
2588 static void
2589 expand_block_edges (struct tm_region *region, basic_block bb)
2590 {
2591 gimple_stmt_iterator gsi;
2592
2593 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
2594 {
2595 gimple stmt = gsi_stmt (gsi);
2596
2597 /* ??? TM_COMMIT (and any other tm builtin function) in a nested
2598 transaction has an abnormal edge back to the outer-most transaction
2599 (there are no nested retries), while a TM_ABORT also has an abnormal
2600 backedge to the inner-most transaction. We haven't actually saved
2601 the inner-most transaction here. We should be able to get to it
2602 via the region_nr saved on STMT, and read the transaction_stmt from
2603 that, and find the first region block from there. */
2604 /* ??? Shouldn't we split for any non-pure, non-irrevocable function? */
2605 if (gimple_code (stmt) == GIMPLE_CALL
2606 && (gimple_call_flags (stmt) & ECF_TM_BUILTIN) != 0)
2607 {
2608 if (gsi_one_before_end_p (gsi))
2609 make_tm_edge (stmt, bb, region);
2610 else
2611 {
2612 edge e = split_block (bb, stmt);
2613 make_tm_edge (stmt, bb, region);
2614 bb = e->dest;
2615 gsi = gsi_start_bb (bb);
2616 }
2617
2618 /* Delete any tail-call annotation that may have been added.
2619 The tail-call pass may have mis-identified the commit as being
2620 a candidate because we had not yet added this restart edge. */
2621 gimple_call_set_tail (stmt, false);
2622 }
2623
2624 gsi_next (&gsi);
2625 }
2626 }
2627
2628 /* Expand the GIMPLE_TRANSACTION statement into the STM library call. */
2629
2630 static void
2631 expand_transaction (struct tm_region *region)
2632 {
2633 tree status, tm_start;
2634 basic_block atomic_bb, slice_bb;
2635 gimple_stmt_iterator gsi;
2636 tree t1, t2;
2637 gimple g;
2638 int flags, subcode;
2639
2640 tm_start = builtin_decl_explicit (BUILT_IN_TM_START);
2641 status = make_rename_temp (TREE_TYPE (TREE_TYPE (tm_start)), "tm_state");
2642
2643 /* ??? There are plenty of bits here we're not computing. */
2644 subcode = gimple_transaction_subcode (region->transaction_stmt);
2645 if (subcode & GTMA_DOES_GO_IRREVOCABLE)
2646 flags = PR_DOESGOIRREVOCABLE | PR_UNINSTRUMENTEDCODE;
2647 else
2648 flags = PR_INSTRUMENTEDCODE;
2649 if ((subcode & GTMA_MAY_ENTER_IRREVOCABLE) == 0)
2650 flags |= PR_HASNOIRREVOCABLE;
2651 /* If the transaction does not have an abort in lexical scope and is not
2652 marked as an outer transaction, then it will never abort. */
2653 if ((subcode & GTMA_HAVE_ABORT) == 0
2654 && (subcode & GTMA_IS_OUTER) == 0)
2655 flags |= PR_HASNOABORT;
2656 if ((subcode & GTMA_HAVE_STORE) == 0)
2657 flags |= PR_READONLY;
2658 t2 = build_int_cst (TREE_TYPE (status), flags);
2659 g = gimple_build_call (tm_start, 1, t2);
2660 gimple_call_set_lhs (g, status);
2661 gimple_set_location (g, gimple_location (region->transaction_stmt));
2662
2663 atomic_bb = gimple_bb (region->transaction_stmt);
2664
2665 if (!VEC_empty (tree, tm_log_save_addresses))
2666 tm_log_emit_saves (region->entry_block, atomic_bb);
2667
2668 gsi = gsi_last_bb (atomic_bb);
2669 gsi_insert_before (&gsi, g, GSI_SAME_STMT);
2670 gsi_remove (&gsi, true);
2671
2672 if (!VEC_empty (tree, tm_log_save_addresses))
2673 region->entry_block =
2674 tm_log_emit_save_or_restores (region->entry_block,
2675 A_RESTORELIVEVARIABLES,
2676 status,
2677 tm_log_emit_restores,
2678 atomic_bb,
2679 FALLTHRU_EDGE (atomic_bb),
2680 &slice_bb);
2681 else
2682 slice_bb = atomic_bb;
2683
2684 /* If we have an ABORT statement, create a test following the start
2685 call to perform the abort. */
2686 if (gimple_transaction_label (region->transaction_stmt))
2687 {
2688 edge e;
2689 basic_block test_bb;
2690
2691 test_bb = create_empty_bb (slice_bb);
2692 if (current_loops && slice_bb->loop_father)
2693 add_bb_to_loop (test_bb, slice_bb->loop_father);
2694 if (VEC_empty (tree, tm_log_save_addresses))
2695 region->entry_block = test_bb;
2696 gsi = gsi_last_bb (test_bb);
2697
2698 t1 = make_rename_temp (TREE_TYPE (status), NULL);
2699 t2 = build_int_cst (TREE_TYPE (status), A_ABORTTRANSACTION);
2700 g = gimple_build_assign_with_ops (BIT_AND_EXPR, t1, status, t2);
2701 gsi_insert_after (&gsi, g, GSI_CONTINUE_LINKING);
2702
2703 t2 = build_int_cst (TREE_TYPE (status), 0);
2704 g = gimple_build_cond (NE_EXPR, t1, t2, NULL, NULL);
2705 gsi_insert_after (&gsi, g, GSI_CONTINUE_LINKING);
2706
2707 e = FALLTHRU_EDGE (slice_bb);
2708 redirect_edge_pred (e, test_bb);
2709 e->flags = EDGE_FALSE_VALUE;
2710 e->probability = PROB_ALWAYS - PROB_VERY_UNLIKELY;
2711
2712 e = BRANCH_EDGE (atomic_bb);
2713 redirect_edge_pred (e, test_bb);
2714 e->flags = EDGE_TRUE_VALUE;
2715 e->probability = PROB_VERY_UNLIKELY;
2716
2717 e = make_edge (slice_bb, test_bb, EDGE_FALLTHRU);
2718 }
2719
2720 /* If we've no abort, but we do have PHIs at the beginning of the atomic
2721 region, that means we've a loop at the beginning of the atomic region
2722 that shares the first block. This can cause problems with the abnormal
2723 edges we're about to add for the transaction restart. Solve this by
2724 adding a new empty block to receive the abnormal edges. */
2725 else if (phi_nodes (region->entry_block))
2726 {
2727 edge e;
2728 basic_block empty_bb;
2729
2730 region->entry_block = empty_bb = create_empty_bb (atomic_bb);
2731 if (current_loops && atomic_bb->loop_father)
2732 add_bb_to_loop (empty_bb, atomic_bb->loop_father);
2733
2734 e = FALLTHRU_EDGE (atomic_bb);
2735 redirect_edge_pred (e, empty_bb);
2736
2737 e = make_edge (atomic_bb, empty_bb, EDGE_FALLTHRU);
2738 }
2739
2740 /* The GIMPLE_TRANSACTION statement no longer exists. */
2741 region->transaction_stmt = NULL;
2742 }
2743
2744 static void expand_regions (struct tm_region *);
2745
2746 /* Helper function for expand_regions. Expand REGION and recurse to
2747 the inner region. */
2748
2749 static void
2750 expand_regions_1 (struct tm_region *region)
2751 {
2752 if (region->exit_blocks)
2753 {
2754 unsigned int i;
2755 basic_block bb;
2756 VEC (basic_block, heap) *queue;
2757
2758 /* Collect the set of blocks in this region. Do this before
2759 splitting edges, so that we don't have to play with the
2760 dominator tree in the middle. */
2761 queue = get_tm_region_blocks (region->entry_block,
2762 region->exit_blocks,
2763 region->irr_blocks,
2764 NULL,
2765 /*stop_at_irr_p=*/false);
2766 expand_transaction (region);
2767 for (i = 0; VEC_iterate (basic_block, queue, i, bb); ++i)
2768 expand_block_edges (region, bb);
2769 VEC_free (basic_block, heap, queue);
2770 }
2771 if (region->inner)
2772 expand_regions (region->inner);
2773 }
2774
2775 /* Expand regions starting at REGION. */
2776
2777 static void
2778 expand_regions (struct tm_region *region)
2779 {
2780 while (region)
2781 {
2782 expand_regions_1 (region);
2783 region = region->next;
2784 }
2785 }
2786
2787 /* Entry point to the final expansion of transactional nodes. */
2788
2789 static unsigned int
2790 execute_tm_edges (void)
2791 {
2792 expand_regions (all_tm_regions);
2793 tm_log_delete ();
2794
2795 /* We've got to release the dominance info now, to indicate that it
2796 must be rebuilt completely. Otherwise we'll crash trying to update
2797 the SSA web in the TODO section following this pass. */
2798 free_dominance_info (CDI_DOMINATORS);
2799 bitmap_obstack_release (&tm_obstack);
2800 all_tm_regions = NULL;
2801
2802 return 0;
2803 }
2804
2805 struct gimple_opt_pass pass_tm_edges =
2806 {
2807 {
2808 GIMPLE_PASS,
2809 "tmedge", /* name */
2810 NULL, /* gate */
2811 execute_tm_edges, /* execute */
2812 NULL, /* sub */
2813 NULL, /* next */
2814 0, /* static_pass_number */
2815 TV_TRANS_MEM, /* tv_id */
2816 PROP_ssa | PROP_cfg, /* properties_required */
2817 0, /* properties_provided */
2818 0, /* properties_destroyed */
2819 0, /* todo_flags_start */
2820 TODO_update_ssa
2821 | TODO_verify_ssa
2822 | TODO_dump_func, /* todo_flags_finish */
2823 }
2824 };
2825 \f
2826 /* A unique TM memory operation. */
2827 typedef struct tm_memop
2828 {
2829 /* Unique ID that all memory operations to the same location have. */
2830 unsigned int value_id;
2831 /* Address of load/store. */
2832 tree addr;
2833 } *tm_memop_t;
2834
2835 /* Sets for solving data flow equations in the memory optimization pass. */
2836 struct tm_memopt_bitmaps
2837 {
2838 /* Stores available to this BB upon entry. Basically, stores that
2839 dominate this BB. */
2840 bitmap store_avail_in;
2841 /* Stores available at the end of this BB. */
2842 bitmap store_avail_out;
2843 bitmap store_antic_in;
2844 bitmap store_antic_out;
2845 /* Reads available to this BB upon entry. Basically, reads that
2846 dominate this BB. */
2847 bitmap read_avail_in;
2848 /* Reads available at the end of this BB. */
2849 bitmap read_avail_out;
2850 /* Reads performed in this BB. */
2851 bitmap read_local;
2852 /* Writes performed in this BB. */
2853 bitmap store_local;
2854
2855 /* Temporary storage for pass. */
2856 /* Is the current BB in the worklist? */
2857 bool avail_in_worklist_p;
2858 /* Have we visited this BB? */
2859 bool visited_p;
2860 };
2861
2862 static bitmap_obstack tm_memopt_obstack;
2863
2864 /* Unique counter for TM loads and stores. Loads and stores of the
2865 same address get the same ID. */
2866 static unsigned int tm_memopt_value_id;
2867 static htab_t tm_memopt_value_numbers;
2868
2869 #define STORE_AVAIL_IN(BB) \
2870 ((struct tm_memopt_bitmaps *) ((BB)->aux))->store_avail_in
2871 #define STORE_AVAIL_OUT(BB) \
2872 ((struct tm_memopt_bitmaps *) ((BB)->aux))->store_avail_out
2873 #define STORE_ANTIC_IN(BB) \
2874 ((struct tm_memopt_bitmaps *) ((BB)->aux))->store_antic_in
2875 #define STORE_ANTIC_OUT(BB) \
2876 ((struct tm_memopt_bitmaps *) ((BB)->aux))->store_antic_out
2877 #define READ_AVAIL_IN(BB) \
2878 ((struct tm_memopt_bitmaps *) ((BB)->aux))->read_avail_in
2879 #define READ_AVAIL_OUT(BB) \
2880 ((struct tm_memopt_bitmaps *) ((BB)->aux))->read_avail_out
2881 #define READ_LOCAL(BB) \
2882 ((struct tm_memopt_bitmaps *) ((BB)->aux))->read_local
2883 #define STORE_LOCAL(BB) \
2884 ((struct tm_memopt_bitmaps *) ((BB)->aux))->store_local
2885 #define AVAIL_IN_WORKLIST_P(BB) \
2886 ((struct tm_memopt_bitmaps *) ((BB)->aux))->avail_in_worklist_p
2887 #define BB_VISITED_P(BB) \
2888 ((struct tm_memopt_bitmaps *) ((BB)->aux))->visited_p
2889
2890 /* Htab support. Return a hash value for a `tm_memop'. */
2891 static hashval_t
2892 tm_memop_hash (const void *p)
2893 {
2894 const struct tm_memop *mem = (const struct tm_memop *) p;
2895 tree addr = mem->addr;
2896 /* We drill down to the SSA_NAME/DECL for the hash, but equality is
2897 actually done with operand_equal_p (see tm_memop_eq). */
2898 if (TREE_CODE (addr) == ADDR_EXPR)
2899 addr = TREE_OPERAND (addr, 0);
2900 return iterative_hash_expr (addr, 0);
2901 }
2902
2903 /* Htab support. Return true if two tm_memop's are the same. */
2904 static int
2905 tm_memop_eq (const void *p1, const void *p2)
2906 {
2907 const struct tm_memop *mem1 = (const struct tm_memop *) p1;
2908 const struct tm_memop *mem2 = (const struct tm_memop *) p2;
2909
2910 return operand_equal_p (mem1->addr, mem2->addr, 0);
2911 }
2912
2913 /* Given a TM load/store in STMT, return the value number for the address
2914 it accesses. */
2915
2916 static unsigned int
2917 tm_memopt_value_number (gimple stmt, enum insert_option op)
2918 {
2919 struct tm_memop tmpmem, *mem;
2920 void **slot;
2921
2922 gcc_assert (is_tm_load (stmt) || is_tm_store (stmt));
2923 tmpmem.addr = gimple_call_arg (stmt, 0);
2924 slot = htab_find_slot (tm_memopt_value_numbers, &tmpmem, op);
2925 if (*slot)
2926 mem = (struct tm_memop *) *slot;
2927 else if (op == INSERT)
2928 {
2929 mem = XNEW (struct tm_memop);
2930 *slot = mem;
2931 mem->value_id = tm_memopt_value_id++;
2932 mem->addr = tmpmem.addr;
2933 }
2934 else
2935 gcc_unreachable ();
2936 return mem->value_id;
2937 }
2938
2939 /* Accumulate TM memory operations in BB into STORE_LOCAL and READ_LOCAL. */
2940
2941 static void
2942 tm_memopt_accumulate_memops (basic_block bb)
2943 {
2944 gimple_stmt_iterator gsi;
2945
2946 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2947 {
2948 gimple stmt = gsi_stmt (gsi);
2949 bitmap bits;
2950 unsigned int loc;
2951
2952 if (is_tm_store (stmt))
2953 bits = STORE_LOCAL (bb);
2954 else if (is_tm_load (stmt))
2955 bits = READ_LOCAL (bb);
2956 else
2957 continue;
2958
2959 loc = tm_memopt_value_number (stmt, INSERT);
2960 bitmap_set_bit (bits, loc);
2961 if (dump_file)
2962 {
2963 fprintf (dump_file, "TM memopt (%s): value num=%d, BB=%d, addr=",
2964 is_tm_load (stmt) ? "LOAD" : "STORE", loc,
2965 gimple_bb (stmt)->index);
2966 print_generic_expr (dump_file, gimple_call_arg (stmt, 0), 0);
2967 fprintf (dump_file, "\n");
2968 }
2969 }
2970 }
2971
2972 /* Prettily dump one of the memopt sets. BITS is the bitmap to dump. */
2973
2974 static void
2975 dump_tm_memopt_set (const char *set_name, bitmap bits)
2976 {
2977 unsigned i;
2978 bitmap_iterator bi;
2979 const char *comma = "";
2980
2981 fprintf (dump_file, "TM memopt: %s: [", set_name);
2982 EXECUTE_IF_SET_IN_BITMAP (bits, 0, i, bi)
2983 {
2984 htab_iterator hi;
2985 struct tm_memop *mem;
2986
2987 /* Yeah, yeah, yeah. Whatever. This is just for debugging. */
2988 FOR_EACH_HTAB_ELEMENT (tm_memopt_value_numbers, mem, tm_memop_t, hi)
2989 if (mem->value_id == i)
2990 break;
2991 gcc_assert (mem->value_id == i);
2992 fprintf (dump_file, "%s", comma);
2993 comma = ", ";
2994 print_generic_expr (dump_file, mem->addr, 0);
2995 }
2996 fprintf (dump_file, "]\n");
2997 }
2998
2999 /* Prettily dump all of the memopt sets in BLOCKS. */
3000
3001 static void
3002 dump_tm_memopt_sets (VEC (basic_block, heap) *blocks)
3003 {
3004 size_t i;
3005 basic_block bb;
3006
3007 for (i = 0; VEC_iterate (basic_block, blocks, i, bb); ++i)
3008 {
3009 fprintf (dump_file, "------------BB %d---------\n", bb->index);
3010 dump_tm_memopt_set ("STORE_LOCAL", STORE_LOCAL (bb));
3011 dump_tm_memopt_set ("READ_LOCAL", READ_LOCAL (bb));
3012 dump_tm_memopt_set ("STORE_AVAIL_IN", STORE_AVAIL_IN (bb));
3013 dump_tm_memopt_set ("STORE_AVAIL_OUT", STORE_AVAIL_OUT (bb));
3014 dump_tm_memopt_set ("READ_AVAIL_IN", READ_AVAIL_IN (bb));
3015 dump_tm_memopt_set ("READ_AVAIL_OUT", READ_AVAIL_OUT (bb));
3016 }
3017 }
3018
3019 /* Compute {STORE,READ}_AVAIL_IN for the basic block BB. */
3020
3021 static void
3022 tm_memopt_compute_avin (basic_block bb)
3023 {
3024 edge e;
3025 unsigned ix;
3026
3027 /* Seed with the AVOUT of any predecessor. */
3028 for (ix = 0; ix < EDGE_COUNT (bb->preds); ix++)
3029 {
3030 e = EDGE_PRED (bb, ix);
3031 /* Make sure we have already visited this BB, and is thus
3032 initialized.
3033
3034 If e->src->aux is NULL, this predecessor is actually on an
3035 enclosing transaction. We only care about the current
3036 transaction, so ignore it. */
3037 if (e->src->aux && BB_VISITED_P (e->src))
3038 {
3039 bitmap_copy (STORE_AVAIL_IN (bb), STORE_AVAIL_OUT (e->src));
3040 bitmap_copy (READ_AVAIL_IN (bb), READ_AVAIL_OUT (e->src));
3041 break;
3042 }
3043 }
3044
3045 for (; ix < EDGE_COUNT (bb->preds); ix++)
3046 {
3047 e = EDGE_PRED (bb, ix);
3048 if (e->src->aux && BB_VISITED_P (e->src))
3049 {
3050 bitmap_and_into (STORE_AVAIL_IN (bb), STORE_AVAIL_OUT (e->src));
3051 bitmap_and_into (READ_AVAIL_IN (bb), READ_AVAIL_OUT (e->src));
3052 }
3053 }
3054
3055 BB_VISITED_P (bb) = true;
3056 }
3057
3058 /* Compute the STORE_ANTIC_IN for the basic block BB. */
3059
3060 static void
3061 tm_memopt_compute_antin (basic_block bb)
3062 {
3063 edge e;
3064 unsigned ix;
3065
3066 /* Seed with the ANTIC_OUT of any successor. */
3067 for (ix = 0; ix < EDGE_COUNT (bb->succs); ix++)
3068 {
3069 e = EDGE_SUCC (bb, ix);
3070 /* Make sure we have already visited this BB, and is thus
3071 initialized. */
3072 if (BB_VISITED_P (e->dest))
3073 {
3074 bitmap_copy (STORE_ANTIC_IN (bb), STORE_ANTIC_OUT (e->dest));
3075 break;
3076 }
3077 }
3078
3079 for (; ix < EDGE_COUNT (bb->succs); ix++)
3080 {
3081 e = EDGE_SUCC (bb, ix);
3082 if (BB_VISITED_P (e->dest))
3083 bitmap_and_into (STORE_ANTIC_IN (bb), STORE_ANTIC_OUT (e->dest));
3084 }
3085
3086 BB_VISITED_P (bb) = true;
3087 }
3088
3089 /* Compute the AVAIL sets for every basic block in BLOCKS.
3090
3091 We compute {STORE,READ}_AVAIL_{OUT,IN} as follows:
3092
3093 AVAIL_OUT[bb] = union (AVAIL_IN[bb], LOCAL[bb])
3094 AVAIL_IN[bb] = intersect (AVAIL_OUT[predecessors])
3095
3096 This is basically what we do in lcm's compute_available(), but here
3097 we calculate two sets of sets (one for STOREs and one for READs),
3098 and we work on a region instead of the entire CFG.
3099
3100 REGION is the TM region.
3101 BLOCKS are the basic blocks in the region. */
3102
3103 static void
3104 tm_memopt_compute_available (struct tm_region *region,
3105 VEC (basic_block, heap) *blocks)
3106 {
3107 edge e;
3108 basic_block *worklist, *qin, *qout, *qend, bb;
3109 unsigned int qlen, i;
3110 edge_iterator ei;
3111 bool changed;
3112
3113 /* Allocate a worklist array/queue. Entries are only added to the
3114 list if they were not already on the list. So the size is
3115 bounded by the number of basic blocks in the region. */
3116 qlen = VEC_length (basic_block, blocks) - 1;
3117 qin = qout = worklist =
3118 XNEWVEC (basic_block, qlen);
3119
3120 /* Put every block in the region on the worklist. */
3121 for (i = 0; VEC_iterate (basic_block, blocks, i, bb); ++i)
3122 {
3123 /* Seed AVAIL_OUT with the LOCAL set. */
3124 bitmap_ior_into (STORE_AVAIL_OUT (bb), STORE_LOCAL (bb));
3125 bitmap_ior_into (READ_AVAIL_OUT (bb), READ_LOCAL (bb));
3126
3127 AVAIL_IN_WORKLIST_P (bb) = true;
3128 /* No need to insert the entry block, since it has an AVIN of
3129 null, and an AVOUT that has already been seeded in. */
3130 if (bb != region->entry_block)
3131 *qin++ = bb;
3132 }
3133
3134 /* The entry block has been initialized with the local sets. */
3135 BB_VISITED_P (region->entry_block) = true;
3136
3137 qin = worklist;
3138 qend = &worklist[qlen];
3139
3140 /* Iterate until the worklist is empty. */
3141 while (qlen)
3142 {
3143 /* Take the first entry off the worklist. */
3144 bb = *qout++;
3145 qlen--;
3146
3147 if (qout >= qend)
3148 qout = worklist;
3149
3150 /* This block can be added to the worklist again if necessary. */
3151 AVAIL_IN_WORKLIST_P (bb) = false;
3152 tm_memopt_compute_avin (bb);
3153
3154 /* Note: We do not add the LOCAL sets here because we already
3155 seeded the AVAIL_OUT sets with them. */
3156 changed = bitmap_ior_into (STORE_AVAIL_OUT (bb), STORE_AVAIL_IN (bb));
3157 changed |= bitmap_ior_into (READ_AVAIL_OUT (bb), READ_AVAIL_IN (bb));
3158 if (changed
3159 && (region->exit_blocks == NULL
3160 || !bitmap_bit_p (region->exit_blocks, bb->index)))
3161 /* If the out state of this block changed, then we need to add
3162 its successors to the worklist if they are not already in. */
3163 FOR_EACH_EDGE (e, ei, bb->succs)
3164 if (!AVAIL_IN_WORKLIST_P (e->dest) && e->dest != EXIT_BLOCK_PTR)
3165 {
3166 *qin++ = e->dest;
3167 AVAIL_IN_WORKLIST_P (e->dest) = true;
3168 qlen++;
3169
3170 if (qin >= qend)
3171 qin = worklist;
3172 }
3173 }
3174
3175 free (worklist);
3176
3177 if (dump_file)
3178 dump_tm_memopt_sets (blocks);
3179 }
3180
3181 /* Compute ANTIC sets for every basic block in BLOCKS.
3182
3183 We compute STORE_ANTIC_OUT as follows:
3184
3185 STORE_ANTIC_OUT[bb] = union(STORE_ANTIC_IN[bb], STORE_LOCAL[bb])
3186 STORE_ANTIC_IN[bb] = intersect(STORE_ANTIC_OUT[successors])
3187
3188 REGION is the TM region.
3189 BLOCKS are the basic blocks in the region. */
3190
3191 static void
3192 tm_memopt_compute_antic (struct tm_region *region,
3193 VEC (basic_block, heap) *blocks)
3194 {
3195 edge e;
3196 basic_block *worklist, *qin, *qout, *qend, bb;
3197 unsigned int qlen;
3198 int i;
3199 edge_iterator ei;
3200
3201 /* Allocate a worklist array/queue. Entries are only added to the
3202 list if they were not already on the list. So the size is
3203 bounded by the number of basic blocks in the region. */
3204 qin = qout = worklist =
3205 XNEWVEC (basic_block, VEC_length (basic_block, blocks));
3206
3207 for (qlen = 0, i = VEC_length (basic_block, blocks) - 1; i >= 0; --i)
3208 {
3209 bb = VEC_index (basic_block, blocks, i);
3210
3211 /* Seed ANTIC_OUT with the LOCAL set. */
3212 bitmap_ior_into (STORE_ANTIC_OUT (bb), STORE_LOCAL (bb));
3213
3214 /* Put every block in the region on the worklist. */
3215 AVAIL_IN_WORKLIST_P (bb) = true;
3216 /* No need to insert exit blocks, since their ANTIC_IN is NULL,
3217 and their ANTIC_OUT has already been seeded in. */
3218 if (region->exit_blocks
3219 && !bitmap_bit_p (region->exit_blocks, bb->index))
3220 {
3221 qlen++;
3222 *qin++ = bb;
3223 }
3224 }
3225
3226 /* The exit blocks have been initialized with the local sets. */
3227 if (region->exit_blocks)
3228 {
3229 unsigned int i;
3230 bitmap_iterator bi;
3231 EXECUTE_IF_SET_IN_BITMAP (region->exit_blocks, 0, i, bi)
3232 BB_VISITED_P (BASIC_BLOCK (i)) = true;
3233 }
3234
3235 qin = worklist;
3236 qend = &worklist[qlen];
3237
3238 /* Iterate until the worklist is empty. */
3239 while (qlen)
3240 {
3241 /* Take the first entry off the worklist. */
3242 bb = *qout++;
3243 qlen--;
3244
3245 if (qout >= qend)
3246 qout = worklist;
3247
3248 /* This block can be added to the worklist again if necessary. */
3249 AVAIL_IN_WORKLIST_P (bb) = false;
3250 tm_memopt_compute_antin (bb);
3251
3252 /* Note: We do not add the LOCAL sets here because we already
3253 seeded the ANTIC_OUT sets with them. */
3254 if (bitmap_ior_into (STORE_ANTIC_OUT (bb), STORE_ANTIC_IN (bb))
3255 && bb != region->entry_block)
3256 /* If the out state of this block changed, then we need to add
3257 its predecessors to the worklist if they are not already in. */
3258 FOR_EACH_EDGE (e, ei, bb->preds)
3259 if (!AVAIL_IN_WORKLIST_P (e->src))
3260 {
3261 *qin++ = e->src;
3262 AVAIL_IN_WORKLIST_P (e->src) = true;
3263 qlen++;
3264
3265 if (qin >= qend)
3266 qin = worklist;
3267 }
3268 }
3269
3270 free (worklist);
3271
3272 if (dump_file)
3273 dump_tm_memopt_sets (blocks);
3274 }
3275
3276 /* Offsets of load variants from TM_LOAD. For example,
3277 BUILT_IN_TM_LOAD_RAR* is an offset of 1 from BUILT_IN_TM_LOAD*.
3278 See gtm-builtins.def. */
3279 #define TRANSFORM_RAR 1
3280 #define TRANSFORM_RAW 2
3281 #define TRANSFORM_RFW 3
3282 /* Offsets of store variants from TM_STORE. */
3283 #define TRANSFORM_WAR 1
3284 #define TRANSFORM_WAW 2
3285
3286 /* Inform about a load/store optimization. */
3287
3288 static void
3289 dump_tm_memopt_transform (gimple stmt)
3290 {
3291 if (dump_file)
3292 {
3293 fprintf (dump_file, "TM memopt: transforming: ");
3294 print_gimple_stmt (dump_file, stmt, 0, 0);
3295 fprintf (dump_file, "\n");
3296 }
3297 }
3298
3299 /* Perform a read/write optimization. Replaces the TM builtin in STMT
3300 by a builtin that is OFFSET entries down in the builtins table in
3301 gtm-builtins.def. */
3302
3303 static void
3304 tm_memopt_transform_stmt (unsigned int offset,
3305 gimple stmt,
3306 gimple_stmt_iterator *gsi)
3307 {
3308 tree fn = gimple_call_fn (stmt);
3309 gcc_assert (TREE_CODE (fn) == ADDR_EXPR);
3310 TREE_OPERAND (fn, 0)
3311 = builtin_decl_explicit ((enum built_in_function)
3312 (DECL_FUNCTION_CODE (TREE_OPERAND (fn, 0))
3313 + offset));
3314 gimple_call_set_fn (stmt, fn);
3315 gsi_replace (gsi, stmt, true);
3316 dump_tm_memopt_transform (stmt);
3317 }
3318
3319 /* Perform the actual TM memory optimization transformations in the
3320 basic blocks in BLOCKS. */
3321
3322 static void
3323 tm_memopt_transform_blocks (VEC (basic_block, heap) *blocks)
3324 {
3325 size_t i;
3326 basic_block bb;
3327 gimple_stmt_iterator gsi;
3328
3329 for (i = 0; VEC_iterate (basic_block, blocks, i, bb); ++i)
3330 {
3331 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3332 {
3333 gimple stmt = gsi_stmt (gsi);
3334 bitmap read_avail = READ_AVAIL_IN (bb);
3335 bitmap store_avail = STORE_AVAIL_IN (bb);
3336 bitmap store_antic = STORE_ANTIC_OUT (bb);
3337 unsigned int loc;
3338
3339 if (is_tm_simple_load (stmt))
3340 {
3341 loc = tm_memopt_value_number (stmt, NO_INSERT);
3342 if (store_avail && bitmap_bit_p (store_avail, loc))
3343 tm_memopt_transform_stmt (TRANSFORM_RAW, stmt, &gsi);
3344 else if (store_antic && bitmap_bit_p (store_antic, loc))
3345 {
3346 tm_memopt_transform_stmt (TRANSFORM_RFW, stmt, &gsi);
3347 bitmap_set_bit (store_avail, loc);
3348 }
3349 else if (read_avail && bitmap_bit_p (read_avail, loc))
3350 tm_memopt_transform_stmt (TRANSFORM_RAR, stmt, &gsi);
3351 else
3352 bitmap_set_bit (read_avail, loc);
3353 }
3354 else if (is_tm_simple_store (stmt))
3355 {
3356 loc = tm_memopt_value_number (stmt, NO_INSERT);
3357 if (store_avail && bitmap_bit_p (store_avail, loc))
3358 tm_memopt_transform_stmt (TRANSFORM_WAW, stmt, &gsi);
3359 else
3360 {
3361 if (read_avail && bitmap_bit_p (read_avail, loc))
3362 tm_memopt_transform_stmt (TRANSFORM_WAR, stmt, &gsi);
3363 bitmap_set_bit (store_avail, loc);
3364 }
3365 }
3366 }
3367 }
3368 }
3369
3370 /* Return a new set of bitmaps for a BB. */
3371
3372 static struct tm_memopt_bitmaps *
3373 tm_memopt_init_sets (void)
3374 {
3375 struct tm_memopt_bitmaps *b
3376 = XOBNEW (&tm_memopt_obstack.obstack, struct tm_memopt_bitmaps);
3377 b->store_avail_in = BITMAP_ALLOC (&tm_memopt_obstack);
3378 b->store_avail_out = BITMAP_ALLOC (&tm_memopt_obstack);
3379 b->store_antic_in = BITMAP_ALLOC (&tm_memopt_obstack);
3380 b->store_antic_out = BITMAP_ALLOC (&tm_memopt_obstack);
3381 b->store_avail_out = BITMAP_ALLOC (&tm_memopt_obstack);
3382 b->read_avail_in = BITMAP_ALLOC (&tm_memopt_obstack);
3383 b->read_avail_out = BITMAP_ALLOC (&tm_memopt_obstack);
3384 b->read_local = BITMAP_ALLOC (&tm_memopt_obstack);
3385 b->store_local = BITMAP_ALLOC (&tm_memopt_obstack);
3386 return b;
3387 }
3388
3389 /* Free sets computed for each BB. */
3390
3391 static void
3392 tm_memopt_free_sets (VEC (basic_block, heap) *blocks)
3393 {
3394 size_t i;
3395 basic_block bb;
3396
3397 for (i = 0; VEC_iterate (basic_block, blocks, i, bb); ++i)
3398 bb->aux = NULL;
3399 }
3400
3401 /* Clear the visited bit for every basic block in BLOCKS. */
3402
3403 static void
3404 tm_memopt_clear_visited (VEC (basic_block, heap) *blocks)
3405 {
3406 size_t i;
3407 basic_block bb;
3408
3409 for (i = 0; VEC_iterate (basic_block, blocks, i, bb); ++i)
3410 BB_VISITED_P (bb) = false;
3411 }
3412
3413 /* Replace TM load/stores with hints for the runtime. We handle
3414 things like read-after-write, write-after-read, read-after-read,
3415 read-for-write, etc. */
3416
3417 static unsigned int
3418 execute_tm_memopt (void)
3419 {
3420 struct tm_region *region;
3421 VEC (basic_block, heap) *bbs;
3422
3423 tm_memopt_value_id = 0;
3424 tm_memopt_value_numbers = htab_create (10, tm_memop_hash, tm_memop_eq, free);
3425
3426 for (region = all_tm_regions; region; region = region->next)
3427 {
3428 /* All the TM stores/loads in the current region. */
3429 size_t i;
3430 basic_block bb;
3431
3432 bitmap_obstack_initialize (&tm_memopt_obstack);
3433
3434 /* Save all BBs for the current region. */
3435 bbs = get_tm_region_blocks (region->entry_block,
3436 region->exit_blocks,
3437 region->irr_blocks,
3438 NULL,
3439 false);
3440
3441 /* Collect all the memory operations. */
3442 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); ++i)
3443 {
3444 bb->aux = tm_memopt_init_sets ();
3445 tm_memopt_accumulate_memops (bb);
3446 }
3447
3448 /* Solve data flow equations and transform each block accordingly. */
3449 tm_memopt_clear_visited (bbs);
3450 tm_memopt_compute_available (region, bbs);
3451 tm_memopt_clear_visited (bbs);
3452 tm_memopt_compute_antic (region, bbs);
3453 tm_memopt_transform_blocks (bbs);
3454
3455 tm_memopt_free_sets (bbs);
3456 VEC_free (basic_block, heap, bbs);
3457 bitmap_obstack_release (&tm_memopt_obstack);
3458 htab_empty (tm_memopt_value_numbers);
3459 }
3460
3461 htab_delete (tm_memopt_value_numbers);
3462 return 0;
3463 }
3464
3465 static bool
3466 gate_tm_memopt (void)
3467 {
3468 return flag_tm && optimize > 0;
3469 }
3470
3471 struct gimple_opt_pass pass_tm_memopt =
3472 {
3473 {
3474 GIMPLE_PASS,
3475 "tmmemopt", /* name */
3476 gate_tm_memopt, /* gate */
3477 execute_tm_memopt, /* execute */
3478 NULL, /* sub */
3479 NULL, /* next */
3480 0, /* static_pass_number */
3481 TV_TRANS_MEM, /* tv_id */
3482 PROP_ssa | PROP_cfg, /* properties_required */
3483 0, /* properties_provided */
3484 0, /* properties_destroyed */
3485 0, /* todo_flags_start */
3486 TODO_dump_func, /* todo_flags_finish */
3487 }
3488 };
3489
3490 \f
3491 /* Interprocedual analysis for the creation of transactional clones.
3492 The aim of this pass is to find which functions are referenced in
3493 a non-irrevocable transaction context, and for those over which
3494 we have control (or user directive), create a version of the
3495 function which uses only the transactional interface to reference
3496 protected memories. This analysis proceeds in several steps:
3497
3498 (1) Collect the set of all possible transactional clones:
3499
3500 (a) For all local public functions marked tm_callable, push
3501 it onto the tm_callee queue.
3502
3503 (b) For all local functions, scan for calls in transaction blocks.
3504 Push the caller and callee onto the tm_caller and tm_callee
3505 queues. Count the number of callers for each callee.
3506
3507 (c) For each local function on the callee list, assume we will
3508 create a transactional clone. Push *all* calls onto the
3509 callee queues; count the number of clone callers separately
3510 to the number of original callers.
3511
3512 (2) Propagate irrevocable status up the dominator tree:
3513
3514 (a) Any external function on the callee list that is not marked
3515 tm_callable is irrevocable. Push all callers of such onto
3516 a worklist.
3517
3518 (b) For each function on the worklist, mark each block that
3519 contains an irrevocable call. Use the AND operator to
3520 propagate that mark up the dominator tree.
3521
3522 (c) If we reach the entry block for a possible transactional
3523 clone, then the transactional clone is irrevocable, and
3524 we should not create the clone after all. Push all
3525 callers onto the worklist.
3526
3527 (d) Place tm_irrevocable calls at the beginning of the relevant
3528 blocks. Special case here is the entry block for the entire
3529 transaction region; there we mark it GTMA_DOES_GO_IRREVOCABLE for
3530 the library to begin the region in serial mode. Decrement
3531 the call count for all callees in the irrevocable region.
3532
3533 (3) Create the transactional clones:
3534
3535 Any tm_callee that still has a non-zero call count is cloned.
3536 */
3537
3538 /* This structure is stored in the AUX field of each cgraph_node. */
3539 struct tm_ipa_cg_data
3540 {
3541 /* The clone of the function that got created. */
3542 struct cgraph_node *clone;
3543
3544 /* The tm regions in the normal function. */
3545 struct tm_region *all_tm_regions;
3546
3547 /* The blocks of the normal/clone functions that contain irrevocable
3548 calls, or blocks that are post-dominated by irrevocable calls. */
3549 bitmap irrevocable_blocks_normal;
3550 bitmap irrevocable_blocks_clone;
3551
3552 /* The blocks of the normal function that are involved in transactions. */
3553 bitmap transaction_blocks_normal;
3554
3555 /* The number of callers to the transactional clone of this function
3556 from normal and transactional clones respectively. */
3557 unsigned tm_callers_normal;
3558 unsigned tm_callers_clone;
3559
3560 /* True if all calls to this function's transactional clone
3561 are irrevocable. Also automatically true if the function
3562 has no transactional clone. */
3563 bool is_irrevocable;
3564
3565 /* Flags indicating the presence of this function in various queues. */
3566 bool in_callee_queue;
3567 bool in_worklist;
3568
3569 /* Flags indicating the kind of scan desired while in the worklist. */
3570 bool want_irr_scan_normal;
3571 };
3572
3573 typedef struct cgraph_node *cgraph_node_p;
3574
3575 DEF_VEC_P (cgraph_node_p);
3576 DEF_VEC_ALLOC_P (cgraph_node_p, heap);
3577
3578 typedef VEC (cgraph_node_p, heap) *cgraph_node_queue;
3579
3580 /* Return the ipa data associated with NODE, allocating zeroed memory
3581 if necessary. TRAVERSE_ALIASES is true if we must traverse aliases
3582 and set *NODE accordingly. */
3583
3584 static struct tm_ipa_cg_data *
3585 get_cg_data (struct cgraph_node **node, bool traverse_aliases)
3586 {
3587 struct tm_ipa_cg_data *d;
3588
3589 if (traverse_aliases && (*node)->alias)
3590 *node = cgraph_get_node ((*node)->thunk.alias);
3591
3592 d = (struct tm_ipa_cg_data *) (*node)->aux;
3593
3594 if (d == NULL)
3595 {
3596 d = (struct tm_ipa_cg_data *)
3597 obstack_alloc (&tm_obstack.obstack, sizeof (*d));
3598 (*node)->aux = (void *) d;
3599 memset (d, 0, sizeof (*d));
3600 }
3601
3602 return d;
3603 }
3604
3605 /* Add NODE to the end of QUEUE, unless IN_QUEUE_P indicates that
3606 it is already present. */
3607
3608 static void
3609 maybe_push_queue (struct cgraph_node *node,
3610 cgraph_node_queue *queue_p, bool *in_queue_p)
3611 {
3612 if (!*in_queue_p)
3613 {
3614 *in_queue_p = true;
3615 VEC_safe_push (cgraph_node_p, heap, *queue_p, node);
3616 }
3617 }
3618
3619 /* A subroutine of ipa_tm_scan_calls_transaction and ipa_tm_scan_calls_clone.
3620 Queue all callees within block BB. */
3621
3622 static void
3623 ipa_tm_scan_calls_block (cgraph_node_queue *callees_p,
3624 basic_block bb, bool for_clone)
3625 {
3626 gimple_stmt_iterator gsi;
3627
3628 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3629 {
3630 gimple stmt = gsi_stmt (gsi);
3631 if (is_gimple_call (stmt) && !is_tm_pure_call (stmt))
3632 {
3633 tree fndecl = gimple_call_fndecl (stmt);
3634 if (fndecl)
3635 {
3636 struct tm_ipa_cg_data *d;
3637 unsigned *pcallers;
3638 struct cgraph_node *node;
3639
3640 if (is_tm_ending_fndecl (fndecl))
3641 continue;
3642 if (find_tm_replacement_function (fndecl))
3643 continue;
3644
3645 node = cgraph_get_node (fndecl);
3646 gcc_assert (node != NULL);
3647 d = get_cg_data (&node, true);
3648
3649 pcallers = (for_clone ? &d->tm_callers_clone
3650 : &d->tm_callers_normal);
3651 *pcallers += 1;
3652
3653 maybe_push_queue (node, callees_p, &d->in_callee_queue);
3654 }
3655 }
3656 }
3657 }
3658
3659 /* Scan all calls in NODE that are within a transaction region,
3660 and push the resulting nodes into the callee queue. */
3661
3662 static void
3663 ipa_tm_scan_calls_transaction (struct tm_ipa_cg_data *d,
3664 cgraph_node_queue *callees_p)
3665 {
3666 struct tm_region *r;
3667
3668 d->transaction_blocks_normal = BITMAP_ALLOC (&tm_obstack);
3669 d->all_tm_regions = all_tm_regions;
3670
3671 for (r = all_tm_regions; r; r = r->next)
3672 {
3673 VEC (basic_block, heap) *bbs;
3674 basic_block bb;
3675 unsigned i;
3676
3677 bbs = get_tm_region_blocks (r->entry_block, r->exit_blocks, NULL,
3678 d->transaction_blocks_normal, false);
3679
3680 FOR_EACH_VEC_ELT (basic_block, bbs, i, bb)
3681 ipa_tm_scan_calls_block (callees_p, bb, false);
3682
3683 VEC_free (basic_block, heap, bbs);
3684 }
3685 }
3686
3687 /* Scan all calls in NODE as if this is the transactional clone,
3688 and push the destinations into the callee queue. */
3689
3690 static void
3691 ipa_tm_scan_calls_clone (struct cgraph_node *node,
3692 cgraph_node_queue *callees_p)
3693 {
3694 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
3695 basic_block bb;
3696
3697 FOR_EACH_BB_FN (bb, fn)
3698 ipa_tm_scan_calls_block (callees_p, bb, true);
3699 }
3700
3701 /* The function NODE has been detected to be irrevocable. Push all
3702 of its callers onto WORKLIST for the purpose of re-scanning them. */
3703
3704 static void
3705 ipa_tm_note_irrevocable (struct cgraph_node *node,
3706 cgraph_node_queue *worklist_p)
3707 {
3708 struct tm_ipa_cg_data *d = get_cg_data (&node, true);
3709 struct cgraph_edge *e;
3710
3711 d->is_irrevocable = true;
3712
3713 for (e = node->callers; e ; e = e->next_caller)
3714 {
3715 basic_block bb;
3716 struct cgraph_node *caller;
3717
3718 /* Don't examine recursive calls. */
3719 if (e->caller == node)
3720 continue;
3721 /* Even if we think we can go irrevocable, believe the user
3722 above all. */
3723 if (is_tm_safe_or_pure (e->caller->decl))
3724 continue;
3725
3726 caller = e->caller;
3727 d = get_cg_data (&caller, true);
3728
3729 /* Check if the callee is in a transactional region. If so,
3730 schedule the function for normal re-scan as well. */
3731 bb = gimple_bb (e->call_stmt);
3732 gcc_assert (bb != NULL);
3733 if (d->transaction_blocks_normal
3734 && bitmap_bit_p (d->transaction_blocks_normal, bb->index))
3735 d->want_irr_scan_normal = true;
3736
3737 maybe_push_queue (caller, worklist_p, &d->in_worklist);
3738 }
3739 }
3740
3741 /* A subroutine of ipa_tm_scan_irr_blocks; return true iff any statement
3742 within the block is irrevocable. */
3743
3744 static bool
3745 ipa_tm_scan_irr_block (basic_block bb)
3746 {
3747 gimple_stmt_iterator gsi;
3748 tree fn;
3749
3750 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3751 {
3752 gimple stmt = gsi_stmt (gsi);
3753 switch (gimple_code (stmt))
3754 {
3755 case GIMPLE_CALL:
3756 if (is_tm_pure_call (stmt))
3757 break;
3758
3759 fn = gimple_call_fn (stmt);
3760
3761 /* Functions with the attribute are by definition irrevocable. */
3762 if (is_tm_irrevocable (fn))
3763 return true;
3764
3765 /* For direct function calls, go ahead and check for replacement
3766 functions, or transitive irrevocable functions. For indirect
3767 functions, we'll ask the runtime. */
3768 if (TREE_CODE (fn) == ADDR_EXPR)
3769 {
3770 struct tm_ipa_cg_data *d;
3771 struct cgraph_node *node;
3772
3773 fn = TREE_OPERAND (fn, 0);
3774 if (is_tm_ending_fndecl (fn))
3775 break;
3776 if (find_tm_replacement_function (fn))
3777 break;
3778
3779 node = cgraph_get_node(fn);
3780 d = get_cg_data (&node, true);
3781
3782 /* Return true if irrevocable, but above all, believe
3783 the user. */
3784 if (d->is_irrevocable
3785 && !is_tm_safe_or_pure (fn))
3786 return true;
3787 }
3788 break;
3789
3790 case GIMPLE_ASM:
3791 /* ??? The Approved Method of indicating that an inline
3792 assembly statement is not relevant to the transaction
3793 is to wrap it in a __tm_waiver block. This is not
3794 yet implemented, so we can't check for it. */
3795 if (is_tm_safe (current_function_decl))
3796 {
3797 tree t = build1 (NOP_EXPR, void_type_node, size_zero_node);
3798 SET_EXPR_LOCATION (t, gimple_location (stmt));
3799 TREE_BLOCK (t) = gimple_block (stmt);
3800 error ("%Kasm not allowed in %<transaction_safe%> function", t);
3801 }
3802 return true;
3803
3804 default:
3805 break;
3806 }
3807 }
3808
3809 return false;
3810 }
3811
3812 /* For each of the blocks seeded witin PQUEUE, walk the CFG looking
3813 for new irrevocable blocks, marking them in NEW_IRR. Don't bother
3814 scanning past OLD_IRR or EXIT_BLOCKS. */
3815
3816 static bool
3817 ipa_tm_scan_irr_blocks (VEC (basic_block, heap) **pqueue, bitmap new_irr,
3818 bitmap old_irr, bitmap exit_blocks)
3819 {
3820 bool any_new_irr = false;
3821 edge e;
3822 edge_iterator ei;
3823 bitmap visited_blocks = BITMAP_ALLOC (NULL);
3824
3825 do
3826 {
3827 basic_block bb = VEC_pop (basic_block, *pqueue);
3828
3829 /* Don't re-scan blocks we know already are irrevocable. */
3830 if (old_irr && bitmap_bit_p (old_irr, bb->index))
3831 continue;
3832
3833 if (ipa_tm_scan_irr_block (bb))
3834 {
3835 bitmap_set_bit (new_irr, bb->index);
3836 any_new_irr = true;
3837 }
3838 else if (exit_blocks == NULL || !bitmap_bit_p (exit_blocks, bb->index))
3839 {
3840 FOR_EACH_EDGE (e, ei, bb->succs)
3841 if (!bitmap_bit_p (visited_blocks, e->dest->index))
3842 {
3843 bitmap_set_bit (visited_blocks, e->dest->index);
3844 VEC_safe_push (basic_block, heap, *pqueue, e->dest);
3845 }
3846 }
3847 }
3848 while (!VEC_empty (basic_block, *pqueue));
3849
3850 BITMAP_FREE (visited_blocks);
3851
3852 return any_new_irr;
3853 }
3854
3855 /* Propagate the irrevocable property both up and down the dominator tree.
3856 BB is the current block being scanned; EXIT_BLOCKS are the edges of the
3857 TM regions; OLD_IRR are the results of a previous scan of the dominator
3858 tree which has been fully propagated; NEW_IRR is the set of new blocks
3859 which are gaining the irrevocable property during the current scan. */
3860
3861 static void
3862 ipa_tm_propagate_irr (basic_block entry_block, bitmap new_irr,
3863 bitmap old_irr, bitmap exit_blocks)
3864 {
3865 VEC (basic_block, heap) *bbs;
3866 bitmap all_region_blocks;
3867
3868 /* If this block is in the old set, no need to rescan. */
3869 if (old_irr && bitmap_bit_p (old_irr, entry_block->index))
3870 return;
3871
3872 all_region_blocks = BITMAP_ALLOC (&tm_obstack);
3873 bbs = get_tm_region_blocks (entry_block, exit_blocks, NULL,
3874 all_region_blocks, false);
3875 do
3876 {
3877 basic_block bb = VEC_pop (basic_block, bbs);
3878 bool this_irr = bitmap_bit_p (new_irr, bb->index);
3879 bool all_son_irr = false;
3880 edge_iterator ei;
3881 edge e;
3882
3883 /* Propagate up. If my children are, I am too, but we must have
3884 at least one child that is. */
3885 if (!this_irr)
3886 {
3887 FOR_EACH_EDGE (e, ei, bb->succs)
3888 {
3889 if (!bitmap_bit_p (new_irr, e->dest->index))
3890 {
3891 all_son_irr = false;
3892 break;
3893 }
3894 else
3895 all_son_irr = true;
3896 }
3897 if (all_son_irr)
3898 {
3899 /* Add block to new_irr if it hasn't already been processed. */
3900 if (!old_irr || !bitmap_bit_p (old_irr, bb->index))
3901 {
3902 bitmap_set_bit (new_irr, bb->index);
3903 this_irr = true;
3904 }
3905 }
3906 }
3907
3908 /* Propagate down to everyone we immediately dominate. */
3909 if (this_irr)
3910 {
3911 basic_block son;
3912 for (son = first_dom_son (CDI_DOMINATORS, bb);
3913 son;
3914 son = next_dom_son (CDI_DOMINATORS, son))
3915 {
3916 /* Make sure block is actually in a TM region, and it
3917 isn't already in old_irr. */
3918 if ((!old_irr || !bitmap_bit_p (old_irr, son->index))
3919 && bitmap_bit_p (all_region_blocks, son->index))
3920 bitmap_set_bit (new_irr, son->index);
3921 }
3922 }
3923 }
3924 while (!VEC_empty (basic_block, bbs));
3925
3926 BITMAP_FREE (all_region_blocks);
3927 VEC_free (basic_block, heap, bbs);
3928 }
3929
3930 static void
3931 ipa_tm_decrement_clone_counts (basic_block bb, bool for_clone)
3932 {
3933 gimple_stmt_iterator gsi;
3934
3935 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3936 {
3937 gimple stmt = gsi_stmt (gsi);
3938 if (is_gimple_call (stmt) && !is_tm_pure_call (stmt))
3939 {
3940 tree fndecl = gimple_call_fndecl (stmt);
3941 if (fndecl)
3942 {
3943 struct tm_ipa_cg_data *d;
3944 unsigned *pcallers;
3945 struct cgraph_node *tnode;
3946
3947 if (is_tm_ending_fndecl (fndecl))
3948 continue;
3949 if (find_tm_replacement_function (fndecl))
3950 continue;
3951
3952 tnode = cgraph_get_node (fndecl);
3953 d = get_cg_data (&tnode, true);
3954
3955 pcallers = (for_clone ? &d->tm_callers_clone
3956 : &d->tm_callers_normal);
3957
3958 gcc_assert (*pcallers > 0);
3959 *pcallers -= 1;
3960 }
3961 }
3962 }
3963 }
3964
3965 /* (Re-)Scan the transaction blocks in NODE for calls to irrevocable functions,
3966 as well as other irrevocable actions such as inline assembly. Mark all
3967 such blocks as irrevocable and decrement the number of calls to
3968 transactional clones. Return true if, for the transactional clone, the
3969 entire function is irrevocable. */
3970
3971 static bool
3972 ipa_tm_scan_irr_function (struct cgraph_node *node, bool for_clone)
3973 {
3974 struct tm_ipa_cg_data *d;
3975 bitmap new_irr, old_irr;
3976 VEC (basic_block, heap) *queue;
3977 bool ret = false;
3978
3979 /* Builtin operators (operator new, and such). */
3980 if (DECL_STRUCT_FUNCTION (node->decl) == NULL
3981 || DECL_STRUCT_FUNCTION (node->decl)->cfg == NULL)
3982 return false;
3983
3984 current_function_decl = node->decl;
3985 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
3986 calculate_dominance_info (CDI_DOMINATORS);
3987
3988 d = get_cg_data (&node, true);
3989 queue = VEC_alloc (basic_block, heap, 10);
3990 new_irr = BITMAP_ALLOC (&tm_obstack);
3991
3992 /* Scan each tm region, propagating irrevocable status through the tree. */
3993 if (for_clone)
3994 {
3995 old_irr = d->irrevocable_blocks_clone;
3996 VEC_quick_push (basic_block, queue, single_succ (ENTRY_BLOCK_PTR));
3997 if (ipa_tm_scan_irr_blocks (&queue, new_irr, old_irr, NULL))
3998 {
3999 ipa_tm_propagate_irr (single_succ (ENTRY_BLOCK_PTR), new_irr,
4000 old_irr, NULL);
4001 ret = bitmap_bit_p (new_irr, single_succ (ENTRY_BLOCK_PTR)->index);
4002 }
4003 }
4004 else
4005 {
4006 struct tm_region *region;
4007
4008 old_irr = d->irrevocable_blocks_normal;
4009 for (region = d->all_tm_regions; region; region = region->next)
4010 {
4011 VEC_quick_push (basic_block, queue, region->entry_block);
4012 if (ipa_tm_scan_irr_blocks (&queue, new_irr, old_irr,
4013 region->exit_blocks))
4014 ipa_tm_propagate_irr (region->entry_block, new_irr, old_irr,
4015 region->exit_blocks);
4016 }
4017 }
4018
4019 /* If we found any new irrevocable blocks, reduce the call count for
4020 transactional clones within the irrevocable blocks. Save the new
4021 set of irrevocable blocks for next time. */
4022 if (!bitmap_empty_p (new_irr))
4023 {
4024 bitmap_iterator bmi;
4025 unsigned i;
4026
4027 EXECUTE_IF_SET_IN_BITMAP (new_irr, 0, i, bmi)
4028 ipa_tm_decrement_clone_counts (BASIC_BLOCK (i), for_clone);
4029
4030 if (old_irr)
4031 {
4032 bitmap_ior_into (old_irr, new_irr);
4033 BITMAP_FREE (new_irr);
4034 }
4035 else if (for_clone)
4036 d->irrevocable_blocks_clone = new_irr;
4037 else
4038 d->irrevocable_blocks_normal = new_irr;
4039
4040 if (dump_file && new_irr)
4041 {
4042 const char *dname;
4043 bitmap_iterator bmi;
4044 unsigned i;
4045
4046 dname = lang_hooks.decl_printable_name (current_function_decl, 2);
4047 EXECUTE_IF_SET_IN_BITMAP (new_irr, 0, i, bmi)
4048 fprintf (dump_file, "%s: bb %d goes irrevocable\n", dname, i);
4049 }
4050 }
4051 else
4052 BITMAP_FREE (new_irr);
4053
4054 VEC_free (basic_block, heap, queue);
4055 pop_cfun ();
4056 current_function_decl = NULL;
4057
4058 return ret;
4059 }
4060
4061 /* Return true if, for the transactional clone of NODE, any call
4062 may enter irrevocable mode. */
4063
4064 static bool
4065 ipa_tm_mayenterirr_function (struct cgraph_node *node)
4066 {
4067 struct tm_ipa_cg_data *d;
4068 tree decl;
4069 unsigned flags;
4070
4071 d = get_cg_data (&node, true);
4072 decl = node->decl;
4073 flags = flags_from_decl_or_type (decl);
4074
4075 /* Handle some TM builtins. Ordinarily these aren't actually generated
4076 at this point, but handling these functions when written in by the
4077 user makes it easier to build unit tests. */
4078 if (flags & ECF_TM_BUILTIN)
4079 return false;
4080
4081 /* Filter out all functions that are marked. */
4082 if (flags & ECF_TM_PURE)
4083 return false;
4084 if (is_tm_safe (decl))
4085 return false;
4086 if (is_tm_irrevocable (decl))
4087 return true;
4088 if (is_tm_callable (decl))
4089 return true;
4090 if (find_tm_replacement_function (decl))
4091 return true;
4092
4093 /* If we aren't seeing the final version of the function we don't
4094 know what it will contain at runtime. */
4095 if (cgraph_function_body_availability (node) < AVAIL_AVAILABLE)
4096 return true;
4097
4098 /* If the function must go irrevocable, then of course true. */
4099 if (d->is_irrevocable)
4100 return true;
4101
4102 /* If there are any blocks marked irrevocable, then the function
4103 as a whole may enter irrevocable. */
4104 if (d->irrevocable_blocks_clone)
4105 return true;
4106
4107 /* We may have previously marked this function as tm_may_enter_irr;
4108 see pass_diagnose_tm_blocks. */
4109 if (node->local.tm_may_enter_irr)
4110 return true;
4111
4112 /* Recurse on the main body for aliases. In general, this will
4113 result in one of the bits above being set so that we will not
4114 have to recurse next time. */
4115 if (node->alias)
4116 return ipa_tm_mayenterirr_function (cgraph_get_node (node->thunk.alias));
4117
4118 /* What remains is unmarked local functions without items that force
4119 the function to go irrevocable. */
4120 return false;
4121 }
4122
4123 /* Diagnose calls from transaction_safe functions to unmarked
4124 functions that are determined to not be safe. */
4125
4126 static void
4127 ipa_tm_diagnose_tm_safe (struct cgraph_node *node)
4128 {
4129 struct cgraph_edge *e;
4130
4131 for (e = node->callees; e ; e = e->next_callee)
4132 if (!is_tm_callable (e->callee->decl)
4133 && e->callee->local.tm_may_enter_irr)
4134 error_at (gimple_location (e->call_stmt),
4135 "unsafe function call %qD within "
4136 "%<transaction_safe%> function", e->callee->decl);
4137 }
4138
4139 /* Diagnose call from atomic transactions to unmarked functions
4140 that are determined to not be safe. */
4141
4142 static void
4143 ipa_tm_diagnose_transaction (struct cgraph_node *node,
4144 struct tm_region *all_tm_regions)
4145 {
4146 struct tm_region *r;
4147
4148 for (r = all_tm_regions; r ; r = r->next)
4149 if (gimple_transaction_subcode (r->transaction_stmt) & GTMA_IS_RELAXED)
4150 {
4151 /* Atomic transactions can be nested inside relaxed. */
4152 if (r->inner)
4153 ipa_tm_diagnose_transaction (node, r->inner);
4154 }
4155 else
4156 {
4157 VEC (basic_block, heap) *bbs;
4158 gimple_stmt_iterator gsi;
4159 basic_block bb;
4160 size_t i;
4161
4162 bbs = get_tm_region_blocks (r->entry_block, r->exit_blocks,
4163 r->irr_blocks, NULL, false);
4164
4165 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); ++i)
4166 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4167 {
4168 gimple stmt = gsi_stmt (gsi);
4169 tree fndecl;
4170
4171 if (gimple_code (stmt) == GIMPLE_ASM)
4172 {
4173 error_at (gimple_location (stmt),
4174 "asm not allowed in atomic transaction");
4175 continue;
4176 }
4177
4178 if (!is_gimple_call (stmt))
4179 continue;
4180 fndecl = gimple_call_fndecl (stmt);
4181
4182 /* Indirect function calls have been diagnosed already. */
4183 if (!fndecl)
4184 continue;
4185
4186 /* Stop at the end of the transaction. */
4187 if (is_tm_ending_fndecl (fndecl))
4188 {
4189 if (bitmap_bit_p (r->exit_blocks, bb->index))
4190 break;
4191 continue;
4192 }
4193
4194 /* Marked functions have been diagnosed already. */
4195 if (is_tm_pure_call (stmt))
4196 continue;
4197 if (is_tm_callable (fndecl))
4198 continue;
4199
4200 if (cgraph_local_info (fndecl)->tm_may_enter_irr)
4201 error_at (gimple_location (stmt),
4202 "unsafe function call %qD within "
4203 "atomic transaction", fndecl);
4204 }
4205
4206 VEC_free (basic_block, heap, bbs);
4207 }
4208 }
4209
4210 /* Return a transactional mangled name for the DECL_ASSEMBLER_NAME in
4211 OLD_DECL. The returned value is a freshly malloced pointer that
4212 should be freed by the caller. */
4213
4214 static tree
4215 tm_mangle (tree old_asm_id)
4216 {
4217 const char *old_asm_name;
4218 char *tm_name;
4219 void *alloc = NULL;
4220 struct demangle_component *dc;
4221 tree new_asm_id;
4222
4223 /* Determine if the symbol is already a valid C++ mangled name. Do this
4224 even for C, which might be interfacing with C++ code via appropriately
4225 ugly identifiers. */
4226 /* ??? We could probably do just as well checking for "_Z" and be done. */
4227 old_asm_name = IDENTIFIER_POINTER (old_asm_id);
4228 dc = cplus_demangle_v3_components (old_asm_name, DMGL_NO_OPTS, &alloc);
4229
4230 if (dc == NULL)
4231 {
4232 char length[8];
4233
4234 do_unencoded:
4235 sprintf (length, "%u", IDENTIFIER_LENGTH (old_asm_id));
4236 tm_name = concat ("_ZGTt", length, old_asm_name, NULL);
4237 }
4238 else
4239 {
4240 old_asm_name += 2; /* Skip _Z */
4241
4242 switch (dc->type)
4243 {
4244 case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
4245 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
4246 /* Don't play silly games, you! */
4247 goto do_unencoded;
4248
4249 case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
4250 /* I'd really like to know if we can ever be passed one of
4251 these from the C++ front end. The Logical Thing would
4252 seem that hidden-alias should be outer-most, so that we
4253 get hidden-alias of a transaction-clone and not vice-versa. */
4254 old_asm_name += 2;
4255 break;
4256
4257 default:
4258 break;
4259 }
4260
4261 tm_name = concat ("_ZGTt", old_asm_name, NULL);
4262 }
4263 free (alloc);
4264
4265 new_asm_id = get_identifier (tm_name);
4266 free (tm_name);
4267
4268 return new_asm_id;
4269 }
4270
4271 static inline void
4272 ipa_tm_mark_needed_node (struct cgraph_node *node)
4273 {
4274 cgraph_mark_needed_node (node);
4275 /* ??? function_and_variable_visibility will reset
4276 the needed bit, without actually checking. */
4277 node->analyzed = 1;
4278 }
4279
4280 /* Callback data for ipa_tm_create_version_alias. */
4281 struct create_version_alias_info
4282 {
4283 struct cgraph_node *old_node;
4284 tree new_decl;
4285 };
4286
4287 /* A subroutine of ipa_tm_create_version, called via
4288 cgraph_for_node_and_aliases. Create new tm clones for each of
4289 the existing aliases. */
4290 static bool
4291 ipa_tm_create_version_alias (struct cgraph_node *node, void *data)
4292 {
4293 struct create_version_alias_info *info
4294 = (struct create_version_alias_info *)data;
4295 tree old_decl, new_decl, tm_name;
4296 struct cgraph_node *new_node;
4297
4298 if (!node->same_body_alias)
4299 return false;
4300
4301 old_decl = node->decl;
4302 tm_name = tm_mangle (DECL_ASSEMBLER_NAME (old_decl));
4303 new_decl = build_decl (DECL_SOURCE_LOCATION (old_decl),
4304 TREE_CODE (old_decl), tm_name,
4305 TREE_TYPE (old_decl));
4306
4307 SET_DECL_ASSEMBLER_NAME (new_decl, tm_name);
4308 SET_DECL_RTL (new_decl, NULL);
4309
4310 /* Based loosely on C++'s make_alias_for(). */
4311 TREE_PUBLIC (new_decl) = TREE_PUBLIC (old_decl);
4312 DECL_CONTEXT (new_decl) = DECL_CONTEXT (old_decl);
4313 DECL_LANG_SPECIFIC (new_decl) = DECL_LANG_SPECIFIC (old_decl);
4314 TREE_READONLY (new_decl) = TREE_READONLY (old_decl);
4315 DECL_EXTERNAL (new_decl) = 0;
4316 DECL_ARTIFICIAL (new_decl) = 1;
4317 TREE_ADDRESSABLE (new_decl) = 1;
4318 TREE_USED (new_decl) = 1;
4319 TREE_SYMBOL_REFERENCED (tm_name) = 1;
4320
4321 /* Perform the same remapping to the comdat group. */
4322 if (DECL_ONE_ONLY (new_decl))
4323 DECL_COMDAT_GROUP (new_decl) = tm_mangle (DECL_COMDAT_GROUP (old_decl));
4324
4325 new_node = cgraph_same_body_alias (NULL, new_decl, info->new_decl);
4326 new_node->tm_clone = true;
4327 new_node->local.externally_visible = info->old_node->local.externally_visible;
4328 /* ?? Do not traverse aliases here. */
4329 get_cg_data (&node, false)->clone = new_node;
4330
4331 record_tm_clone_pair (old_decl, new_decl);
4332
4333 if (info->old_node->needed)
4334 ipa_tm_mark_needed_node (new_node);
4335 return false;
4336 }
4337
4338 /* Create a copy of the function (possibly declaration only) of OLD_NODE,
4339 appropriate for the transactional clone. */
4340
4341 static void
4342 ipa_tm_create_version (struct cgraph_node *old_node)
4343 {
4344 tree new_decl, old_decl, tm_name;
4345 struct cgraph_node *new_node;
4346
4347 old_decl = old_node->decl;
4348 new_decl = copy_node (old_decl);
4349
4350 /* DECL_ASSEMBLER_NAME needs to be set before we call
4351 cgraph_copy_node_for_versioning below, because cgraph_node will
4352 fill the assembler_name_hash. */
4353 tm_name = tm_mangle (DECL_ASSEMBLER_NAME (old_decl));
4354 SET_DECL_ASSEMBLER_NAME (new_decl, tm_name);
4355 SET_DECL_RTL (new_decl, NULL);
4356 TREE_SYMBOL_REFERENCED (tm_name) = 1;
4357
4358 /* Perform the same remapping to the comdat group. */
4359 if (DECL_ONE_ONLY (new_decl))
4360 DECL_COMDAT_GROUP (new_decl) = tm_mangle (DECL_COMDAT_GROUP (old_decl));
4361
4362 new_node = cgraph_copy_node_for_versioning (old_node, new_decl, NULL, NULL);
4363 new_node->local.externally_visible = old_node->local.externally_visible;
4364 new_node->lowered = true;
4365 new_node->tm_clone = 1;
4366 get_cg_data (&old_node, true)->clone = new_node;
4367
4368 if (cgraph_function_body_availability (old_node) >= AVAIL_OVERWRITABLE)
4369 {
4370 /* Remap extern inline to static inline. */
4371 /* ??? Is it worth trying to use make_decl_one_only? */
4372 if (DECL_DECLARED_INLINE_P (new_decl) && DECL_EXTERNAL (new_decl))
4373 {
4374 DECL_EXTERNAL (new_decl) = 0;
4375 TREE_PUBLIC (new_decl) = 0;
4376 DECL_WEAK (new_decl) = 0;
4377 }
4378
4379 tree_function_versioning (old_decl, new_decl, NULL, false, NULL, false,
4380 NULL, NULL);
4381 }
4382
4383 record_tm_clone_pair (old_decl, new_decl);
4384
4385 cgraph_call_function_insertion_hooks (new_node);
4386 if (old_node->needed)
4387 ipa_tm_mark_needed_node (new_node);
4388
4389 /* Do the same thing, but for any aliases of the original node. */
4390 {
4391 struct create_version_alias_info data;
4392 data.old_node = old_node;
4393 data.new_decl = new_decl;
4394 cgraph_for_node_and_aliases (old_node, ipa_tm_create_version_alias,
4395 &data, true);
4396 }
4397 }
4398
4399 /* Construct a call to TM_IRREVOCABLE and insert it at the beginning of BB. */
4400
4401 static void
4402 ipa_tm_insert_irr_call (struct cgraph_node *node, struct tm_region *region,
4403 basic_block bb)
4404 {
4405 gimple_stmt_iterator gsi;
4406 gimple g;
4407
4408 transaction_subcode_ior (region, GTMA_MAY_ENTER_IRREVOCABLE);
4409
4410 g = gimple_build_call (builtin_decl_explicit (BUILT_IN_TM_IRREVOCABLE),
4411 1, build_int_cst (NULL_TREE, MODE_SERIALIRREVOCABLE));
4412
4413 split_block_after_labels (bb);
4414 gsi = gsi_after_labels (bb);
4415 gsi_insert_before (&gsi, g, GSI_SAME_STMT);
4416
4417 cgraph_create_edge (node,
4418 cgraph_get_create_node
4419 (builtin_decl_explicit (BUILT_IN_TM_IRREVOCABLE)),
4420 g, 0,
4421 compute_call_stmt_bb_frequency (node->decl,
4422 gimple_bb (g)));
4423 }
4424
4425 /* Construct a call to TM_GETTMCLONE and insert it before GSI. */
4426
4427 static bool
4428 ipa_tm_insert_gettmclone_call (struct cgraph_node *node,
4429 struct tm_region *region,
4430 gimple_stmt_iterator *gsi, gimple stmt)
4431 {
4432 tree gettm_fn, ret, old_fn, callfn;
4433 gimple g, g2;
4434 bool safe;
4435
4436 old_fn = gimple_call_fn (stmt);
4437
4438 if (TREE_CODE (old_fn) == ADDR_EXPR)
4439 {
4440 tree fndecl = TREE_OPERAND (old_fn, 0);
4441 tree clone = get_tm_clone_pair (fndecl);
4442
4443 /* By transforming the call into a TM_GETTMCLONE, we are
4444 technically taking the address of the original function and
4445 its clone. Explain this so inlining will know this function
4446 is needed. */
4447 cgraph_mark_address_taken_node (cgraph_get_node (fndecl));
4448 if (clone)
4449 cgraph_mark_address_taken_node (cgraph_get_node (clone));
4450 }
4451
4452 safe = is_tm_safe (TREE_TYPE (old_fn));
4453 gettm_fn = builtin_decl_explicit (safe ? BUILT_IN_TM_GETTMCLONE_SAFE
4454 : BUILT_IN_TM_GETTMCLONE_IRR);
4455 ret = create_tmp_var (ptr_type_node, NULL);
4456 add_referenced_var (ret);
4457
4458 if (!safe)
4459 transaction_subcode_ior (region, GTMA_MAY_ENTER_IRREVOCABLE);
4460
4461 /* Discard OBJ_TYPE_REF, since we weren't able to fold it. */
4462 if (TREE_CODE (old_fn) == OBJ_TYPE_REF)
4463 old_fn = OBJ_TYPE_REF_EXPR (old_fn);
4464
4465 g = gimple_build_call (gettm_fn, 1, old_fn);
4466 ret = make_ssa_name (ret, g);
4467 gimple_call_set_lhs (g, ret);
4468
4469 gsi_insert_before (gsi, g, GSI_SAME_STMT);
4470
4471 cgraph_create_edge (node, cgraph_get_create_node (gettm_fn), g, 0,
4472 compute_call_stmt_bb_frequency (node->decl,
4473 gimple_bb(g)));
4474
4475 /* Cast return value from tm_gettmclone* into appropriate function
4476 pointer. */
4477 callfn = create_tmp_var (TREE_TYPE (old_fn), NULL);
4478 add_referenced_var (callfn);
4479 g2 = gimple_build_assign (callfn,
4480 fold_build1 (NOP_EXPR, TREE_TYPE (callfn), ret));
4481 callfn = make_ssa_name (callfn, g2);
4482 gimple_assign_set_lhs (g2, callfn);
4483 gsi_insert_before (gsi, g2, GSI_SAME_STMT);
4484
4485 /* ??? This is a hack to preserve the NOTHROW bit on the call,
4486 which we would have derived from the decl. Failure to save
4487 this bit means we might have to split the basic block. */
4488 if (gimple_call_nothrow_p (stmt))
4489 gimple_call_set_nothrow (stmt, true);
4490
4491 gimple_call_set_fn (stmt, callfn);
4492
4493 /* Discarding OBJ_TYPE_REF above may produce incompatible LHS and RHS
4494 for a call statement. Fix it. */
4495 {
4496 tree lhs = gimple_call_lhs (stmt);
4497 tree rettype = TREE_TYPE (gimple_call_fntype (stmt));
4498 if (lhs
4499 && !useless_type_conversion_p (TREE_TYPE (lhs), rettype))
4500 {
4501 tree temp;
4502
4503 temp = make_rename_temp (rettype, 0);
4504 gimple_call_set_lhs (stmt, temp);
4505
4506 g2 = gimple_build_assign (lhs,
4507 fold_build1 (VIEW_CONVERT_EXPR,
4508 TREE_TYPE (lhs), temp));
4509 gsi_insert_after (gsi, g2, GSI_SAME_STMT);
4510 }
4511 }
4512
4513 update_stmt (stmt);
4514
4515 return true;
4516 }
4517
4518 /* Helper function for ipa_tm_transform_calls*. Given a call
4519 statement in GSI which resides inside transaction REGION, redirect
4520 the call to either its wrapper function, or its clone. */
4521
4522 static void
4523 ipa_tm_transform_calls_redirect (struct cgraph_node *node,
4524 struct tm_region *region,
4525 gimple_stmt_iterator *gsi,
4526 bool *need_ssa_rename_p)
4527 {
4528 gimple stmt = gsi_stmt (*gsi);
4529 struct cgraph_node *new_node;
4530 struct cgraph_edge *e = cgraph_edge (node, stmt);
4531 tree fndecl = gimple_call_fndecl (stmt);
4532
4533 /* For indirect calls, pass the address through the runtime. */
4534 if (fndecl == NULL)
4535 {
4536 *need_ssa_rename_p |=
4537 ipa_tm_insert_gettmclone_call (node, region, gsi, stmt);
4538 return;
4539 }
4540
4541 /* Handle some TM builtins. Ordinarily these aren't actually generated
4542 at this point, but handling these functions when written in by the
4543 user makes it easier to build unit tests. */
4544 if (flags_from_decl_or_type (fndecl) & ECF_TM_BUILTIN)
4545 return;
4546
4547 /* Fixup recursive calls inside clones. */
4548 /* ??? Why did cgraph_copy_node_for_versioning update the call edges
4549 for recursion but not update the call statements themselves? */
4550 if (e->caller == e->callee && decl_is_tm_clone (current_function_decl))
4551 {
4552 gimple_call_set_fndecl (stmt, current_function_decl);
4553 return;
4554 }
4555
4556 /* If there is a replacement, use it. */
4557 fndecl = find_tm_replacement_function (fndecl);
4558 if (fndecl)
4559 {
4560 new_node = cgraph_get_create_node (fndecl);
4561
4562 /* ??? Mark all transaction_wrap functions tm_may_enter_irr.
4563
4564 We can't do this earlier in record_tm_replacement because
4565 cgraph_remove_unreachable_nodes is called before we inject
4566 references to the node. Further, we can't do this in some
4567 nice central place in ipa_tm_execute because we don't have
4568 the exact list of wrapper functions that would be used.
4569 Marking more wrappers than necessary results in the creation
4570 of unnecessary cgraph_nodes, which can cause some of the
4571 other IPA passes to crash.
4572
4573 We do need to mark these nodes so that we get the proper
4574 result in expand_call_tm. */
4575 /* ??? This seems broken. How is it that we're marking the
4576 CALLEE as may_enter_irr? Surely we should be marking the
4577 CALLER. Also note that find_tm_replacement_function also
4578 contains mappings into the TM runtime, e.g. memcpy. These
4579 we know won't go irrevocable. */
4580 new_node->local.tm_may_enter_irr = 1;
4581 }
4582 else
4583 {
4584 struct tm_ipa_cg_data *d;
4585 struct cgraph_node *tnode = e->callee;
4586
4587 d = get_cg_data (&tnode, true);
4588 new_node = d->clone;
4589
4590 /* As we've already skipped pure calls and appropriate builtins,
4591 and we've already marked irrevocable blocks, if we can't come
4592 up with a static replacement, then ask the runtime. */
4593 if (new_node == NULL)
4594 {
4595 *need_ssa_rename_p |=
4596 ipa_tm_insert_gettmclone_call (node, region, gsi, stmt);
4597 return;
4598 }
4599
4600 fndecl = new_node->decl;
4601 }
4602
4603 cgraph_redirect_edge_callee (e, new_node);
4604 gimple_call_set_fndecl (stmt, fndecl);
4605 }
4606
4607 /* Helper function for ipa_tm_transform_calls. For a given BB,
4608 install calls to tm_irrevocable when IRR_BLOCKS are reached,
4609 redirect other calls to the generated transactional clone. */
4610
4611 static bool
4612 ipa_tm_transform_calls_1 (struct cgraph_node *node, struct tm_region *region,
4613 basic_block bb, bitmap irr_blocks)
4614 {
4615 gimple_stmt_iterator gsi;
4616 bool need_ssa_rename = false;
4617
4618 if (irr_blocks && bitmap_bit_p (irr_blocks, bb->index))
4619 {
4620 ipa_tm_insert_irr_call (node, region, bb);
4621 return true;
4622 }
4623
4624 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4625 {
4626 gimple stmt = gsi_stmt (gsi);
4627
4628 if (!is_gimple_call (stmt))
4629 continue;
4630 if (is_tm_pure_call (stmt))
4631 continue;
4632
4633 /* Redirect edges to the appropriate replacement or clone. */
4634 ipa_tm_transform_calls_redirect (node, region, &gsi, &need_ssa_rename);
4635 }
4636
4637 return need_ssa_rename;
4638 }
4639
4640 /* Walk the CFG for REGION, beginning at BB. Install calls to
4641 tm_irrevocable when IRR_BLOCKS are reached, redirect other calls to
4642 the generated transactional clone. */
4643
4644 static bool
4645 ipa_tm_transform_calls (struct cgraph_node *node, struct tm_region *region,
4646 basic_block bb, bitmap irr_blocks)
4647 {
4648 bool need_ssa_rename = false;
4649 edge e;
4650 edge_iterator ei;
4651 VEC(basic_block, heap) *queue = NULL;
4652 bitmap visited_blocks = BITMAP_ALLOC (NULL);
4653
4654 VEC_safe_push (basic_block, heap, queue, bb);
4655 do
4656 {
4657 bb = VEC_pop (basic_block, queue);
4658
4659 need_ssa_rename |=
4660 ipa_tm_transform_calls_1 (node, region, bb, irr_blocks);
4661
4662 if (irr_blocks && bitmap_bit_p (irr_blocks, bb->index))
4663 continue;
4664
4665 if (region && bitmap_bit_p (region->exit_blocks, bb->index))
4666 continue;
4667
4668 FOR_EACH_EDGE (e, ei, bb->succs)
4669 if (!bitmap_bit_p (visited_blocks, e->dest->index))
4670 {
4671 bitmap_set_bit (visited_blocks, e->dest->index);
4672 VEC_safe_push (basic_block, heap, queue, e->dest);
4673 }
4674 }
4675 while (!VEC_empty (basic_block, queue));
4676
4677 VEC_free (basic_block, heap, queue);
4678 BITMAP_FREE (visited_blocks);
4679
4680 return need_ssa_rename;
4681 }
4682
4683 /* Transform the calls within the TM regions within NODE. */
4684
4685 static void
4686 ipa_tm_transform_transaction (struct cgraph_node *node)
4687 {
4688 struct tm_ipa_cg_data *d;
4689 struct tm_region *region;
4690 bool need_ssa_rename = false;
4691
4692 d = get_cg_data (&node, true);
4693
4694 current_function_decl = node->decl;
4695 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
4696 calculate_dominance_info (CDI_DOMINATORS);
4697
4698 for (region = d->all_tm_regions; region; region = region->next)
4699 {
4700 /* If we're sure to go irrevocable, don't transform anything. */
4701 if (d->irrevocable_blocks_normal
4702 && bitmap_bit_p (d->irrevocable_blocks_normal,
4703 region->entry_block->index))
4704 {
4705 transaction_subcode_ior (region, GTMA_DOES_GO_IRREVOCABLE);
4706 transaction_subcode_ior (region, GTMA_MAY_ENTER_IRREVOCABLE);
4707 continue;
4708 }
4709
4710 need_ssa_rename |=
4711 ipa_tm_transform_calls (node, region, region->entry_block,
4712 d->irrevocable_blocks_normal);
4713 }
4714
4715 if (need_ssa_rename)
4716 update_ssa (TODO_update_ssa_only_virtuals);
4717
4718 pop_cfun ();
4719 current_function_decl = NULL;
4720 }
4721
4722 /* Transform the calls within the transactional clone of NODE. */
4723
4724 static void
4725 ipa_tm_transform_clone (struct cgraph_node *node)
4726 {
4727 struct tm_ipa_cg_data *d;
4728 bool need_ssa_rename;
4729
4730 d = get_cg_data (&node, true);
4731
4732 /* If this function makes no calls and has no irrevocable blocks,
4733 then there's nothing to do. */
4734 /* ??? Remove non-aborting top-level transactions. */
4735 if (!node->callees && !d->irrevocable_blocks_clone)
4736 return;
4737
4738 current_function_decl = d->clone->decl;
4739 push_cfun (DECL_STRUCT_FUNCTION (current_function_decl));
4740 calculate_dominance_info (CDI_DOMINATORS);
4741
4742 need_ssa_rename =
4743 ipa_tm_transform_calls (d->clone, NULL, single_succ (ENTRY_BLOCK_PTR),
4744 d->irrevocable_blocks_clone);
4745
4746 if (need_ssa_rename)
4747 update_ssa (TODO_update_ssa_only_virtuals);
4748
4749 pop_cfun ();
4750 current_function_decl = NULL;
4751 }
4752
4753 /* Main entry point for the transactional memory IPA pass. */
4754
4755 static unsigned int
4756 ipa_tm_execute (void)
4757 {
4758 cgraph_node_queue tm_callees = NULL;
4759 /* List of functions that will go irrevocable. */
4760 cgraph_node_queue irr_worklist = NULL;
4761
4762 struct cgraph_node *node;
4763 struct tm_ipa_cg_data *d;
4764 enum availability a;
4765 unsigned int i;
4766
4767 #ifdef ENABLE_CHECKING
4768 verify_cgraph ();
4769 #endif
4770
4771 bitmap_obstack_initialize (&tm_obstack);
4772
4773 /* For all local functions marked tm_callable, queue them. */
4774 for (node = cgraph_nodes; node; node = node->next)
4775 if (is_tm_callable (node->decl)
4776 && cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE)
4777 {
4778 d = get_cg_data (&node, true);
4779 maybe_push_queue (node, &tm_callees, &d->in_callee_queue);
4780 }
4781
4782 /* For all local reachable functions... */
4783 for (node = cgraph_nodes; node; node = node->next)
4784 if (node->reachable && node->lowered
4785 && cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE)
4786 {
4787 /* ... marked tm_pure, record that fact for the runtime by
4788 indicating that the pure function is its own tm_callable.
4789 No need to do this if the function's address can't be taken. */
4790 if (is_tm_pure (node->decl))
4791 {
4792 if (!node->local.local)
4793 record_tm_clone_pair (node->decl, node->decl);
4794 continue;
4795 }
4796
4797 current_function_decl = node->decl;
4798 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
4799 calculate_dominance_info (CDI_DOMINATORS);
4800
4801 tm_region_init (NULL);
4802 if (all_tm_regions)
4803 {
4804 d = get_cg_data (&node, true);
4805
4806 /* Scan for calls that are in each transaction. */
4807 ipa_tm_scan_calls_transaction (d, &tm_callees);
4808
4809 /* Put it in the worklist so we can scan the function
4810 later (ipa_tm_scan_irr_function) and mark the
4811 irrevocable blocks. */
4812 maybe_push_queue (node, &irr_worklist, &d->in_worklist);
4813 d->want_irr_scan_normal = true;
4814 }
4815
4816 pop_cfun ();
4817 current_function_decl = NULL;
4818 }
4819
4820 /* For every local function on the callee list, scan as if we will be
4821 creating a transactional clone, queueing all new functions we find
4822 along the way. */
4823 for (i = 0; i < VEC_length (cgraph_node_p, tm_callees); ++i)
4824 {
4825 node = VEC_index (cgraph_node_p, tm_callees, i);
4826 a = cgraph_function_body_availability (node);
4827 d = get_cg_data (&node, true);
4828
4829 /* Put it in the worklist so we can scan the function later
4830 (ipa_tm_scan_irr_function) and mark the irrevocable
4831 blocks. */
4832 maybe_push_queue (node, &irr_worklist, &d->in_worklist);
4833
4834 /* Some callees cannot be arbitrarily cloned. These will always be
4835 irrevocable. Mark these now, so that we need not scan them. */
4836 if (is_tm_irrevocable (node->decl))
4837 ipa_tm_note_irrevocable (node, &irr_worklist);
4838 else if (a <= AVAIL_NOT_AVAILABLE
4839 && !is_tm_safe_or_pure (node->decl))
4840 ipa_tm_note_irrevocable (node, &irr_worklist);
4841 else if (a >= AVAIL_OVERWRITABLE)
4842 {
4843 if (!tree_versionable_function_p (node->decl))
4844 ipa_tm_note_irrevocable (node, &irr_worklist);
4845 else if (!d->is_irrevocable)
4846 {
4847 /* If this is an alias, make sure its base is queued as well.
4848 we need not scan the callees now, as the base will do. */
4849 if (node->alias)
4850 {
4851 node = cgraph_get_node (node->thunk.alias);
4852 d = get_cg_data (&node, true);
4853 maybe_push_queue (node, &tm_callees, &d->in_callee_queue);
4854 continue;
4855 }
4856
4857 /* Add all nodes called by this function into
4858 tm_callees as well. */
4859 ipa_tm_scan_calls_clone (node, &tm_callees);
4860 }
4861 }
4862 }
4863
4864 /* Iterate scans until no more work to be done. Prefer not to use
4865 VEC_pop because the worklist tends to follow a breadth-first
4866 search of the callgraph, which should allow convergance with a
4867 minimum number of scans. But we also don't want the worklist
4868 array to grow without bound, so we shift the array up periodically. */
4869 for (i = 0; i < VEC_length (cgraph_node_p, irr_worklist); ++i)
4870 {
4871 if (i > 256 && i == VEC_length (cgraph_node_p, irr_worklist) / 8)
4872 {
4873 VEC_block_remove (cgraph_node_p, irr_worklist, 0, i);
4874 i = 0;
4875 }
4876
4877 node = VEC_index (cgraph_node_p, irr_worklist, i);
4878 d = get_cg_data (&node, true);
4879 d->in_worklist = false;
4880
4881 if (d->want_irr_scan_normal)
4882 {
4883 d->want_irr_scan_normal = false;
4884 ipa_tm_scan_irr_function (node, false);
4885 }
4886 if (d->in_callee_queue && ipa_tm_scan_irr_function (node, true))
4887 ipa_tm_note_irrevocable (node, &irr_worklist);
4888 }
4889
4890 /* For every function on the callee list, collect the tm_may_enter_irr
4891 bit on the node. */
4892 VEC_truncate (cgraph_node_p, irr_worklist, 0);
4893 for (i = 0; i < VEC_length (cgraph_node_p, tm_callees); ++i)
4894 {
4895 node = VEC_index (cgraph_node_p, tm_callees, i);
4896 if (ipa_tm_mayenterirr_function (node))
4897 {
4898 d = get_cg_data (&node, true);
4899 gcc_assert (d->in_worklist == false);
4900 maybe_push_queue (node, &irr_worklist, &d->in_worklist);
4901 }
4902 }
4903
4904 /* Propagate the tm_may_enter_irr bit to callers until stable. */
4905 for (i = 0; i < VEC_length (cgraph_node_p, irr_worklist); ++i)
4906 {
4907 struct cgraph_node *caller;
4908 struct cgraph_edge *e;
4909 struct ipa_ref *ref;
4910 unsigned j;
4911
4912 if (i > 256 && i == VEC_length (cgraph_node_p, irr_worklist) / 8)
4913 {
4914 VEC_block_remove (cgraph_node_p, irr_worklist, 0, i);
4915 i = 0;
4916 }
4917
4918 node = VEC_index (cgraph_node_p, irr_worklist, i);
4919 d = get_cg_data (&node, true);
4920 d->in_worklist = false;
4921 node->local.tm_may_enter_irr = true;
4922
4923 /* Propagate back to normal callers. */
4924 for (e = node->callers; e ; e = e->next_caller)
4925 {
4926 caller = e->caller;
4927 if (!is_tm_safe_or_pure (caller->decl)
4928 && !caller->local.tm_may_enter_irr)
4929 {
4930 d = get_cg_data (&caller, true);
4931 maybe_push_queue (caller, &irr_worklist, &d->in_worklist);
4932 }
4933 }
4934
4935 /* Propagate back to referring aliases as well. */
4936 for (j = 0; ipa_ref_list_refering_iterate (&node->ref_list, j, ref); j++)
4937 {
4938 caller = ref->refering.cgraph_node;
4939 if (ref->use == IPA_REF_ALIAS
4940 && !caller->local.tm_may_enter_irr)
4941 {
4942 /* ?? Do not traverse aliases here. */
4943 d = get_cg_data (&caller, false);
4944 maybe_push_queue (caller, &irr_worklist, &d->in_worklist);
4945 }
4946 }
4947 }
4948
4949 /* Now validate all tm_safe functions, and all atomic regions in
4950 other functions. */
4951 for (node = cgraph_nodes; node; node = node->next)
4952 if (node->reachable && node->lowered
4953 && cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE)
4954 {
4955 d = get_cg_data (&node, true);
4956 if (is_tm_safe (node->decl))
4957 ipa_tm_diagnose_tm_safe (node);
4958 else if (d->all_tm_regions)
4959 ipa_tm_diagnose_transaction (node, d->all_tm_regions);
4960 }
4961
4962 /* Create clones. Do those that are not irrevocable and have a
4963 positive call count. Do those publicly visible functions that
4964 the user directed us to clone. */
4965 for (i = 0; i < VEC_length (cgraph_node_p, tm_callees); ++i)
4966 {
4967 bool doit = false;
4968
4969 node = VEC_index (cgraph_node_p, tm_callees, i);
4970 if (node->same_body_alias)
4971 continue;
4972
4973 a = cgraph_function_body_availability (node);
4974 d = get_cg_data (&node, true);
4975
4976 if (a <= AVAIL_NOT_AVAILABLE)
4977 doit = is_tm_callable (node->decl);
4978 else if (a <= AVAIL_AVAILABLE && is_tm_callable (node->decl))
4979 doit = true;
4980 else if (!d->is_irrevocable
4981 && d->tm_callers_normal + d->tm_callers_clone > 0)
4982 doit = true;
4983
4984 if (doit)
4985 ipa_tm_create_version (node);
4986 }
4987
4988 /* Redirect calls to the new clones, and insert irrevocable marks. */
4989 for (i = 0; i < VEC_length (cgraph_node_p, tm_callees); ++i)
4990 {
4991 node = VEC_index (cgraph_node_p, tm_callees, i);
4992 if (node->analyzed)
4993 {
4994 d = get_cg_data (&node, true);
4995 if (d->clone)
4996 ipa_tm_transform_clone (node);
4997 }
4998 }
4999 for (node = cgraph_nodes; node; node = node->next)
5000 if (node->reachable && node->lowered
5001 && cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE)
5002 {
5003 d = get_cg_data (&node, true);
5004 if (d->all_tm_regions)
5005 ipa_tm_transform_transaction (node);
5006 }
5007
5008 /* Free and clear all data structures. */
5009 VEC_free (cgraph_node_p, heap, tm_callees);
5010 VEC_free (cgraph_node_p, heap, irr_worklist);
5011 bitmap_obstack_release (&tm_obstack);
5012
5013 for (node = cgraph_nodes; node; node = node->next)
5014 node->aux = NULL;
5015
5016 #ifdef ENABLE_CHECKING
5017 verify_cgraph ();
5018 #endif
5019
5020 return 0;
5021 }
5022
5023 struct simple_ipa_opt_pass pass_ipa_tm =
5024 {
5025 {
5026 SIMPLE_IPA_PASS,
5027 "tmipa", /* name */
5028 gate_tm, /* gate */
5029 ipa_tm_execute, /* execute */
5030 NULL, /* sub */
5031 NULL, /* next */
5032 0, /* static_pass_number */
5033 TV_TRANS_MEM, /* tv_id */
5034 PROP_ssa | PROP_cfg, /* properties_required */
5035 0, /* properties_provided */
5036 0, /* properties_destroyed */
5037 0, /* todo_flags_start */
5038 TODO_dump_func, /* todo_flags_finish */
5039 },
5040 };
5041
5042 #include "gt-trans-mem.h"