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