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