1 1.1 mrg /* Callgraph based analysis of static variables. 2 1.1 mrg Copyright (C) 2004-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Kenneth Zadeck <zadeck (at) naturalbridge.com> 4 1.1 mrg 5 1.1 mrg This file is part of GCC. 6 1.1 mrg 7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 8 1.1 mrg the terms of the GNU General Public License as published by the Free 9 1.1 mrg Software Foundation; either version 3, or (at your option) any later 10 1.1 mrg version. 11 1.1 mrg 12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 1.1 mrg for more details. 16 1.1 mrg 17 1.1 mrg You should have received a copy of the GNU General Public License 18 1.1 mrg along with GCC; see the file COPYING3. If not see 19 1.1 mrg <http://www.gnu.org/licenses/>. */ 20 1.1 mrg 21 1.1 mrg /* This file marks functions as being either const (TREE_READONLY) or 22 1.1 mrg pure (DECL_PURE_P). It can also set a variant of these that 23 1.1 mrg are allowed to loop indefinitely (DECL_LOOPING_CONST_PURE_P). 24 1.1 mrg 25 1.1 mrg This must be run after inlining decisions have been made since 26 1.1 mrg otherwise, the local sets will not contain information that is 27 1.1 mrg consistent with post inlined state. The global sets are not prone 28 1.1 mrg to this problem since they are by definition transitive. */ 29 1.1 mrg 30 1.1 mrg /* The code in this module is called by the ipa pass manager. It 31 1.1 mrg should be one of the later passes since it's information is used by 32 1.1 mrg the rest of the compilation. */ 33 1.1 mrg 34 1.1 mrg #include "config.h" 35 1.1 mrg #include "system.h" 36 1.1 mrg #include "coretypes.h" 37 1.1 mrg #include "backend.h" 38 1.1 mrg #include "target.h" 39 1.1 mrg #include "tree.h" 40 1.1 mrg #include "gimple.h" 41 1.1 mrg #include "tree-pass.h" 42 1.1 mrg #include "tree-streamer.h" 43 1.1 mrg #include "cgraph.h" 44 1.1 mrg #include "diagnostic.h" 45 1.1 mrg #include "calls.h" 46 1.1 mrg #include "cfganal.h" 47 1.1 mrg #include "tree-eh.h" 48 1.1 mrg #include "gimple-iterator.h" 49 1.1 mrg #include "gimple-walk.h" 50 1.1 mrg #include "tree-cfg.h" 51 1.1 mrg #include "tree-ssa-loop-niter.h" 52 1.1 mrg #include "langhooks.h" 53 1.1 mrg #include "ipa-utils.h" 54 1.1 mrg #include "gimple-pretty-print.h" 55 1.1 mrg #include "cfgloop.h" 56 1.1 mrg #include "tree-scalar-evolution.h" 57 1.1 mrg #include "intl.h" 58 1.1 mrg #include "opts.h" 59 1.1 mrg #include "ssa.h" 60 1.1 mrg #include "alloc-pool.h" 61 1.1 mrg #include "symbol-summary.h" 62 1.1 mrg #include "ipa-prop.h" 63 1.1 mrg #include "ipa-fnsummary.h" 64 1.1 mrg #include "symtab-thunks.h" 65 1.1 mrg #include "dbgcnt.h" 66 1.1 mrg 67 1.1 mrg /* Lattice values for const and pure functions. Everything starts out 68 1.1 mrg being const, then may drop to pure and then neither depending on 69 1.1 mrg what is found. */ 70 1.1 mrg enum pure_const_state_e 71 1.1 mrg { 72 1.1 mrg IPA_CONST, 73 1.1 mrg IPA_PURE, 74 1.1 mrg IPA_NEITHER 75 1.1 mrg }; 76 1.1 mrg 77 1.1 mrg static const char *pure_const_names[3] = {"const", "pure", "neither"}; 78 1.1 mrg 79 1.1 mrg enum malloc_state_e 80 1.1 mrg { 81 1.1 mrg STATE_MALLOC_TOP, 82 1.1 mrg STATE_MALLOC, 83 1.1 mrg STATE_MALLOC_BOTTOM 84 1.1 mrg }; 85 1.1 mrg 86 1.1 mrg static const char *malloc_state_names[] = {"malloc_top", "malloc", "malloc_bottom"}; 87 1.1 mrg 88 1.1 mrg /* Holder for the const_state. There is one of these per function 89 1.1 mrg decl. */ 90 1.1 mrg class funct_state_d 91 1.1 mrg { 92 1.1 mrg public: 93 1.1 mrg funct_state_d (): pure_const_state (IPA_NEITHER), 94 1.1 mrg state_previously_known (IPA_NEITHER), looping_previously_known (true), 95 1.1 mrg looping (true), can_throw (true), can_free (true), 96 1.1 mrg malloc_state (STATE_MALLOC_BOTTOM) {} 97 1.1 mrg 98 1.1 mrg funct_state_d (const funct_state_d &s): pure_const_state (s.pure_const_state), 99 1.1 mrg state_previously_known (s.state_previously_known), 100 1.1 mrg looping_previously_known (s.looping_previously_known), 101 1.1 mrg looping (s.looping), can_throw (s.can_throw), can_free (s.can_free), 102 1.1 mrg malloc_state (s.malloc_state) {} 103 1.1 mrg 104 1.1 mrg /* See above. */ 105 1.1 mrg enum pure_const_state_e pure_const_state; 106 1.1 mrg /* What user set here; we can be always sure about this. */ 107 1.1 mrg enum pure_const_state_e state_previously_known; 108 1.1 mrg bool looping_previously_known; 109 1.1 mrg 110 1.1 mrg /* True if the function could possibly infinite loop. There are a 111 1.1 mrg lot of ways that this could be determined. We are pretty 112 1.1 mrg conservative here. While it is possible to cse pure and const 113 1.1 mrg calls, it is not legal to have dce get rid of the call if there 114 1.1 mrg is a possibility that the call could infinite loop since this is 115 1.1 mrg a behavioral change. */ 116 1.1 mrg bool looping; 117 1.1 mrg 118 1.1 mrg bool can_throw; 119 1.1 mrg 120 1.1 mrg /* If function can call free, munmap or otherwise make previously 121 1.1 mrg non-trapping memory accesses trapping. */ 122 1.1 mrg bool can_free; 123 1.1 mrg 124 1.1 mrg enum malloc_state_e malloc_state; 125 1.1 mrg }; 126 1.1 mrg 127 1.1 mrg typedef class funct_state_d * funct_state; 128 1.1 mrg 129 1.1 mrg /* The storage of the funct_state is abstracted because there is the 130 1.1 mrg possibility that it may be desirable to move this to the cgraph 131 1.1 mrg local info. */ 132 1.1 mrg 133 1.1 mrg class funct_state_summary_t: 134 1.1 mrg public fast_function_summary <funct_state_d *, va_heap> 135 1.1 mrg { 136 1.1 mrg public: 137 1.1 mrg funct_state_summary_t (symbol_table *symtab): 138 1.1 mrg fast_function_summary <funct_state_d *, va_heap> (symtab) {} 139 1.1 mrg 140 1.1 mrg virtual void insert (cgraph_node *, funct_state_d *state); 141 1.1 mrg virtual void duplicate (cgraph_node *src_node, cgraph_node *dst_node, 142 1.1 mrg funct_state_d *src_data, 143 1.1 mrg funct_state_d *dst_data); 144 1.1 mrg }; 145 1.1 mrg 146 1.1 mrg static funct_state_summary_t *funct_state_summaries = NULL; 147 1.1 mrg 148 1.1 mrg static bool gate_pure_const (void); 149 1.1 mrg 150 1.1 mrg namespace { 151 1.1 mrg 152 1.1 mrg const pass_data pass_data_ipa_pure_const = 153 1.1 mrg { 154 1.1 mrg IPA_PASS, /* type */ 155 1.1 mrg "pure-const", /* name */ 156 1.1 mrg OPTGROUP_NONE, /* optinfo_flags */ 157 1.1 mrg TV_IPA_PURE_CONST, /* tv_id */ 158 1.1 mrg 0, /* properties_required */ 159 1.1 mrg 0, /* properties_provided */ 160 1.1 mrg 0, /* properties_destroyed */ 161 1.1 mrg 0, /* todo_flags_start */ 162 1.1 mrg 0, /* todo_flags_finish */ 163 1.1 mrg }; 164 1.1 mrg 165 1.1 mrg class pass_ipa_pure_const : public ipa_opt_pass_d 166 1.1 mrg { 167 1.1 mrg public: 168 1.1 mrg pass_ipa_pure_const(gcc::context *ctxt); 169 1.1 mrg 170 1.1 mrg /* opt_pass methods: */ 171 1.1 mrg bool gate (function *) { return gate_pure_const (); } 172 1.1 mrg unsigned int execute (function *fun); 173 1.1 mrg 174 1.1 mrg void register_hooks (void); 175 1.1 mrg 176 1.1 mrg private: 177 1.1 mrg bool init_p; 178 1.1 mrg }; // class pass_ipa_pure_const 179 1.1 mrg 180 1.1 mrg } // anon namespace 181 1.1 mrg 182 1.1 mrg /* Try to guess if function body will always be visible to compiler 183 1.1 mrg when compiling the call and whether compiler will be able 184 1.1 mrg to propagate the information by itself. */ 185 1.1 mrg 186 1.1 mrg static bool 187 1.1 mrg function_always_visible_to_compiler_p (tree decl) 188 1.1 mrg { 189 1.1 mrg return (!TREE_PUBLIC (decl) || DECL_DECLARED_INLINE_P (decl) 190 1.1 mrg || DECL_COMDAT (decl)); 191 1.1 mrg } 192 1.1 mrg 193 1.1 mrg /* Emit suggestion about attribute ATTRIB_NAME for DECL. KNOWN_FINITE 194 1.1 mrg is true if the function is known to be finite. The diagnostic is 195 1.1 mrg controlled by OPTION. WARNED_ABOUT is a hash_set<tree> unique for 196 1.1 mrg OPTION, this function may initialize it and it is always returned 197 1.1 mrg by the function. */ 198 1.1 mrg 199 1.1 mrg static hash_set<tree> * 200 1.1 mrg suggest_attribute (int option, tree decl, bool known_finite, 201 1.1 mrg hash_set<tree> *warned_about, 202 1.1 mrg const char * attrib_name) 203 1.1 mrg { 204 1.1 mrg if (!option_enabled (option, lang_hooks.option_lang_mask (), &global_options)) 205 1.1 mrg return warned_about; 206 1.1 mrg if (TREE_THIS_VOLATILE (decl) 207 1.1 mrg || (known_finite && function_always_visible_to_compiler_p (decl))) 208 1.1 mrg return warned_about; 209 1.1 mrg 210 1.1 mrg if (!warned_about) 211 1.1 mrg warned_about = new hash_set<tree>; 212 1.1 mrg if (warned_about->contains (decl)) 213 1.1 mrg return warned_about; 214 1.1 mrg warned_about->add (decl); 215 1.1 mrg warning_at (DECL_SOURCE_LOCATION (decl), 216 1.1 mrg option, 217 1.1 mrg known_finite 218 1.1 mrg ? G_("function might be candidate for attribute %qs") 219 1.1 mrg : G_("function might be candidate for attribute %qs" 220 1.1 mrg " if it is known to return normally"), attrib_name); 221 1.1 mrg return warned_about; 222 1.1 mrg } 223 1.1 mrg 224 1.1 mrg /* Emit suggestion about __attribute_((pure)) for DECL. KNOWN_FINITE 225 1.1 mrg is true if the function is known to be finite. */ 226 1.1 mrg 227 1.1 mrg static void 228 1.1 mrg warn_function_pure (tree decl, bool known_finite) 229 1.1 mrg { 230 1.1 mrg /* Declaring a void function pure makes no sense and is diagnosed 231 1.1 mrg by -Wattributes because calling it would have no effect. */ 232 1.1 mrg if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) 233 1.1 mrg return; 234 1.1 mrg 235 1.1 mrg static hash_set<tree> *warned_about; 236 1.1 mrg warned_about 237 1.1 mrg = suggest_attribute (OPT_Wsuggest_attribute_pure, decl, 238 1.1 mrg known_finite, warned_about, "pure"); 239 1.1 mrg } 240 1.1 mrg 241 1.1 mrg /* Emit suggestion about __attribute_((const)) for DECL. KNOWN_FINITE 242 1.1 mrg is true if the function is known to be finite. */ 243 1.1 mrg 244 1.1 mrg static void 245 1.1 mrg warn_function_const (tree decl, bool known_finite) 246 1.1 mrg { 247 1.1 mrg /* Declaring a void function const makes no sense is diagnosed 248 1.1 mrg by -Wattributes because calling it would have no effect. */ 249 1.1 mrg if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) 250 1.1 mrg return; 251 1.1 mrg 252 1.1 mrg static hash_set<tree> *warned_about; 253 1.1 mrg warned_about 254 1.1 mrg = suggest_attribute (OPT_Wsuggest_attribute_const, decl, 255 1.1 mrg known_finite, warned_about, "const"); 256 1.1 mrg } 257 1.1 mrg 258 1.1 mrg /* Emit suggestion about __attribute__((malloc)) for DECL. */ 259 1.1 mrg 260 1.1 mrg static void 261 1.1 mrg warn_function_malloc (tree decl) 262 1.1 mrg { 263 1.1 mrg static hash_set<tree> *warned_about; 264 1.1 mrg warned_about 265 1.1 mrg = suggest_attribute (OPT_Wsuggest_attribute_malloc, decl, 266 1.1 mrg true, warned_about, "malloc"); 267 1.1 mrg } 268 1.1 mrg 269 1.1 mrg /* Emit suggestion about __attribute__((noreturn)) for DECL. */ 270 1.1 mrg 271 1.1 mrg static void 272 1.1 mrg warn_function_noreturn (tree decl) 273 1.1 mrg { 274 1.1 mrg tree original_decl = decl; 275 1.1 mrg 276 1.1 mrg static hash_set<tree> *warned_about; 277 1.1 mrg if (!lang_hooks.missing_noreturn_ok_p (decl) 278 1.1 mrg && targetm.warn_func_return (decl)) 279 1.1 mrg warned_about 280 1.1 mrg = suggest_attribute (OPT_Wsuggest_attribute_noreturn, original_decl, 281 1.1 mrg true, warned_about, "noreturn"); 282 1.1 mrg } 283 1.1 mrg 284 1.1 mrg void 285 1.1 mrg warn_function_cold (tree decl) 286 1.1 mrg { 287 1.1 mrg tree original_decl = decl; 288 1.1 mrg 289 1.1 mrg static hash_set<tree> *warned_about; 290 1.1 mrg warned_about 291 1.1 mrg = suggest_attribute (OPT_Wsuggest_attribute_cold, original_decl, 292 1.1 mrg true, warned_about, "cold"); 293 1.1 mrg } 294 1.1 mrg 295 1.1 mrg /* Check to see if the use (or definition when CHECKING_WRITE is true) 296 1.1 mrg variable T is legal in a function that is either pure or const. */ 297 1.1 mrg 298 1.1 mrg static inline void 299 1.1 mrg check_decl (funct_state local, 300 1.1 mrg tree t, bool checking_write, bool ipa) 301 1.1 mrg { 302 1.1 mrg /* Do not want to do anything with volatile except mark any 303 1.1 mrg function that uses one to be not const or pure. */ 304 1.1 mrg if (TREE_THIS_VOLATILE (t)) 305 1.1 mrg { 306 1.1 mrg local->pure_const_state = IPA_NEITHER; 307 1.1 mrg if (dump_file) 308 1.1 mrg fprintf (dump_file, " Volatile operand is not const/pure\n"); 309 1.1 mrg return; 310 1.1 mrg } 311 1.1 mrg 312 1.1 mrg /* Do not care about a local automatic that is not static. */ 313 1.1 mrg if (!TREE_STATIC (t) && !DECL_EXTERNAL (t)) 314 1.1 mrg return; 315 1.1 mrg 316 1.1 mrg /* If the variable has the "used" attribute, treat it as if it had a 317 1.1 mrg been touched by the devil. */ 318 1.1 mrg if (DECL_PRESERVE_P (t)) 319 1.1 mrg { 320 1.1 mrg local->pure_const_state = IPA_NEITHER; 321 1.1 mrg if (dump_file) 322 1.1 mrg fprintf (dump_file, " Used static/global variable is not const/pure\n"); 323 1.1 mrg return; 324 1.1 mrg } 325 1.1 mrg 326 1.1 mrg /* In IPA mode we are not interested in checking actual loads and stores; 327 1.1 mrg they will be processed at propagation time using ipa_ref. */ 328 1.1 mrg if (ipa) 329 1.1 mrg return; 330 1.1 mrg 331 1.1 mrg /* Since we have dealt with the locals and params cases above, if we 332 1.1 mrg are CHECKING_WRITE, this cannot be a pure or constant 333 1.1 mrg function. */ 334 1.1 mrg if (checking_write) 335 1.1 mrg { 336 1.1 mrg local->pure_const_state = IPA_NEITHER; 337 1.1 mrg if (dump_file) 338 1.1 mrg fprintf (dump_file, " static/global memory write is not const/pure\n"); 339 1.1 mrg return; 340 1.1 mrg } 341 1.1 mrg 342 1.1 mrg if (DECL_EXTERNAL (t) || TREE_PUBLIC (t)) 343 1.1 mrg { 344 1.1 mrg /* Readonly reads are safe. */ 345 1.1 mrg if (TREE_READONLY (t)) 346 1.1 mrg return; /* Read of a constant, do not change the function state. */ 347 1.1 mrg else 348 1.1 mrg { 349 1.1 mrg if (dump_file) 350 1.1 mrg fprintf (dump_file, " global memory read is not const\n"); 351 1.1 mrg /* Just a regular read. */ 352 1.1 mrg if (local->pure_const_state == IPA_CONST) 353 1.1 mrg local->pure_const_state = IPA_PURE; 354 1.1 mrg } 355 1.1 mrg } 356 1.1 mrg else 357 1.1 mrg { 358 1.1 mrg /* Compilation level statics can be read if they are readonly 359 1.1 mrg variables. */ 360 1.1 mrg if (TREE_READONLY (t)) 361 1.1 mrg return; 362 1.1 mrg 363 1.1 mrg if (dump_file) 364 1.1 mrg fprintf (dump_file, " static memory read is not const\n"); 365 1.1 mrg /* Just a regular read. */ 366 1.1 mrg if (local->pure_const_state == IPA_CONST) 367 1.1 mrg local->pure_const_state = IPA_PURE; 368 1.1 mrg } 369 1.1 mrg } 370 1.1 mrg 371 1.1 mrg 372 1.1 mrg /* Check to see if the use (or definition when CHECKING_WRITE is true) 373 1.1 mrg variable T is legal in a function that is either pure or const. */ 374 1.1 mrg 375 1.1 mrg static inline void 376 1.1 mrg check_op (funct_state local, tree t, bool checking_write) 377 1.1 mrg { 378 1.1 mrg t = get_base_address (t); 379 1.1 mrg if (t && TREE_THIS_VOLATILE (t)) 380 1.1 mrg { 381 1.1 mrg local->pure_const_state = IPA_NEITHER; 382 1.1 mrg if (dump_file) 383 1.1 mrg fprintf (dump_file, " Volatile indirect ref is not const/pure\n"); 384 1.1 mrg return; 385 1.1 mrg } 386 1.1 mrg else if (refs_local_or_readonly_memory_p (t)) 387 1.1 mrg { 388 1.1 mrg if (dump_file) 389 1.1 mrg fprintf (dump_file, " Indirect ref to local or readonly " 390 1.1 mrg "memory is OK\n"); 391 1.1 mrg return; 392 1.1 mrg } 393 1.1 mrg else if (checking_write) 394 1.1 mrg { 395 1.1 mrg local->pure_const_state = IPA_NEITHER; 396 1.1 mrg if (dump_file) 397 1.1 mrg fprintf (dump_file, " Indirect ref write is not const/pure\n"); 398 1.1 mrg return; 399 1.1 mrg } 400 1.1 mrg else 401 1.1 mrg { 402 1.1 mrg if (dump_file) 403 1.1 mrg fprintf (dump_file, " Indirect ref read is not const\n"); 404 1.1 mrg if (local->pure_const_state == IPA_CONST) 405 1.1 mrg local->pure_const_state = IPA_PURE; 406 1.1 mrg } 407 1.1 mrg } 408 1.1 mrg 409 1.1 mrg /* compute state based on ECF FLAGS and store to STATE and LOOPING. */ 410 1.1 mrg 411 1.1 mrg static void 412 1.1 mrg state_from_flags (enum pure_const_state_e *state, bool *looping, 413 1.1 mrg int flags, bool cannot_lead_to_return) 414 1.1 mrg { 415 1.1 mrg *looping = false; 416 1.1 mrg if (flags & ECF_LOOPING_CONST_OR_PURE) 417 1.1 mrg { 418 1.1 mrg *looping = true; 419 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 420 1.1 mrg fprintf (dump_file, " looping\n"); 421 1.1 mrg } 422 1.1 mrg if (flags & ECF_CONST) 423 1.1 mrg { 424 1.1 mrg *state = IPA_CONST; 425 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 426 1.1 mrg fprintf (dump_file, " const\n"); 427 1.1 mrg } 428 1.1 mrg else if (flags & ECF_PURE) 429 1.1 mrg { 430 1.1 mrg *state = IPA_PURE; 431 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 432 1.1 mrg fprintf (dump_file, " pure\n"); 433 1.1 mrg } 434 1.1 mrg else if (cannot_lead_to_return) 435 1.1 mrg { 436 1.1 mrg *state = IPA_PURE; 437 1.1 mrg *looping = true; 438 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 439 1.1 mrg fprintf (dump_file, " ignoring side effects->pure looping\n"); 440 1.1 mrg } 441 1.1 mrg else 442 1.1 mrg { 443 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 444 1.1 mrg fprintf (dump_file, " neither\n"); 445 1.1 mrg *state = IPA_NEITHER; 446 1.1 mrg *looping = true; 447 1.1 mrg } 448 1.1 mrg } 449 1.1 mrg 450 1.1 mrg /* Merge STATE and STATE2 and LOOPING and LOOPING2 and store 451 1.1 mrg into STATE and LOOPING better of the two variants. 452 1.1 mrg Be sure to merge looping correctly. IPA_NEITHER functions 453 1.1 mrg have looping 0 even if they don't have to return. */ 454 1.1 mrg 455 1.1 mrg static inline void 456 1.1 mrg better_state (enum pure_const_state_e *state, bool *looping, 457 1.1 mrg enum pure_const_state_e state2, bool looping2) 458 1.1 mrg { 459 1.1 mrg if (state2 < *state) 460 1.1 mrg { 461 1.1 mrg if (*state == IPA_NEITHER) 462 1.1 mrg *looping = looping2; 463 1.1 mrg else 464 1.1 mrg *looping = MIN (*looping, looping2); 465 1.1 mrg *state = state2; 466 1.1 mrg } 467 1.1 mrg else if (state2 != IPA_NEITHER) 468 1.1 mrg *looping = MIN (*looping, looping2); 469 1.1 mrg } 470 1.1 mrg 471 1.1 mrg /* Merge STATE and STATE2 and LOOPING and LOOPING2 and store 472 1.1 mrg into STATE and LOOPING worse of the two variants. 473 1.1 mrg N is the actual node called. */ 474 1.1 mrg 475 1.1 mrg static inline void 476 1.1 mrg worse_state (enum pure_const_state_e *state, bool *looping, 477 1.1 mrg enum pure_const_state_e state2, bool looping2, 478 1.1 mrg struct symtab_node *from, 479 1.1 mrg struct symtab_node *to) 480 1.1 mrg { 481 1.1 mrg /* Consider function: 482 1.1 mrg 483 1.1 mrg bool a(int *p) 484 1.1 mrg { 485 1.1 mrg return *p==*p; 486 1.1 mrg } 487 1.1 mrg 488 1.1 mrg During early optimization we will turn this into: 489 1.1 mrg 490 1.1 mrg bool a(int *p) 491 1.1 mrg { 492 1.1 mrg return true; 493 1.1 mrg } 494 1.1 mrg 495 1.1 mrg Now if this function will be detected as CONST however when interposed it 496 1.1 mrg may end up being just pure. We always must assume the worst scenario here. 497 1.1 mrg */ 498 1.1 mrg if (*state == IPA_CONST && state2 == IPA_CONST 499 1.1 mrg && to && !TREE_READONLY (to->decl) && !to->binds_to_current_def_p (from)) 500 1.1 mrg { 501 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 502 1.1 mrg fprintf (dump_file, "Dropping state to PURE because call to %s may not " 503 1.1 mrg "bind to current def.\n", to->dump_name ()); 504 1.1 mrg state2 = IPA_PURE; 505 1.1 mrg } 506 1.1 mrg *state = MAX (*state, state2); 507 1.1 mrg *looping = MAX (*looping, looping2); 508 1.1 mrg } 509 1.1 mrg 510 1.1 mrg /* Recognize special cases of builtins that are by themselves not const 511 1.1 mrg but function using them is. */ 512 1.1 mrg bool 513 1.1 mrg builtin_safe_for_const_function_p (bool *looping, tree callee) 514 1.1 mrg { 515 1.1 mrg if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL) 516 1.1 mrg switch (DECL_FUNCTION_CODE (callee)) 517 1.1 mrg { 518 1.1 mrg case BUILT_IN_RETURN: 519 1.1 mrg case BUILT_IN_UNREACHABLE: 520 1.1 mrg CASE_BUILT_IN_ALLOCA: 521 1.1 mrg case BUILT_IN_STACK_SAVE: 522 1.1 mrg case BUILT_IN_STACK_RESTORE: 523 1.1 mrg case BUILT_IN_EH_POINTER: 524 1.1 mrg case BUILT_IN_EH_FILTER: 525 1.1 mrg case BUILT_IN_UNWIND_RESUME: 526 1.1 mrg case BUILT_IN_CXA_END_CLEANUP: 527 1.1 mrg case BUILT_IN_EH_COPY_VALUES: 528 1.1 mrg case BUILT_IN_FRAME_ADDRESS: 529 1.1 mrg case BUILT_IN_APPLY_ARGS: 530 1.1 mrg case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT: 531 1.1 mrg case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT: 532 1.1 mrg case BUILT_IN_DWARF_CFA: 533 1.1 mrg case BUILT_IN_RETURN_ADDRESS: 534 1.1 mrg *looping = false; 535 1.1 mrg return true; 536 1.1 mrg case BUILT_IN_PREFETCH: 537 1.1 mrg *looping = true; 538 1.1 mrg return true; 539 1.1 mrg default: 540 1.1 mrg break; 541 1.1 mrg } 542 1.1 mrg return false; 543 1.1 mrg } 544 1.1 mrg 545 1.1 mrg /* Check the parameters of a function call to CALL_EXPR to see if 546 1.1 mrg there are any references in the parameters that are not allowed for 547 1.1 mrg pure or const functions. Also check to see if this is either an 548 1.1 mrg indirect call, a call outside the compilation unit, or has special 549 1.1 mrg attributes that may also effect the purity. The CALL_EXPR node for 550 1.1 mrg the entire call expression. */ 551 1.1 mrg 552 1.1 mrg static void 553 1.1 mrg check_call (funct_state local, gcall *call, bool ipa) 554 1.1 mrg { 555 1.1 mrg int flags = gimple_call_flags (call); 556 1.1 mrg tree callee_t = gimple_call_fndecl (call); 557 1.1 mrg bool possibly_throws = stmt_could_throw_p (cfun, call); 558 1.1 mrg bool possibly_throws_externally = (possibly_throws 559 1.1 mrg && stmt_can_throw_external (cfun, call)); 560 1.1 mrg 561 1.1 mrg if (possibly_throws) 562 1.1 mrg { 563 1.1 mrg unsigned int i; 564 1.1 mrg for (i = 0; i < gimple_num_ops (call); i++) 565 1.1 mrg if (gimple_op (call, i) 566 1.1 mrg && tree_could_throw_p (gimple_op (call, i))) 567 1.1 mrg { 568 1.1 mrg if (possibly_throws && cfun->can_throw_non_call_exceptions) 569 1.1 mrg { 570 1.1 mrg if (dump_file) 571 1.1 mrg fprintf (dump_file, " operand can throw; looping\n"); 572 1.1 mrg local->looping = true; 573 1.1 mrg } 574 1.1 mrg if (possibly_throws_externally) 575 1.1 mrg { 576 1.1 mrg if (dump_file) 577 1.1 mrg fprintf (dump_file, " operand can throw externally\n"); 578 1.1 mrg local->can_throw = true; 579 1.1 mrg } 580 1.1 mrg } 581 1.1 mrg } 582 1.1 mrg 583 1.1 mrg /* The const and pure flags are set by a variety of places in the 584 1.1 mrg compiler (including here). If someone has already set the flags 585 1.1 mrg for the callee, (such as for some of the builtins) we will use 586 1.1 mrg them, otherwise we will compute our own information. 587 1.1 mrg 588 1.1 mrg Const and pure functions have less clobber effects than other 589 1.1 mrg functions so we process these first. Otherwise if it is a call 590 1.1 mrg outside the compilation unit or an indirect call we punt. This 591 1.1 mrg leaves local calls which will be processed by following the call 592 1.1 mrg graph. */ 593 1.1 mrg if (callee_t) 594 1.1 mrg { 595 1.1 mrg bool call_looping; 596 1.1 mrg 597 1.1 mrg if (gimple_call_builtin_p (call, BUILT_IN_NORMAL) 598 1.1 mrg && !nonfreeing_call_p (call)) 599 1.1 mrg local->can_free = true; 600 1.1 mrg 601 1.1 mrg if (builtin_safe_for_const_function_p (&call_looping, callee_t)) 602 1.1 mrg { 603 1.1 mrg worse_state (&local->pure_const_state, &local->looping, 604 1.1 mrg IPA_CONST, call_looping, 605 1.1 mrg NULL, NULL); 606 1.1 mrg return; 607 1.1 mrg } 608 1.1 mrg /* When bad things happen to bad functions, they cannot be const 609 1.1 mrg or pure. */ 610 1.1 mrg if (setjmp_call_p (callee_t)) 611 1.1 mrg { 612 1.1 mrg if (dump_file) 613 1.1 mrg fprintf (dump_file, " setjmp is not const/pure\n"); 614 1.1 mrg local->looping = true; 615 1.1 mrg local->pure_const_state = IPA_NEITHER; 616 1.1 mrg } 617 1.1 mrg 618 1.1 mrg if (DECL_BUILT_IN_CLASS (callee_t) == BUILT_IN_NORMAL) 619 1.1 mrg switch (DECL_FUNCTION_CODE (callee_t)) 620 1.1 mrg { 621 1.1 mrg case BUILT_IN_LONGJMP: 622 1.1 mrg case BUILT_IN_NONLOCAL_GOTO: 623 1.1 mrg if (dump_file) 624 1.1 mrg fprintf (dump_file, 625 1.1 mrg " longjmp and nonlocal goto is not const/pure\n"); 626 1.1 mrg local->pure_const_state = IPA_NEITHER; 627 1.1 mrg local->looping = true; 628 1.1 mrg break; 629 1.1 mrg default: 630 1.1 mrg break; 631 1.1 mrg } 632 1.1 mrg } 633 1.1 mrg else if (gimple_call_internal_p (call) && !nonfreeing_call_p (call)) 634 1.1 mrg local->can_free = true; 635 1.1 mrg 636 1.1 mrg /* When not in IPA mode, we can still handle self recursion. */ 637 1.1 mrg if (!ipa && callee_t 638 1.1 mrg && recursive_call_p (current_function_decl, callee_t)) 639 1.1 mrg { 640 1.1 mrg if (dump_file) 641 1.1 mrg fprintf (dump_file, " Recursive call can loop.\n"); 642 1.1 mrg local->looping = true; 643 1.1 mrg } 644 1.1 mrg /* Either callee is unknown or we are doing local analysis. 645 1.1 mrg Look to see if there are any bits available for the callee (such as by 646 1.1 mrg declaration or because it is builtin) and process solely on the basis of 647 1.1 mrg those bits. Handle internal calls always, those calls don't have 648 1.1 mrg corresponding cgraph edges and thus aren't processed during 649 1.1 mrg the propagation. */ 650 1.1 mrg else if (!ipa || gimple_call_internal_p (call)) 651 1.1 mrg { 652 1.1 mrg enum pure_const_state_e call_state; 653 1.1 mrg bool call_looping; 654 1.1 mrg if (possibly_throws && cfun->can_throw_non_call_exceptions) 655 1.1 mrg { 656 1.1 mrg if (dump_file) 657 1.1 mrg fprintf (dump_file, " can throw; looping\n"); 658 1.1 mrg local->looping = true; 659 1.1 mrg } 660 1.1 mrg if (possibly_throws_externally) 661 1.1 mrg { 662 1.1 mrg if (dump_file) 663 1.1 mrg { 664 1.1 mrg fprintf (dump_file, " can throw externally to lp %i\n", 665 1.1 mrg lookup_stmt_eh_lp (call)); 666 1.1 mrg if (callee_t) 667 1.1 mrg fprintf (dump_file, " callee:%s\n", 668 1.1 mrg IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (callee_t))); 669 1.1 mrg } 670 1.1 mrg local->can_throw = true; 671 1.1 mrg } 672 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 673 1.1 mrg fprintf (dump_file, " checking flags for call:"); 674 1.1 mrg state_from_flags (&call_state, &call_looping, flags, 675 1.1 mrg ((flags & (ECF_NORETURN | ECF_NOTHROW)) 676 1.1 mrg == (ECF_NORETURN | ECF_NOTHROW)) 677 1.1 mrg || (!flag_exceptions && (flags & ECF_NORETURN))); 678 1.1 mrg worse_state (&local->pure_const_state, &local->looping, 679 1.1 mrg call_state, call_looping, NULL, NULL); 680 1.1 mrg } 681 1.1 mrg /* Direct functions calls are handled by IPA propagation. */ 682 1.1 mrg } 683 1.1 mrg 684 1.1 mrg /* Wrapper around check_decl for loads in local more. */ 685 1.1 mrg 686 1.1 mrg static bool 687 1.1 mrg check_load (gimple *, tree op, tree, void *data) 688 1.1 mrg { 689 1.1 mrg if (DECL_P (op)) 690 1.1 mrg check_decl ((funct_state)data, op, false, false); 691 1.1 mrg else 692 1.1 mrg check_op ((funct_state)data, op, false); 693 1.1 mrg return false; 694 1.1 mrg } 695 1.1 mrg 696 1.1 mrg /* Wrapper around check_decl for stores in local more. */ 697 1.1 mrg 698 1.1 mrg static bool 699 1.1 mrg check_store (gimple *, tree op, tree, void *data) 700 1.1 mrg { 701 1.1 mrg if (DECL_P (op)) 702 1.1 mrg check_decl ((funct_state)data, op, true, false); 703 1.1 mrg else 704 1.1 mrg check_op ((funct_state)data, op, true); 705 1.1 mrg return false; 706 1.1 mrg } 707 1.1 mrg 708 1.1 mrg /* Wrapper around check_decl for loads in ipa mode. */ 709 1.1 mrg 710 1.1 mrg static bool 711 1.1 mrg check_ipa_load (gimple *, tree op, tree, void *data) 712 1.1 mrg { 713 1.1 mrg if (DECL_P (op)) 714 1.1 mrg check_decl ((funct_state)data, op, false, true); 715 1.1 mrg else 716 1.1 mrg check_op ((funct_state)data, op, false); 717 1.1 mrg return false; 718 1.1 mrg } 719 1.1 mrg 720 1.1 mrg /* Wrapper around check_decl for stores in ipa mode. */ 721 1.1 mrg 722 1.1 mrg static bool 723 1.1 mrg check_ipa_store (gimple *, tree op, tree, void *data) 724 1.1 mrg { 725 1.1 mrg if (DECL_P (op)) 726 1.1 mrg check_decl ((funct_state)data, op, true, true); 727 1.1 mrg else 728 1.1 mrg check_op ((funct_state)data, op, true); 729 1.1 mrg return false; 730 1.1 mrg } 731 1.1 mrg 732 1.1 mrg /* Look into pointer pointed to by GSIP and figure out what interesting side 733 1.1 mrg effects it has. */ 734 1.1 mrg static void 735 1.1 mrg check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa) 736 1.1 mrg { 737 1.1 mrg gimple *stmt = gsi_stmt (*gsip); 738 1.1 mrg 739 1.1 mrg if (is_gimple_debug (stmt)) 740 1.1 mrg return; 741 1.1 mrg 742 1.1 mrg /* Do consider clobber as side effects before IPA, so we rather inline 743 1.1 mrg C++ destructors and keep clobber semantics than eliminate them. 744 1.1 mrg 745 1.1 mrg Similar logic is in ipa-modref. 746 1.1 mrg 747 1.1 mrg TODO: We may get smarter during early optimizations on these and let 748 1.1 mrg functions containing only clobbers to be optimized more. This is a common 749 1.1 mrg case of C++ destructors. */ 750 1.1 mrg 751 1.1 mrg if ((ipa || cfun->after_inlining) && gimple_clobber_p (stmt)) 752 1.1 mrg return; 753 1.1 mrg 754 1.1 mrg if (dump_file) 755 1.1 mrg { 756 1.1 mrg fprintf (dump_file, " scanning: "); 757 1.1 mrg print_gimple_stmt (dump_file, stmt, 0); 758 1.1 mrg } 759 1.1 mrg 760 1.1 mrg if (gimple_has_volatile_ops (stmt) 761 1.1 mrg && !gimple_clobber_p (stmt)) 762 1.1 mrg { 763 1.1 mrg local->pure_const_state = IPA_NEITHER; 764 1.1 mrg if (dump_file) 765 1.1 mrg fprintf (dump_file, " Volatile stmt is not const/pure\n"); 766 1.1 mrg } 767 1.1 mrg 768 1.1 mrg /* Look for loads and stores. */ 769 1.1 mrg walk_stmt_load_store_ops (stmt, local, 770 1.1 mrg ipa ? check_ipa_load : check_load, 771 1.1 mrg ipa ? check_ipa_store : check_store); 772 1.1 mrg 773 1.1 mrg if (gimple_code (stmt) != GIMPLE_CALL 774 1.1 mrg && stmt_could_throw_p (cfun, stmt)) 775 1.1 mrg { 776 1.1 mrg if (cfun->can_throw_non_call_exceptions) 777 1.1 mrg { 778 1.1 mrg if (dump_file) 779 1.1 mrg fprintf (dump_file, " can throw; looping\n"); 780 1.1 mrg local->looping = true; 781 1.1 mrg } 782 1.1 mrg if (stmt_can_throw_external (cfun, stmt)) 783 1.1 mrg { 784 1.1 mrg if (dump_file) 785 1.1 mrg fprintf (dump_file, " can throw externally\n"); 786 1.1 mrg local->can_throw = true; 787 1.1 mrg } 788 1.1 mrg else 789 1.1 mrg if (dump_file) 790 1.1 mrg fprintf (dump_file, " can throw\n"); 791 1.1 mrg } 792 1.1 mrg switch (gimple_code (stmt)) 793 1.1 mrg { 794 1.1 mrg case GIMPLE_CALL: 795 1.1 mrg check_call (local, as_a <gcall *> (stmt), ipa); 796 1.1 mrg break; 797 1.1 mrg case GIMPLE_LABEL: 798 1.1 mrg if (DECL_NONLOCAL (gimple_label_label (as_a <glabel *> (stmt)))) 799 1.1 mrg /* Target of long jump. */ 800 1.1 mrg { 801 1.1 mrg if (dump_file) 802 1.1 mrg fprintf (dump_file, " nonlocal label is not const/pure\n"); 803 1.1 mrg local->pure_const_state = IPA_NEITHER; 804 1.1 mrg } 805 1.1 mrg break; 806 1.1 mrg case GIMPLE_ASM: 807 1.1 mrg if (gimple_asm_clobbers_memory_p (as_a <gasm *> (stmt))) 808 1.1 mrg { 809 1.1 mrg if (dump_file) 810 1.1 mrg fprintf (dump_file, " memory asm clobber is not const/pure\n"); 811 1.1 mrg /* Abandon all hope, ye who enter here. */ 812 1.1 mrg local->pure_const_state = IPA_NEITHER; 813 1.1 mrg local->can_free = true; 814 1.1 mrg } 815 1.1 mrg if (gimple_asm_volatile_p (as_a <gasm *> (stmt))) 816 1.1 mrg { 817 1.1 mrg if (dump_file) 818 1.1 mrg fprintf (dump_file, " volatile is not const/pure\n"); 819 1.1 mrg /* Abandon all hope, ye who enter here. */ 820 1.1 mrg local->pure_const_state = IPA_NEITHER; 821 1.1 mrg local->looping = true; 822 1.1 mrg local->can_free = true; 823 1.1 mrg } 824 1.1 mrg return; 825 1.1 mrg default: 826 1.1 mrg break; 827 1.1 mrg } 828 1.1 mrg } 829 1.1 mrg 830 1.1 mrg /* Check that RETVAL is used only in STMT and in comparisons against 0. 831 1.1 mrg RETVAL is return value of the function and STMT is return stmt. */ 832 1.1 mrg 833 1.1 mrg static bool 834 1.1 mrg check_retval_uses (tree retval, gimple *stmt) 835 1.1 mrg { 836 1.1 mrg imm_use_iterator use_iter; 837 1.1 mrg gimple *use_stmt; 838 1.1 mrg 839 1.1 mrg FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, retval) 840 1.1 mrg if (gcond *cond = dyn_cast<gcond *> (use_stmt)) 841 1.1 mrg { 842 1.1 mrg tree op2 = gimple_cond_rhs (cond); 843 1.1 mrg if (!integer_zerop (op2)) 844 1.1 mrg return false; 845 1.1 mrg } 846 1.1 mrg else if (gassign *ga = dyn_cast<gassign *> (use_stmt)) 847 1.1 mrg { 848 1.1 mrg enum tree_code code = gimple_assign_rhs_code (ga); 849 1.1 mrg if (TREE_CODE_CLASS (code) != tcc_comparison) 850 1.1 mrg return false; 851 1.1 mrg if (!integer_zerop (gimple_assign_rhs2 (ga))) 852 1.1 mrg return false; 853 1.1 mrg } 854 1.1 mrg else if (is_gimple_debug (use_stmt)) 855 1.1 mrg ; 856 1.1 mrg else if (use_stmt != stmt) 857 1.1 mrg return false; 858 1.1 mrg 859 1.1 mrg return true; 860 1.1 mrg } 861 1.1 mrg 862 1.1 mrg /* malloc_candidate_p() checks if FUN can possibly be annotated with malloc 863 1.1 mrg attribute. Currently this function does a very conservative analysis. 864 1.1 mrg FUN is considered to be a candidate if 865 1.1 mrg 1) It returns a value of pointer type. 866 1.1 mrg 2) SSA_NAME_DEF_STMT (return_value) is either a function call or 867 1.1 mrg a phi, and element of phi is either NULL or 868 1.1 mrg SSA_NAME_DEF_STMT(element) is function call. 869 1.1 mrg 3) The return-value has immediate uses only within comparisons (gcond or gassign) 870 1.1 mrg and return_stmt (and likewise a phi arg has immediate use only within comparison 871 1.1 mrg or the phi stmt). */ 872 1.1 mrg 873 1.1 mrg #define DUMP_AND_RETURN(reason) \ 874 1.1 mrg { \ 875 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) \ 876 1.1 mrg fprintf (dump_file, "\n%s is not a malloc candidate, reason: %s\n", \ 877 1.1 mrg (node->dump_name ()), (reason)); \ 878 1.1 mrg return false; \ 879 1.1 mrg } 880 1.1 mrg 881 1.1 mrg static bool 882 1.1 mrg malloc_candidate_p_1 (function *fun, tree retval, gimple *ret_stmt, bool ipa, 883 1.1 mrg bitmap visited) 884 1.1 mrg { 885 1.1 mrg cgraph_node *node = cgraph_node::get_create (fun->decl); 886 1.1 mrg if (!bitmap_set_bit (visited, SSA_NAME_VERSION (retval))) 887 1.1 mrg return true; 888 1.1 mrg 889 1.1 mrg if (!check_retval_uses (retval, ret_stmt)) 890 1.1 mrg DUMP_AND_RETURN("Return value has uses outside return stmt" 891 1.1 mrg " and comparisons against 0.") 892 1.1 mrg 893 1.1 mrg gimple *def = SSA_NAME_DEF_STMT (retval); 894 1.1 mrg 895 1.1 mrg if (gcall *call_stmt = dyn_cast<gcall *> (def)) 896 1.1 mrg { 897 1.1 mrg tree callee_decl = gimple_call_fndecl (call_stmt); 898 1.1 mrg if (!callee_decl) 899 1.1 mrg return false; 900 1.1 mrg 901 1.1 mrg if (!ipa && !DECL_IS_MALLOC (callee_decl)) 902 1.1 mrg DUMP_AND_RETURN("callee_decl does not have malloc attribute for" 903 1.1 mrg " non-ipa mode.") 904 1.1 mrg 905 1.1 mrg cgraph_edge *cs = node->get_edge (call_stmt); 906 1.1 mrg if (cs) 907 1.1 mrg { 908 1.1 mrg ipa_call_summary *es = ipa_call_summaries->get_create (cs); 909 1.1 mrg es->is_return_callee_uncaptured = true; 910 1.1 mrg } 911 1.1 mrg } 912 1.1 mrg 913 1.1 mrg else if (gphi *phi = dyn_cast<gphi *> (def)) 914 1.1 mrg { 915 1.1 mrg bool all_args_zero = true; 916 1.1 mrg for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i) 917 1.1 mrg { 918 1.1 mrg tree arg = gimple_phi_arg_def (phi, i); 919 1.1 mrg if (integer_zerop (arg)) 920 1.1 mrg continue; 921 1.1 mrg 922 1.1 mrg all_args_zero = false; 923 1.1 mrg if (TREE_CODE (arg) != SSA_NAME) 924 1.1 mrg DUMP_AND_RETURN ("phi arg is not SSA_NAME."); 925 1.1 mrg if (!check_retval_uses (arg, phi)) 926 1.1 mrg DUMP_AND_RETURN ("phi arg has uses outside phi" 927 1.1 mrg " and comparisons against 0.") 928 1.1 mrg 929 1.1 mrg gimple *arg_def = SSA_NAME_DEF_STMT (arg); 930 1.1 mrg if (is_a<gphi *> (arg_def)) 931 1.1 mrg { 932 1.1 mrg if (!malloc_candidate_p_1 (fun, arg, phi, ipa, visited)) 933 1.1 mrg DUMP_AND_RETURN ("nested phi fail") 934 1.1 mrg continue; 935 1.1 mrg } 936 1.1 mrg 937 1.1 mrg gcall *call_stmt = dyn_cast<gcall *> (arg_def); 938 1.1 mrg if (!call_stmt) 939 1.1 mrg DUMP_AND_RETURN ("phi arg is a not a call_stmt.") 940 1.1 mrg 941 1.1 mrg tree callee_decl = gimple_call_fndecl (call_stmt); 942 1.1 mrg if (!callee_decl) 943 1.1 mrg return false; 944 1.1 mrg if (!ipa && !DECL_IS_MALLOC (callee_decl)) 945 1.1 mrg DUMP_AND_RETURN("callee_decl does not have malloc attribute" 946 1.1 mrg " for non-ipa mode.") 947 1.1 mrg 948 1.1 mrg cgraph_edge *cs = node->get_edge (call_stmt); 949 1.1 mrg if (cs) 950 1.1 mrg { 951 1.1 mrg ipa_call_summary *es = ipa_call_summaries->get_create (cs); 952 1.1 mrg es->is_return_callee_uncaptured = true; 953 1.1 mrg } 954 1.1 mrg } 955 1.1 mrg 956 1.1 mrg if (all_args_zero) 957 1.1 mrg DUMP_AND_RETURN ("Return value is a phi with all args equal to 0.") 958 1.1 mrg } 959 1.1 mrg 960 1.1 mrg else 961 1.1 mrg DUMP_AND_RETURN("def_stmt of return value is not a call or phi-stmt.") 962 1.1 mrg 963 1.1 mrg return true; 964 1.1 mrg } 965 1.1 mrg 966 1.1 mrg static bool 967 1.1 mrg malloc_candidate_p (function *fun, bool ipa) 968 1.1 mrg { 969 1.1 mrg basic_block exit_block = EXIT_BLOCK_PTR_FOR_FN (fun); 970 1.1 mrg edge e; 971 1.1 mrg edge_iterator ei; 972 1.1 mrg cgraph_node *node = cgraph_node::get_create (fun->decl); 973 1.1 mrg 974 1.1 mrg if (EDGE_COUNT (exit_block->preds) == 0 975 1.1 mrg || !flag_delete_null_pointer_checks) 976 1.1 mrg return false; 977 1.1 mrg 978 1.1 mrg auto_bitmap visited; 979 1.1 mrg FOR_EACH_EDGE (e, ei, exit_block->preds) 980 1.1 mrg { 981 1.1 mrg gimple_stmt_iterator gsi = gsi_last_bb (e->src); 982 1.1 mrg greturn *ret_stmt = dyn_cast<greturn *> (gsi_stmt (gsi)); 983 1.1 mrg 984 1.1 mrg if (!ret_stmt) 985 1.1 mrg return false; 986 1.1 mrg 987 1.1 mrg tree retval = gimple_return_retval (ret_stmt); 988 1.1 mrg if (!retval) 989 1.1 mrg DUMP_AND_RETURN("No return value.") 990 1.1 mrg 991 1.1 mrg if (TREE_CODE (retval) != SSA_NAME 992 1.1 mrg || TREE_CODE (TREE_TYPE (retval)) != POINTER_TYPE) 993 1.1 mrg DUMP_AND_RETURN("Return value is not SSA_NAME or not a pointer type.") 994 1.1 mrg 995 1.1 mrg if (!malloc_candidate_p_1 (fun, retval, ret_stmt, ipa, visited)) 996 1.1 mrg return false; 997 1.1 mrg } 998 1.1 mrg 999 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1000 1.1 mrg fprintf (dump_file, "\nFound %s to be candidate for malloc attribute\n", 1001 1.1 mrg IDENTIFIER_POINTER (DECL_NAME (fun->decl))); 1002 1.1 mrg return true; 1003 1.1 mrg } 1004 1.1 mrg 1005 1.1 mrg #undef DUMP_AND_RETURN 1006 1.1 mrg 1007 1.1 mrg /* Return true if function is known to be finite. */ 1008 1.1 mrg 1009 1.1 mrg bool 1010 1.1 mrg finite_function_p () 1011 1.1 mrg { 1012 1.1 mrg /* Const functions cannot have back edges (an 1013 1.1 mrg indication of possible infinite loop side 1014 1.1 mrg effect. */ 1015 1.1 mrg bool finite = true; 1016 1.1 mrg if (mark_dfs_back_edges ()) 1017 1.1 mrg { 1018 1.1 mrg /* Preheaders are needed for SCEV to work. 1019 1.1 mrg Simple latches and recorded exits improve chances that loop will 1020 1.1 mrg proved to be finite in testcases such as in loop-15.c 1021 1.1 mrg and loop-24.c */ 1022 1.1 mrg loop_optimizer_init (LOOPS_HAVE_PREHEADERS 1023 1.1 mrg | LOOPS_HAVE_SIMPLE_LATCHES 1024 1.1 mrg | LOOPS_HAVE_RECORDED_EXITS); 1025 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1026 1.1 mrg flow_loops_dump (dump_file, NULL, 0); 1027 1.1 mrg if (mark_irreducible_loops ()) 1028 1.1 mrg { 1029 1.1 mrg if (dump_file) 1030 1.1 mrg fprintf (dump_file, " has irreducible loops\n"); 1031 1.1 mrg finite = false; 1032 1.1 mrg } 1033 1.1 mrg else 1034 1.1 mrg { 1035 1.1 mrg scev_initialize (); 1036 1.1 mrg for (auto loop : loops_list (cfun, 0)) 1037 1.1 mrg if (!finite_loop_p (loop)) 1038 1.1 mrg { 1039 1.1 mrg if (dump_file) 1040 1.1 mrg fprintf (dump_file, " cannot prove finiteness of " 1041 1.1 mrg "loop %i\n", loop->num); 1042 1.1 mrg finite =false; 1043 1.1 mrg break; 1044 1.1 mrg } 1045 1.1 mrg scev_finalize (); 1046 1.1 mrg } 1047 1.1 mrg loop_optimizer_finalize (); 1048 1.1 mrg } 1049 1.1 mrg return finite; 1050 1.1 mrg } 1051 1.1 mrg 1052 1.1 mrg /* This is the main routine for finding the reference patterns for 1053 1.1 mrg global variables within a function FN. */ 1054 1.1 mrg 1055 1.1 mrg static funct_state 1056 1.1 mrg analyze_function (struct cgraph_node *fn, bool ipa) 1057 1.1 mrg { 1058 1.1 mrg tree decl = fn->decl; 1059 1.1 mrg funct_state l; 1060 1.1 mrg basic_block this_block; 1061 1.1 mrg 1062 1.1 mrg l = XCNEW (class funct_state_d); 1063 1.1 mrg l->pure_const_state = IPA_CONST; 1064 1.1 mrg l->state_previously_known = IPA_NEITHER; 1065 1.1 mrg l->looping_previously_known = true; 1066 1.1 mrg l->looping = false; 1067 1.1 mrg l->can_throw = false; 1068 1.1 mrg l->can_free = false; 1069 1.1 mrg state_from_flags (&l->state_previously_known, &l->looping_previously_known, 1070 1.1 mrg flags_from_decl_or_type (fn->decl), 1071 1.1 mrg fn->cannot_return_p ()); 1072 1.1 mrg 1073 1.1 mrg if (fn->thunk || fn->alias) 1074 1.1 mrg { 1075 1.1 mrg /* Thunk gets propagated through, so nothing interesting happens. */ 1076 1.1 mrg gcc_assert (ipa); 1077 1.1 mrg if (fn->thunk && thunk_info::get (fn)->virtual_offset_p) 1078 1.1 mrg l->pure_const_state = IPA_NEITHER; 1079 1.1 mrg return l; 1080 1.1 mrg } 1081 1.1 mrg 1082 1.1 mrg if (dump_file) 1083 1.1 mrg { 1084 1.1 mrg fprintf (dump_file, "\n\n local analysis of %s\n ", 1085 1.1 mrg fn->dump_name ()); 1086 1.1 mrg } 1087 1.1 mrg 1088 1.1 mrg push_cfun (DECL_STRUCT_FUNCTION (decl)); 1089 1.1 mrg 1090 1.1 mrg FOR_EACH_BB_FN (this_block, cfun) 1091 1.1 mrg { 1092 1.1 mrg gimple_stmt_iterator gsi; 1093 1.1 mrg struct walk_stmt_info wi; 1094 1.1 mrg 1095 1.1 mrg memset (&wi, 0, sizeof (wi)); 1096 1.1 mrg for (gsi = gsi_start_bb (this_block); 1097 1.1 mrg !gsi_end_p (gsi); 1098 1.1 mrg gsi_next (&gsi)) 1099 1.1 mrg { 1100 1.1 mrg /* NULL memory accesses terminates BB. These accesses are known 1101 1.1 mrg to trip undefined behaviour. gimple-ssa-isolate-paths turns them 1102 1.1 mrg to volatile accesses and adds builtin_trap call which would 1103 1.1 mrg confuse us otherwise. */ 1104 1.1 mrg if (infer_nonnull_range_by_dereference (gsi_stmt (gsi), 1105 1.1 mrg null_pointer_node)) 1106 1.1 mrg { 1107 1.1 mrg if (dump_file) 1108 1.1 mrg fprintf (dump_file, " NULL memory access; terminating BB%s\n", 1109 1.1 mrg flag_non_call_exceptions ? "; looping" : ""); 1110 1.1 mrg if (flag_non_call_exceptions) 1111 1.1 mrg { 1112 1.1 mrg l->looping = true; 1113 1.1 mrg if (stmt_can_throw_external (cfun, gsi_stmt (gsi))) 1114 1.1 mrg { 1115 1.1 mrg if (dump_file) 1116 1.1 mrg fprintf (dump_file, " can throw externally\n"); 1117 1.1 mrg l->can_throw = true; 1118 1.1 mrg } 1119 1.1 mrg } 1120 1.1 mrg break; 1121 1.1 mrg } 1122 1.1 mrg check_stmt (&gsi, l, ipa); 1123 1.1 mrg if (l->pure_const_state == IPA_NEITHER 1124 1.1 mrg && l->looping 1125 1.1 mrg && l->can_throw 1126 1.1 mrg && l->can_free) 1127 1.1 mrg goto end; 1128 1.1 mrg } 1129 1.1 mrg } 1130 1.1 mrg 1131 1.1 mrg end: 1132 1.1 mrg if (l->pure_const_state != IPA_NEITHER 1133 1.1 mrg && !l->looping 1134 1.1 mrg && !finite_function_p ()) 1135 1.1 mrg l->looping = true; 1136 1.1 mrg 1137 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1138 1.1 mrg fprintf (dump_file, " checking previously known:"); 1139 1.1 mrg 1140 1.1 mrg better_state (&l->pure_const_state, &l->looping, 1141 1.1 mrg l->state_previously_known, 1142 1.1 mrg l->looping_previously_known); 1143 1.1 mrg if (TREE_NOTHROW (decl)) 1144 1.1 mrg l->can_throw = false; 1145 1.1 mrg 1146 1.1 mrg l->malloc_state = STATE_MALLOC_BOTTOM; 1147 1.1 mrg if (DECL_IS_MALLOC (decl)) 1148 1.1 mrg l->malloc_state = STATE_MALLOC; 1149 1.1 mrg else if (ipa && malloc_candidate_p (DECL_STRUCT_FUNCTION (decl), true)) 1150 1.1 mrg l->malloc_state = STATE_MALLOC_TOP; 1151 1.1 mrg else if (malloc_candidate_p (DECL_STRUCT_FUNCTION (decl), false)) 1152 1.1 mrg l->malloc_state = STATE_MALLOC; 1153 1.1 mrg 1154 1.1 mrg pop_cfun (); 1155 1.1 mrg if (dump_file) 1156 1.1 mrg { 1157 1.1 mrg if (l->looping) 1158 1.1 mrg fprintf (dump_file, "Function is locally looping.\n"); 1159 1.1 mrg if (l->can_throw) 1160 1.1 mrg fprintf (dump_file, "Function is locally throwing.\n"); 1161 1.1 mrg if (l->pure_const_state == IPA_CONST) 1162 1.1 mrg fprintf (dump_file, "Function is locally const.\n"); 1163 1.1 mrg if (l->pure_const_state == IPA_PURE) 1164 1.1 mrg fprintf (dump_file, "Function is locally pure.\n"); 1165 1.1 mrg if (l->can_free) 1166 1.1 mrg fprintf (dump_file, "Function can locally free.\n"); 1167 1.1 mrg if (l->malloc_state == STATE_MALLOC) 1168 1.1 mrg fprintf (dump_file, "Function is locally malloc.\n"); 1169 1.1 mrg } 1170 1.1 mrg return l; 1171 1.1 mrg } 1172 1.1 mrg 1173 1.1 mrg void 1174 1.1 mrg funct_state_summary_t::insert (cgraph_node *node, funct_state_d *state) 1175 1.1 mrg { 1176 1.1 mrg /* There are some shared nodes, in particular the initializers on 1177 1.1 mrg static declarations. We do not need to scan them more than once 1178 1.1 mrg since all we would be interested in are the addressof 1179 1.1 mrg operations. */ 1180 1.1 mrg if (opt_for_fn (node->decl, flag_ipa_pure_const)) 1181 1.1 mrg { 1182 1.1 mrg funct_state_d *a = analyze_function (node, true); 1183 1.1 mrg new (state) funct_state_d (*a); 1184 1.1 mrg free (a); 1185 1.1 mrg } 1186 1.1 mrg else 1187 1.1 mrg /* Do not keep stale summaries. */ 1188 1.1 mrg funct_state_summaries->remove (node); 1189 1.1 mrg } 1190 1.1 mrg 1191 1.1 mrg /* Called when new clone is inserted to callgraph late. */ 1192 1.1 mrg 1193 1.1 mrg void 1194 1.1 mrg funct_state_summary_t::duplicate (cgraph_node *, cgraph_node *dst, 1195 1.1 mrg funct_state_d *src_data, 1196 1.1 mrg funct_state_d *dst_data) 1197 1.1 mrg { 1198 1.1 mrg new (dst_data) funct_state_d (*src_data); 1199 1.1 mrg if (dst_data->malloc_state == STATE_MALLOC 1200 1.1 mrg && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (dst->decl)))) 1201 1.1 mrg dst_data->malloc_state = STATE_MALLOC_BOTTOM; 1202 1.1 mrg } 1203 1.1 mrg 1204 1.1 mrg 1205 1.1 mrg void 1207 1.1 mrg pass_ipa_pure_const:: 1208 1.1 mrg register_hooks (void) 1209 1.1 mrg { 1210 1.1 mrg if (init_p) 1211 1.1 mrg return; 1212 1.1 mrg 1213 1.1 mrg init_p = true; 1214 1.1 mrg 1215 1.1 mrg funct_state_summaries = new funct_state_summary_t (symtab); 1216 1.1 mrg } 1217 1.1 mrg 1218 1.1 mrg 1219 1.1 mrg /* Analyze each function in the cgraph to see if it is locally PURE or 1220 1.1 mrg CONST. */ 1221 1.1 mrg 1222 1.1 mrg static void 1223 1.1 mrg pure_const_generate_summary (void) 1224 1.1 mrg { 1225 1.1 mrg struct cgraph_node *node; 1226 1.1 mrg 1227 1.1 mrg pass_ipa_pure_const *pass = static_cast <pass_ipa_pure_const *> (current_pass); 1228 1.1 mrg pass->register_hooks (); 1229 1.1 mrg 1230 1.1 mrg /* Process all of the functions. 1231 1.1 mrg 1232 1.1 mrg We process AVAIL_INTERPOSABLE functions. We cannot use the results 1233 1.1 mrg by default, but the info can be used at LTO with -fwhole-program or 1234 1.1 mrg when function got cloned and the clone is AVAILABLE. */ 1235 1.1 mrg 1236 1.1 mrg FOR_EACH_DEFINED_FUNCTION (node) 1237 1.1 mrg if (opt_for_fn (node->decl, flag_ipa_pure_const)) 1238 1.1 mrg { 1239 1.1 mrg funct_state_d *a = analyze_function (node, true); 1240 1.1 mrg new (funct_state_summaries->get_create (node)) funct_state_d (*a); 1241 1.1 mrg free (a); 1242 1.1 mrg } 1243 1.1 mrg } 1244 1.1 mrg 1245 1.1 mrg 1246 1.1 mrg /* Serialize the ipa info for lto. */ 1247 1.1 mrg 1248 1.1 mrg static void 1249 1.1 mrg pure_const_write_summary (void) 1250 1.1 mrg { 1251 1.1 mrg struct cgraph_node *node; 1252 1.1 mrg struct lto_simple_output_block *ob 1253 1.1 mrg = lto_create_simple_output_block (LTO_section_ipa_pure_const); 1254 1.1 mrg unsigned int count = 0; 1255 1.1 mrg lto_symtab_encoder_iterator lsei; 1256 1.1 mrg lto_symtab_encoder_t encoder; 1257 1.1 mrg 1258 1.1 mrg encoder = lto_get_out_decl_state ()->symtab_node_encoder; 1259 1.1 mrg 1260 1.1 mrg for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei); 1261 1.1 mrg lsei_next_function_in_partition (&lsei)) 1262 1.1 mrg { 1263 1.1 mrg node = lsei_cgraph_node (lsei); 1264 1.1 mrg if (node->definition && funct_state_summaries->exists (node)) 1265 1.1 mrg count++; 1266 1.1 mrg } 1267 1.1 mrg 1268 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, count); 1269 1.1 mrg 1270 1.1 mrg /* Process all of the functions. */ 1271 1.1 mrg for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei); 1272 1.1 mrg lsei_next_function_in_partition (&lsei)) 1273 1.1 mrg { 1274 1.1 mrg node = lsei_cgraph_node (lsei); 1275 1.1 mrg funct_state_d *fs = funct_state_summaries->get (node); 1276 1.1 mrg if (node->definition && fs != NULL) 1277 1.1 mrg { 1278 1.1 mrg struct bitpack_d bp; 1279 1.1 mrg int node_ref; 1280 1.1 mrg lto_symtab_encoder_t encoder; 1281 1.1 mrg 1282 1.1 mrg encoder = ob->decl_state->symtab_node_encoder; 1283 1.1 mrg node_ref = lto_symtab_encoder_encode (encoder, node); 1284 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, node_ref); 1285 1.1 mrg 1286 1.1 mrg /* Note that flags will need to be read in the opposite 1287 1.1 mrg order as we are pushing the bitflags into FLAGS. */ 1288 1.1 mrg bp = bitpack_create (ob->main_stream); 1289 1.1 mrg bp_pack_value (&bp, fs->pure_const_state, 2); 1290 1.1 mrg bp_pack_value (&bp, fs->state_previously_known, 2); 1291 1.1 mrg bp_pack_value (&bp, fs->looping_previously_known, 1); 1292 1.1 mrg bp_pack_value (&bp, fs->looping, 1); 1293 1.1 mrg bp_pack_value (&bp, fs->can_throw, 1); 1294 1.1 mrg bp_pack_value (&bp, fs->can_free, 1); 1295 1.1 mrg bp_pack_value (&bp, fs->malloc_state, 2); 1296 1.1 mrg streamer_write_bitpack (&bp); 1297 1.1 mrg } 1298 1.1 mrg } 1299 1.1 mrg 1300 1.1 mrg lto_destroy_simple_output_block (ob); 1301 1.1 mrg } 1302 1.1 mrg 1303 1.1 mrg 1304 1.1 mrg /* Deserialize the ipa info for lto. */ 1305 1.1 mrg 1306 1.1 mrg static void 1307 1.1 mrg pure_const_read_summary (void) 1308 1.1 mrg { 1309 1.1 mrg struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); 1310 1.1 mrg struct lto_file_decl_data *file_data; 1311 1.1 mrg unsigned int j = 0; 1312 1.1 mrg 1313 1.1 mrg pass_ipa_pure_const *pass = static_cast <pass_ipa_pure_const *> (current_pass); 1314 1.1 mrg pass->register_hooks (); 1315 1.1 mrg 1316 1.1 mrg while ((file_data = file_data_vec[j++])) 1317 1.1 mrg { 1318 1.1 mrg const char *data; 1319 1.1 mrg size_t len; 1320 1.1 mrg class lto_input_block *ib 1321 1.1 mrg = lto_create_simple_input_block (file_data, 1322 1.1 mrg LTO_section_ipa_pure_const, 1323 1.1 mrg &data, &len); 1324 1.1 mrg if (ib) 1325 1.1 mrg { 1326 1.1 mrg unsigned int i; 1327 1.1 mrg unsigned int count = streamer_read_uhwi (ib); 1328 1.1 mrg 1329 1.1 mrg for (i = 0; i < count; i++) 1330 1.1 mrg { 1331 1.1 mrg unsigned int index; 1332 1.1 mrg struct cgraph_node *node; 1333 1.1 mrg struct bitpack_d bp; 1334 1.1 mrg funct_state fs; 1335 1.1 mrg lto_symtab_encoder_t encoder; 1336 1.1 mrg 1337 1.1 mrg index = streamer_read_uhwi (ib); 1338 1.1 mrg encoder = file_data->symtab_node_encoder; 1339 1.1 mrg node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder, 1340 1.1 mrg index)); 1341 1.1 mrg 1342 1.1 mrg fs = funct_state_summaries->get_create (node); 1343 1.1 mrg /* Note that the flags must be read in the opposite 1344 1.1 mrg order in which they were written (the bitflags were 1345 1.1 mrg pushed into FLAGS). */ 1346 1.1 mrg bp = streamer_read_bitpack (ib); 1347 1.1 mrg fs->pure_const_state 1348 1.1 mrg = (enum pure_const_state_e) bp_unpack_value (&bp, 2); 1349 1.1 mrg fs->state_previously_known 1350 1.1 mrg = (enum pure_const_state_e) bp_unpack_value (&bp, 2); 1351 1.1 mrg fs->looping_previously_known = bp_unpack_value (&bp, 1); 1352 1.1 mrg fs->looping = bp_unpack_value (&bp, 1); 1353 1.1 mrg fs->can_throw = bp_unpack_value (&bp, 1); 1354 1.1 mrg fs->can_free = bp_unpack_value (&bp, 1); 1355 1.1 mrg fs->malloc_state 1356 1.1 mrg = (enum malloc_state_e) bp_unpack_value (&bp, 2); 1357 1.1 mrg 1358 1.1 mrg if (dump_file) 1359 1.1 mrg { 1360 1.1 mrg int flags = flags_from_decl_or_type (node->decl); 1361 1.1 mrg fprintf (dump_file, "Read info for %s ", node->dump_name ()); 1362 1.1 mrg if (flags & ECF_CONST) 1363 1.1 mrg fprintf (dump_file, " const"); 1364 1.1 mrg if (flags & ECF_PURE) 1365 1.1 mrg fprintf (dump_file, " pure"); 1366 1.1 mrg if (flags & ECF_NOTHROW) 1367 1.1 mrg fprintf (dump_file, " nothrow"); 1368 1.1 mrg fprintf (dump_file, "\n pure const state: %s\n", 1369 1.1 mrg pure_const_names[fs->pure_const_state]); 1370 1.1 mrg fprintf (dump_file, " previously known state: %s\n", 1371 1.1 mrg pure_const_names[fs->state_previously_known]); 1372 1.1 mrg if (fs->looping) 1373 1.1 mrg fprintf (dump_file," function is locally looping\n"); 1374 1.1 mrg if (fs->looping_previously_known) 1375 1.1 mrg fprintf (dump_file," function is previously known looping\n"); 1376 1.1 mrg if (fs->can_throw) 1377 1.1 mrg fprintf (dump_file," function is locally throwing\n"); 1378 1.1 mrg if (fs->can_free) 1379 1.1 mrg fprintf (dump_file," function can locally free\n"); 1380 1.1 mrg fprintf (dump_file, "\n malloc state: %s\n", 1381 1.1 mrg malloc_state_names[fs->malloc_state]); 1382 1.1 mrg } 1383 1.1 mrg } 1384 1.1 mrg 1385 1.1 mrg lto_destroy_simple_input_block (file_data, 1386 1.1 mrg LTO_section_ipa_pure_const, 1387 1.1 mrg ib, data, len); 1388 1.1 mrg } 1389 1.1 mrg } 1390 1.1 mrg } 1391 1.1 mrg 1392 1.1 mrg /* We only propagate across edges that can throw externally and their callee 1393 1.1 mrg is not interposable. */ 1394 1.1 mrg 1395 1.1 mrg static bool 1396 1.1 mrg ignore_edge_for_nothrow (struct cgraph_edge *e) 1397 1.1 mrg { 1398 1.1 mrg if (!e->can_throw_external || TREE_NOTHROW (e->callee->decl)) 1399 1.1 mrg return true; 1400 1.1 mrg 1401 1.1 mrg enum availability avail; 1402 1.1 mrg cgraph_node *ultimate_target 1403 1.1 mrg = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); 1404 1.1 mrg if (avail <= AVAIL_INTERPOSABLE || TREE_NOTHROW (ultimate_target->decl)) 1405 1.1 mrg return true; 1406 1.1 mrg return ((opt_for_fn (e->callee->decl, flag_non_call_exceptions) 1407 1.1 mrg && !e->callee->binds_to_current_def_p (e->caller)) 1408 1.1 mrg || !opt_for_fn (e->caller->decl, flag_ipa_pure_const) 1409 1.1 mrg || !opt_for_fn (ultimate_target->decl, flag_ipa_pure_const)); 1410 1.1 mrg } 1411 1.1 mrg 1412 1.1 mrg /* Return true if NODE is self recursive function. 1413 1.1 mrg Indirectly recursive functions appears as non-trivial strongly 1414 1.1 mrg connected components, so we need to care about self recursion 1415 1.1 mrg only. */ 1416 1.1 mrg 1417 1.1 mrg static bool 1418 1.1 mrg self_recursive_p (struct cgraph_node *node) 1419 1.1 mrg { 1420 1.1 mrg struct cgraph_edge *e; 1421 1.1 mrg for (e = node->callees; e; e = e->next_callee) 1422 1.1 mrg if (e->callee->function_symbol () == node) 1423 1.1 mrg return true; 1424 1.1 mrg return false; 1425 1.1 mrg } 1426 1.1 mrg 1427 1.1 mrg /* Return true if N is cdtor that is not const or pure. In this case we may 1428 1.1 mrg need to remove unreachable function if it is marked const/pure. */ 1429 1.1 mrg 1430 1.1 mrg static bool 1431 1.1 mrg cdtor_p (cgraph_node *n, void *) 1432 1.1 mrg { 1433 1.1 mrg if (DECL_STATIC_CONSTRUCTOR (n->decl) || DECL_STATIC_DESTRUCTOR (n->decl)) 1434 1.1 mrg return ((!TREE_READONLY (n->decl) && !DECL_PURE_P (n->decl)) 1435 1.1 mrg || DECL_LOOPING_CONST_OR_PURE_P (n->decl)); 1436 1.1 mrg return false; 1437 1.1 mrg } 1438 1.1 mrg 1439 1.1 mrg /* Skip edges from and to nodes without ipa_pure_const enabled. 1440 1.1 mrg Ignore not available symbols. */ 1441 1.1 mrg 1442 1.1 mrg static bool 1443 1.1 mrg ignore_edge_for_pure_const (struct cgraph_edge *e) 1444 1.1 mrg { 1445 1.1 mrg enum availability avail; 1446 1.1 mrg cgraph_node *ultimate_target 1447 1.1 mrg = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); 1448 1.1 mrg 1449 1.1 mrg return (avail <= AVAIL_INTERPOSABLE 1450 1.1 mrg || !opt_for_fn (e->caller->decl, flag_ipa_pure_const) 1451 1.1 mrg || !opt_for_fn (ultimate_target->decl, 1452 1.1 mrg flag_ipa_pure_const)); 1453 1.1 mrg } 1454 1.1 mrg 1455 1.1 mrg /* Return true if function should be skipped for local pure const analysis. */ 1456 1.1 mrg 1457 1.1 mrg static bool 1458 1.1 mrg skip_function_for_local_pure_const (struct cgraph_node *node) 1459 1.1 mrg { 1460 1.1 mrg /* Because we do not schedule pass_fixup_cfg over whole program after early 1461 1.1 mrg optimizations we must not promote functions that are called by already 1462 1.1 mrg processed functions. */ 1463 1.1 mrg 1464 1.1 mrg if (function_called_by_processed_nodes_p ()) 1465 1.1 mrg { 1466 1.1 mrg if (dump_file) 1467 1.1 mrg fprintf (dump_file, "Function called in recursive cycle; ignoring\n"); 1468 1.1 mrg return true; 1469 1.1 mrg } 1470 1.1 mrg /* Save some work and do not analyze functions which are interposable and 1471 1.1 mrg do not have any non-interposable aliases. */ 1472 1.1 mrg if (node->get_availability () <= AVAIL_INTERPOSABLE 1473 1.1 mrg && !flag_lto 1474 1.1 mrg && !node->has_aliases_p ()) 1475 1.1 mrg { 1476 1.1 mrg if (dump_file) 1477 1.1 mrg fprintf (dump_file, 1478 1.1 mrg "Function is interposable; not analyzing.\n"); 1479 1.1 mrg return true; 1480 1.1 mrg } 1481 1.1 mrg return false; 1482 1.1 mrg } 1483 1.1 mrg 1484 1.1 mrg /* Make function const and output warning. If LOCAL is true, 1485 1.1 mrg return true if anything changed. Otherwise return true if 1486 1.1 mrg we may have introduced removale ctors. */ 1487 1.1 mrg 1488 1.1 mrg bool 1489 1.1 mrg ipa_make_function_const (struct cgraph_node *node, bool looping, bool local) 1490 1.1 mrg { 1491 1.1 mrg bool cdtor = false; 1492 1.1 mrg 1493 1.1 mrg if (TREE_READONLY (node->decl) 1494 1.1 mrg && (looping || !DECL_LOOPING_CONST_OR_PURE_P (node->decl))) 1495 1.1 mrg return false; 1496 1.1 mrg warn_function_const (node->decl, !looping); 1497 1.1 mrg if (local && skip_function_for_local_pure_const (node)) 1498 1.1 mrg return false; 1499 1.1 mrg if (dump_file) 1500 1.1 mrg fprintf (dump_file, "Function found to be %sconst: %s\n", 1501 1.1 mrg looping ? "looping " : "", 1502 1.1 mrg node->dump_name ()); 1503 1.1 mrg if (!local && !looping) 1504 1.1 mrg cdtor = node->call_for_symbol_and_aliases (cdtor_p, NULL, true); 1505 1.1 mrg if (!dbg_cnt (ipa_attr)) 1506 1.1 mrg return false; 1507 1.1 mrg if (node->set_const_flag (true, looping)) 1508 1.1 mrg { 1509 1.1 mrg if (dump_file) 1510 1.1 mrg fprintf (dump_file, 1511 1.1 mrg "Declaration updated to be %sconst: %s\n", 1512 1.1 mrg looping ? "looping " : "", 1513 1.1 mrg node->dump_name ()); 1514 1.1 mrg if (local) 1515 1.1 mrg return true; 1516 1.1 mrg return cdtor; 1517 1.1 mrg } 1518 1.1 mrg return false; 1519 1.1 mrg } 1520 1.1 mrg 1521 1.1 mrg /* Make function const and output warning. If LOCAL is true, 1522 1.1 mrg return true if anything changed. Otherwise return true if 1523 1.1 mrg we may have introduced removale ctors. */ 1524 1.1 mrg 1525 1.1 mrg bool 1526 1.1 mrg ipa_make_function_pure (struct cgraph_node *node, bool looping, bool local) 1527 1.1 mrg { 1528 1.1 mrg bool cdtor = false; 1529 1.1 mrg 1530 1.1 mrg if (TREE_READONLY (node->decl) 1531 1.1 mrg || (DECL_PURE_P (node->decl) 1532 1.1 mrg && (looping || !DECL_LOOPING_CONST_OR_PURE_P (node->decl)))) 1533 1.1 mrg return false; 1534 1.1 mrg warn_function_pure (node->decl, !looping); 1535 1.1 mrg if (local && skip_function_for_local_pure_const (node)) 1536 1.1 mrg return false; 1537 1.1 mrg if (dump_file) 1538 1.1 mrg fprintf (dump_file, "Function found to be %spure: %s\n", 1539 1.1 mrg looping ? "looping " : "", 1540 1.1 mrg node->dump_name ()); 1541 1.1 mrg if (!local && !looping) 1542 1.1 mrg cdtor = node->call_for_symbol_and_aliases (cdtor_p, NULL, true); 1543 1.1 mrg if (!dbg_cnt (ipa_attr)) 1544 1.1 mrg return false; 1545 1.1 mrg if (node->set_pure_flag (true, looping)) 1546 1.1 mrg { 1547 1.1 mrg if (dump_file) 1548 1.1 mrg fprintf (dump_file, 1549 1.1 mrg "Declaration updated to be %spure: %s\n", 1550 1.1 mrg looping ? "looping " : "", 1551 1.1 mrg node->dump_name ()); 1552 1.1 mrg if (local) 1553 1.1 mrg return true; 1554 1.1 mrg return cdtor; 1555 1.1 mrg } 1556 1.1 mrg return false; 1557 1.1 mrg } 1558 1.1 mrg 1559 1.1 mrg /* Produce transitive closure over the callgraph and compute pure/const 1560 1.1 mrg attributes. */ 1561 1.1 mrg 1562 1.1 mrg static bool 1563 1.1 mrg propagate_pure_const (void) 1564 1.1 mrg { 1565 1.1 mrg struct cgraph_node *node; 1566 1.1 mrg struct cgraph_node *w; 1567 1.1 mrg struct cgraph_node **order = 1568 1.1 mrg XCNEWVEC (struct cgraph_node *, symtab->cgraph_count); 1569 1.1 mrg int order_pos; 1570 1.1 mrg int i; 1571 1.1 mrg struct ipa_dfs_info * w_info; 1572 1.1 mrg bool remove_p = false; 1573 1.1 mrg 1574 1.1 mrg order_pos = ipa_reduced_postorder (order, true, 1575 1.1 mrg ignore_edge_for_pure_const); 1576 1.1 mrg if (dump_file) 1577 1.1 mrg { 1578 1.1 mrg cgraph_node::dump_cgraph (dump_file); 1579 1.1 mrg ipa_print_order (dump_file, "reduced", order, order_pos); 1580 1.1 mrg } 1581 1.1 mrg 1582 1.1 mrg /* Propagate the local information through the call graph to produce 1583 1.1 mrg the global information. All the nodes within a cycle will have 1584 1.1 mrg the same info so we collapse cycles first. Then we can do the 1585 1.1 mrg propagation in one pass from the leaves to the roots. */ 1586 1.1 mrg for (i = 0; i < order_pos; i++ ) 1587 1.1 mrg { 1588 1.1 mrg enum pure_const_state_e pure_const_state = IPA_CONST; 1589 1.1 mrg bool looping = false; 1590 1.1 mrg int count = 0; 1591 1.1 mrg node = order[i]; 1592 1.1 mrg 1593 1.1 mrg if (node->alias) 1594 1.1 mrg continue; 1595 1.1 mrg 1596 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1597 1.1 mrg fprintf (dump_file, "Starting cycle\n"); 1598 1.1 mrg 1599 1.1 mrg /* Find the worst state for any node in the cycle. */ 1600 1.1 mrg w = node; 1601 1.1 mrg while (w && pure_const_state != IPA_NEITHER) 1602 1.1 mrg { 1603 1.1 mrg struct cgraph_edge *e; 1604 1.1 mrg struct cgraph_edge *ie; 1605 1.1 mrg int i; 1606 1.1 mrg struct ipa_ref *ref = NULL; 1607 1.1 mrg 1608 1.1 mrg funct_state w_l = funct_state_summaries->get_create (w); 1609 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1610 1.1 mrg fprintf (dump_file, " Visiting %s state:%s looping %i\n", 1611 1.1 mrg w->dump_name (), 1612 1.1 mrg pure_const_names[w_l->pure_const_state], 1613 1.1 mrg w_l->looping); 1614 1.1 mrg 1615 1.1 mrg /* First merge in function body properties. 1616 1.1 mrg We are safe to pass NULL as FROM and TO because we will take care 1617 1.1 mrg of possible interposition when walking callees. */ 1618 1.1 mrg worse_state (&pure_const_state, &looping, 1619 1.1 mrg w_l->pure_const_state, w_l->looping, 1620 1.1 mrg NULL, NULL); 1621 1.1 mrg if (pure_const_state == IPA_NEITHER) 1622 1.1 mrg break; 1623 1.1 mrg 1624 1.1 mrg count++; 1625 1.1 mrg 1626 1.1 mrg /* We consider recursive cycles as possibly infinite. 1627 1.1 mrg This might be relaxed since infinite recursion leads to stack 1628 1.1 mrg overflow. */ 1629 1.1 mrg if (count > 1) 1630 1.1 mrg looping = true; 1631 1.1 mrg 1632 1.1 mrg /* Now walk the edges and merge in callee properties. */ 1633 1.1 mrg for (e = w->callees; e && pure_const_state != IPA_NEITHER; 1634 1.1 mrg e = e->next_callee) 1635 1.1 mrg { 1636 1.1 mrg enum availability avail; 1637 1.1 mrg struct cgraph_node *y = e->callee-> 1638 1.1 mrg function_or_virtual_thunk_symbol (&avail, 1639 1.1 mrg e->caller); 1640 1.1 mrg enum pure_const_state_e edge_state = IPA_CONST; 1641 1.1 mrg bool edge_looping = false; 1642 1.1 mrg 1643 1.1 mrg if (e->recursive_p ()) 1644 1.1 mrg looping = true; 1645 1.1 mrg 1646 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1647 1.1 mrg { 1648 1.1 mrg fprintf (dump_file, " Call to %s", 1649 1.1 mrg e->callee->dump_name ()); 1650 1.1 mrg } 1651 1.1 mrg if (avail > AVAIL_INTERPOSABLE) 1652 1.1 mrg { 1653 1.1 mrg funct_state y_l = funct_state_summaries->get_create (y); 1654 1.1 mrg 1655 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1656 1.1 mrg { 1657 1.1 mrg fprintf (dump_file, 1658 1.1 mrg " state:%s looping:%i\n", 1659 1.1 mrg pure_const_names[y_l->pure_const_state], 1660 1.1 mrg y_l->looping); 1661 1.1 mrg } 1662 1.1 mrg if (y_l->pure_const_state > IPA_PURE 1663 1.1 mrg && e->cannot_lead_to_return_p ()) 1664 1.1 mrg { 1665 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1666 1.1 mrg fprintf (dump_file, 1667 1.1 mrg " Ignoring side effects" 1668 1.1 mrg " -> pure, looping\n"); 1669 1.1 mrg edge_state = IPA_PURE; 1670 1.1 mrg edge_looping = true; 1671 1.1 mrg } 1672 1.1 mrg else 1673 1.1 mrg { 1674 1.1 mrg edge_state = y_l->pure_const_state; 1675 1.1 mrg edge_looping = y_l->looping; 1676 1.1 mrg } 1677 1.1 mrg } 1678 1.1 mrg else if (builtin_safe_for_const_function_p (&edge_looping, 1679 1.1 mrg y->decl)) 1680 1.1 mrg edge_state = IPA_CONST; 1681 1.1 mrg else 1682 1.1 mrg state_from_flags (&edge_state, &edge_looping, 1683 1.1 mrg flags_from_decl_or_type (y->decl), 1684 1.1 mrg e->cannot_lead_to_return_p ()); 1685 1.1 mrg 1686 1.1 mrg /* Merge the results with what we already know. */ 1687 1.1 mrg better_state (&edge_state, &edge_looping, 1688 1.1 mrg w_l->state_previously_known, 1689 1.1 mrg w_l->looping_previously_known); 1690 1.1 mrg worse_state (&pure_const_state, &looping, 1691 1.1 mrg edge_state, edge_looping, e->caller, e->callee); 1692 1.1 mrg if (pure_const_state == IPA_NEITHER) 1693 1.1 mrg break; 1694 1.1 mrg } 1695 1.1 mrg 1696 1.1 mrg /* Now process the indirect call. */ 1697 1.1 mrg for (ie = w->indirect_calls; 1698 1.1 mrg ie && pure_const_state != IPA_NEITHER; ie = ie->next_callee) 1699 1.1 mrg { 1700 1.1 mrg enum pure_const_state_e edge_state = IPA_CONST; 1701 1.1 mrg bool edge_looping = false; 1702 1.1 mrg 1703 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1704 1.1 mrg fprintf (dump_file, " Indirect call"); 1705 1.1 mrg state_from_flags (&edge_state, &edge_looping, 1706 1.1 mrg ie->indirect_info->ecf_flags, 1707 1.1 mrg ie->cannot_lead_to_return_p ()); 1708 1.1 mrg /* Merge the results with what we already know. */ 1709 1.1 mrg better_state (&edge_state, &edge_looping, 1710 1.1 mrg w_l->state_previously_known, 1711 1.1 mrg w_l->looping_previously_known); 1712 1.1 mrg worse_state (&pure_const_state, &looping, 1713 1.1 mrg edge_state, edge_looping, NULL, NULL); 1714 1.1 mrg if (pure_const_state == IPA_NEITHER) 1715 1.1 mrg break; 1716 1.1 mrg } 1717 1.1 mrg 1718 1.1 mrg /* And finally all loads and stores. */ 1719 1.1 mrg for (i = 0; w->iterate_reference (i, ref) 1720 1.1 mrg && pure_const_state != IPA_NEITHER; i++) 1721 1.1 mrg { 1722 1.1 mrg enum pure_const_state_e ref_state = IPA_CONST; 1723 1.1 mrg bool ref_looping = false; 1724 1.1 mrg switch (ref->use) 1725 1.1 mrg { 1726 1.1 mrg case IPA_REF_LOAD: 1727 1.1 mrg /* readonly reads are safe. */ 1728 1.1 mrg if (TREE_READONLY (ref->referred->decl)) 1729 1.1 mrg break; 1730 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1731 1.1 mrg fprintf (dump_file, " nonreadonly global var read\n"); 1732 1.1 mrg ref_state = IPA_PURE; 1733 1.1 mrg break; 1734 1.1 mrg case IPA_REF_STORE: 1735 1.1 mrg if (ref->cannot_lead_to_return ()) 1736 1.1 mrg break; 1737 1.1 mrg ref_state = IPA_NEITHER; 1738 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1739 1.1 mrg fprintf (dump_file, " global var write\n"); 1740 1.1 mrg break; 1741 1.1 mrg case IPA_REF_ADDR: 1742 1.1 mrg break; 1743 1.1 mrg default: 1744 1.1 mrg gcc_unreachable (); 1745 1.1 mrg } 1746 1.1 mrg better_state (&ref_state, &ref_looping, 1747 1.1 mrg w_l->state_previously_known, 1748 1.1 mrg w_l->looping_previously_known); 1749 1.1 mrg worse_state (&pure_const_state, &looping, 1750 1.1 mrg ref_state, ref_looping, NULL, NULL); 1751 1.1 mrg if (pure_const_state == IPA_NEITHER) 1752 1.1 mrg break; 1753 1.1 mrg } 1754 1.1 mrg w_info = (struct ipa_dfs_info *) w->aux; 1755 1.1 mrg w = w_info->next_cycle; 1756 1.1 mrg } 1757 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1758 1.1 mrg fprintf (dump_file, "Result %s looping %i\n", 1759 1.1 mrg pure_const_names [pure_const_state], 1760 1.1 mrg looping); 1761 1.1 mrg 1762 1.1 mrg /* Find the worst state of can_free for any node in the cycle. */ 1763 1.1 mrg bool can_free = false; 1764 1.1 mrg w = node; 1765 1.1 mrg while (w && !can_free) 1766 1.1 mrg { 1767 1.1 mrg struct cgraph_edge *e; 1768 1.1 mrg funct_state w_l = funct_state_summaries->get (w); 1769 1.1 mrg 1770 1.1 mrg if (w_l->can_free 1771 1.1 mrg || w->get_availability () == AVAIL_INTERPOSABLE 1772 1.1 mrg || w->indirect_calls) 1773 1.1 mrg can_free = true; 1774 1.1 mrg 1775 1.1 mrg for (e = w->callees; e && !can_free; e = e->next_callee) 1776 1.1 mrg { 1777 1.1 mrg enum availability avail; 1778 1.1 mrg struct cgraph_node *y = e->callee-> 1779 1.1 mrg function_or_virtual_thunk_symbol (&avail, 1780 1.1 mrg e->caller); 1781 1.1 mrg 1782 1.1 mrg if (avail > AVAIL_INTERPOSABLE) 1783 1.1 mrg can_free = funct_state_summaries->get (y)->can_free; 1784 1.1 mrg else 1785 1.1 mrg can_free = true; 1786 1.1 mrg } 1787 1.1 mrg w_info = (struct ipa_dfs_info *) w->aux; 1788 1.1 mrg w = w_info->next_cycle; 1789 1.1 mrg } 1790 1.1 mrg 1791 1.1 mrg /* Copy back the region's pure_const_state which is shared by 1792 1.1 mrg all nodes in the region. */ 1793 1.1 mrg w = node; 1794 1.1 mrg while (w) 1795 1.1 mrg { 1796 1.1 mrg funct_state w_l = funct_state_summaries->get (w); 1797 1.1 mrg enum pure_const_state_e this_state = pure_const_state; 1798 1.1 mrg bool this_looping = looping; 1799 1.1 mrg 1800 1.1 mrg w_l->can_free = can_free; 1801 1.1 mrg w->nonfreeing_fn = !can_free; 1802 1.1 mrg if (!can_free && dump_file) 1803 1.1 mrg fprintf (dump_file, "Function found not to call free: %s\n", 1804 1.1 mrg w->dump_name ()); 1805 1.1 mrg 1806 1.1 mrg if (w_l->state_previously_known != IPA_NEITHER 1807 1.1 mrg && this_state > w_l->state_previously_known) 1808 1.1 mrg { 1809 1.1 mrg if (this_state == IPA_NEITHER) 1810 1.1 mrg this_looping = w_l->looping_previously_known; 1811 1.1 mrg this_state = w_l->state_previously_known; 1812 1.1 mrg } 1813 1.1 mrg if (!this_looping && self_recursive_p (w)) 1814 1.1 mrg this_looping = true; 1815 1.1 mrg if (!w_l->looping_previously_known) 1816 1.1 mrg this_looping = false; 1817 1.1 mrg 1818 1.1 mrg /* All nodes within a cycle share the same info. */ 1819 1.1 mrg w_l->pure_const_state = this_state; 1820 1.1 mrg w_l->looping = this_looping; 1821 1.1 mrg 1822 1.1 mrg /* Inline clones share declaration with their offline copies; 1823 1.1 mrg do not modify their declarations since the offline copy may 1824 1.1 mrg be different. */ 1825 1.1 mrg if (!w->inlined_to) 1826 1.1 mrg switch (this_state) 1827 1.1 mrg { 1828 1.1 mrg case IPA_CONST: 1829 1.1 mrg remove_p |= ipa_make_function_const (w, this_looping, false); 1830 1.1 mrg break; 1831 1.1 mrg 1832 1.1 mrg case IPA_PURE: 1833 1.1 mrg remove_p |= ipa_make_function_pure (w, this_looping, false); 1834 1.1 mrg break; 1835 1.1 mrg 1836 1.1 mrg default: 1837 1.1 mrg break; 1838 1.1 mrg } 1839 1.1 mrg w_info = (struct ipa_dfs_info *) w->aux; 1840 1.1 mrg w = w_info->next_cycle; 1841 1.1 mrg } 1842 1.1 mrg } 1843 1.1 mrg 1844 1.1 mrg ipa_free_postorder_info (); 1845 1.1 mrg free (order); 1846 1.1 mrg return remove_p; 1847 1.1 mrg } 1848 1.1 mrg 1849 1.1 mrg /* Produce transitive closure over the callgraph and compute nothrow 1850 1.1 mrg attributes. */ 1851 1.1 mrg 1852 1.1 mrg static void 1853 1.1 mrg propagate_nothrow (void) 1854 1.1 mrg { 1855 1.1 mrg struct cgraph_node *node; 1856 1.1 mrg struct cgraph_node *w; 1857 1.1 mrg struct cgraph_node **order = 1858 1.1 mrg XCNEWVEC (struct cgraph_node *, symtab->cgraph_count); 1859 1.1 mrg int order_pos; 1860 1.1 mrg int i; 1861 1.1 mrg struct ipa_dfs_info * w_info; 1862 1.1 mrg 1863 1.1 mrg order_pos = ipa_reduced_postorder (order, true, 1864 1.1 mrg ignore_edge_for_nothrow); 1865 1.1 mrg if (dump_file) 1866 1.1 mrg { 1867 1.1 mrg cgraph_node::dump_cgraph (dump_file); 1868 1.1 mrg ipa_print_order (dump_file, "reduced for nothrow", order, order_pos); 1869 1.1 mrg } 1870 1.1 mrg 1871 1.1 mrg /* Propagate the local information through the call graph to produce 1872 1.1 mrg the global information. All the nodes within a cycle will have 1873 1.1 mrg the same info so we collapse cycles first. Then we can do the 1874 1.1 mrg propagation in one pass from the leaves to the roots. */ 1875 1.1 mrg for (i = 0; i < order_pos; i++ ) 1876 1.1 mrg { 1877 1.1 mrg bool can_throw = false; 1878 1.1 mrg node = order[i]; 1879 1.1 mrg 1880 1.1 mrg if (node->alias) 1881 1.1 mrg continue; 1882 1.1 mrg 1883 1.1 mrg /* Find the worst state for any node in the cycle. */ 1884 1.1 mrg w = node; 1885 1.1 mrg while (w && !can_throw) 1886 1.1 mrg { 1887 1.1 mrg struct cgraph_edge *e, *ie; 1888 1.1 mrg 1889 1.1 mrg if (!TREE_NOTHROW (w->decl)) 1890 1.1 mrg { 1891 1.1 mrg funct_state w_l = funct_state_summaries->get_create (w); 1892 1.1 mrg 1893 1.1 mrg if (w_l->can_throw 1894 1.1 mrg || w->get_availability () == AVAIL_INTERPOSABLE) 1895 1.1 mrg can_throw = true; 1896 1.1 mrg 1897 1.1 mrg for (e = w->callees; e && !can_throw; e = e->next_callee) 1898 1.1 mrg { 1899 1.1 mrg enum availability avail; 1900 1.1 mrg 1901 1.1 mrg if (!e->can_throw_external || TREE_NOTHROW (e->callee->decl)) 1902 1.1 mrg continue; 1903 1.1 mrg 1904 1.1 mrg struct cgraph_node *y = e->callee-> 1905 1.1 mrg function_or_virtual_thunk_symbol (&avail, 1906 1.1 mrg e->caller); 1907 1.1 mrg 1908 1.1 mrg /* We can use info about the callee only if we know it 1909 1.1 mrg cannot be interposed. 1910 1.1 mrg When callee is compiled with non-call exceptions we also 1911 1.1 mrg must check that the declaration is bound to current 1912 1.1 mrg body as other semantically equivalent body may still 1913 1.1 mrg throw. */ 1914 1.1 mrg if (avail <= AVAIL_INTERPOSABLE 1915 1.1 mrg || (!TREE_NOTHROW (y->decl) 1916 1.1 mrg && (funct_state_summaries->get_create (y)->can_throw 1917 1.1 mrg || (opt_for_fn (y->decl, flag_non_call_exceptions) 1918 1.1 mrg && !e->callee->binds_to_current_def_p (w))))) 1919 1.1 mrg can_throw = true; 1920 1.1 mrg } 1921 1.1 mrg for (ie = w->indirect_calls; ie && !can_throw; 1922 1.1 mrg ie = ie->next_callee) 1923 1.1 mrg if (ie->can_throw_external 1924 1.1 mrg && !(ie->indirect_info->ecf_flags & ECF_NOTHROW)) 1925 1.1 mrg can_throw = true; 1926 1.1 mrg } 1927 1.1 mrg w_info = (struct ipa_dfs_info *) w->aux; 1928 1.1 mrg w = w_info->next_cycle; 1929 1.1 mrg } 1930 1.1 mrg 1931 1.1 mrg /* Copy back the region's pure_const_state which is shared by 1932 1.1 mrg all nodes in the region. */ 1933 1.1 mrg w = node; 1934 1.1 mrg while (w) 1935 1.1 mrg { 1936 1.1 mrg funct_state w_l = funct_state_summaries->get_create (w); 1937 1.1 mrg if (!can_throw && !TREE_NOTHROW (w->decl)) 1938 1.1 mrg { 1939 1.1 mrg /* Inline clones share declaration with their offline copies; 1940 1.1 mrg do not modify their declarations since the offline copy may 1941 1.1 mrg be different. */ 1942 1.1 mrg if (!w->inlined_to) 1943 1.1 mrg { 1944 1.1 mrg w->set_nothrow_flag (true); 1945 1.1 mrg if (dump_file) 1946 1.1 mrg fprintf (dump_file, "Function found to be nothrow: %s\n", 1947 1.1 mrg w->dump_name ()); 1948 1.1 mrg } 1949 1.1 mrg } 1950 1.1 mrg else if (can_throw && !TREE_NOTHROW (w->decl)) 1951 1.1 mrg w_l->can_throw = true; 1952 1.1 mrg w_info = (struct ipa_dfs_info *) w->aux; 1953 1.1 mrg w = w_info->next_cycle; 1954 1.1 mrg } 1955 1.1 mrg } 1956 1.1 mrg 1957 1.1 mrg ipa_free_postorder_info (); 1958 1.1 mrg free (order); 1959 1.1 mrg } 1960 1.1 mrg 1961 1.1 mrg /* Debugging function to dump state of malloc lattice. */ 1962 1.1 mrg 1963 1.1 mrg DEBUG_FUNCTION 1964 1.1 mrg static void 1965 1.1 mrg dump_malloc_lattice (FILE *dump_file, const char *s) 1966 1.1 mrg { 1967 1.1 mrg if (!dump_file) 1968 1.1 mrg return; 1969 1.1 mrg 1970 1.1 mrg fprintf (dump_file, "\n\nMALLOC LATTICE %s:\n", s); 1971 1.1 mrg cgraph_node *node; 1972 1.1 mrg FOR_EACH_FUNCTION (node) 1973 1.1 mrg { 1974 1.1 mrg funct_state fs = funct_state_summaries->get (node); 1975 1.1 mrg if (fs) 1976 1.1 mrg fprintf (dump_file, "%s: %s\n", node->dump_name (), 1977 1.1 mrg malloc_state_names[fs->malloc_state]); 1978 1.1 mrg } 1979 1.1 mrg } 1980 1.1 mrg 1981 1.1 mrg /* Propagate malloc attribute across the callgraph. */ 1982 1.1 mrg 1983 1.1 mrg static void 1984 1.1 mrg propagate_malloc (void) 1985 1.1 mrg { 1986 1.1 mrg cgraph_node *node; 1987 1.1 mrg FOR_EACH_FUNCTION (node) 1988 1.1 mrg { 1989 1.1 mrg if (DECL_IS_MALLOC (node->decl)) 1990 1.1 mrg if (!funct_state_summaries->exists (node)) 1991 1.1 mrg { 1992 1.1 mrg funct_state fs = funct_state_summaries->get_create (node); 1993 1.1 mrg fs->malloc_state = STATE_MALLOC; 1994 1.1 mrg } 1995 1.1 mrg } 1996 1.1 mrg 1997 1.1 mrg dump_malloc_lattice (dump_file, "Initial"); 1998 1.1 mrg struct cgraph_node **order 1999 1.1 mrg = XNEWVEC (struct cgraph_node *, symtab->cgraph_count); 2000 1.1 mrg int order_pos = ipa_reverse_postorder (order); 2001 1.1 mrg bool changed = true; 2002 1.1 mrg 2003 1.1 mrg while (changed) 2004 1.1 mrg { 2005 1.1 mrg changed = false; 2006 1.1 mrg /* Walk in postorder. */ 2007 1.1 mrg for (int i = order_pos - 1; i >= 0; --i) 2008 1.1 mrg { 2009 1.1 mrg cgraph_node *node = order[i]; 2010 1.1 mrg if (node->alias 2011 1.1 mrg || !node->definition 2012 1.1 mrg || !funct_state_summaries->exists (node)) 2013 1.1 mrg continue; 2014 1.1 mrg 2015 1.1 mrg funct_state l = funct_state_summaries->get (node); 2016 1.1 mrg 2017 1.1 mrg /* FIXME: add support for indirect-calls. */ 2018 1.1 mrg if (node->indirect_calls) 2019 1.1 mrg { 2020 1.1 mrg l->malloc_state = STATE_MALLOC_BOTTOM; 2021 1.1 mrg continue; 2022 1.1 mrg } 2023 1.1 mrg 2024 1.1 mrg if (node->get_availability () <= AVAIL_INTERPOSABLE) 2025 1.1 mrg { 2026 1.1 mrg l->malloc_state = STATE_MALLOC_BOTTOM; 2027 1.1 mrg continue; 2028 1.1 mrg } 2029 1.1 mrg 2030 1.1 mrg if (l->malloc_state == STATE_MALLOC_BOTTOM) 2031 1.1 mrg continue; 2032 1.1 mrg 2033 1.1 mrg auto_vec<cgraph_node *, 16> callees; 2034 1.1 mrg for (cgraph_edge *cs = node->callees; cs; cs = cs->next_callee) 2035 1.1 mrg { 2036 1.1 mrg ipa_call_summary *es = ipa_call_summaries->get_create (cs); 2037 1.1 mrg if (es && es->is_return_callee_uncaptured) 2038 1.1 mrg callees.safe_push (cs->callee); 2039 1.1 mrg } 2040 1.1 mrg 2041 1.1 mrg malloc_state_e new_state = l->malloc_state; 2042 1.1 mrg for (unsigned j = 0; j < callees.length (); j++) 2043 1.1 mrg { 2044 1.1 mrg cgraph_node *callee = callees[j]; 2045 1.1 mrg if (!funct_state_summaries->exists (node)) 2046 1.1 mrg { 2047 1.1 mrg new_state = STATE_MALLOC_BOTTOM; 2048 1.1 mrg break; 2049 1.1 mrg } 2050 1.1 mrg malloc_state_e callee_state 2051 1.1 mrg = funct_state_summaries->get_create (callee)->malloc_state; 2052 1.1 mrg if (new_state < callee_state) 2053 1.1 mrg new_state = callee_state; 2054 1.1 mrg } 2055 1.1 mrg if (new_state != l->malloc_state) 2056 1.1 mrg { 2057 1.1 mrg changed = true; 2058 1.1 mrg l->malloc_state = new_state; 2059 1.1 mrg } 2060 1.1 mrg } 2061 1.1 mrg } 2062 1.1 mrg 2063 1.1 mrg FOR_EACH_DEFINED_FUNCTION (node) 2064 1.1 mrg if (funct_state_summaries->exists (node)) 2065 1.1 mrg { 2066 1.1 mrg funct_state l = funct_state_summaries->get (node); 2067 1.1 mrg if (!node->alias 2068 1.1 mrg && l->malloc_state == STATE_MALLOC 2069 1.1 mrg && !node->inlined_to 2070 1.1 mrg && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (node->decl)))) 2071 1.1 mrg { 2072 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 2073 1.1 mrg fprintf (dump_file, "Function %s found to be malloc\n", 2074 1.1 mrg node->dump_name ()); 2075 1.1 mrg 2076 1.1 mrg bool malloc_decl_p = DECL_IS_MALLOC (node->decl); 2077 1.1 mrg node->set_malloc_flag (true); 2078 1.1 mrg if (!malloc_decl_p && warn_suggest_attribute_malloc) 2079 1.1 mrg warn_function_malloc (node->decl); 2080 1.1 mrg } 2081 1.1 mrg } 2082 1.1 mrg 2083 1.1 mrg dump_malloc_lattice (dump_file, "after propagation"); 2084 1.1 mrg ipa_free_postorder_info (); 2085 1.1 mrg free (order); 2086 1.1 mrg } 2087 1.1 mrg 2088 1.1 mrg /* Produce the global information by preforming a transitive closure 2089 1.1 mrg on the local information that was produced by generate_summary. */ 2090 1.1 mrg 2091 1.1 mrg unsigned int 2092 1.1 mrg pass_ipa_pure_const:: 2093 1.1 mrg execute (function *) 2094 1.1 mrg { 2095 1.1 mrg bool remove_p; 2096 1.1 mrg 2097 1.1 mrg /* Nothrow makes more function to not lead to return and improve 2098 1.1 mrg later analysis. */ 2099 1.1 mrg propagate_nothrow (); 2100 1.1 mrg propagate_malloc (); 2101 1.1 mrg remove_p = propagate_pure_const (); 2102 1.1 mrg 2103 1.1 mrg delete funct_state_summaries; 2104 1.1 mrg return remove_p ? TODO_remove_functions : 0; 2105 1.1 mrg } 2106 1.1 mrg 2107 1.1 mrg static bool 2108 1.1 mrg gate_pure_const (void) 2109 1.1 mrg { 2110 1.1 mrg return flag_ipa_pure_const || in_lto_p; 2111 1.1 mrg } 2112 1.1 mrg 2113 1.1 mrg pass_ipa_pure_const::pass_ipa_pure_const(gcc::context *ctxt) 2114 1.1 mrg : ipa_opt_pass_d(pass_data_ipa_pure_const, ctxt, 2115 1.1 mrg pure_const_generate_summary, /* generate_summary */ 2116 1.1 mrg pure_const_write_summary, /* write_summary */ 2117 1.1 mrg pure_const_read_summary, /* read_summary */ 2118 1.1 mrg NULL, /* write_optimization_summary */ 2119 1.1 mrg NULL, /* read_optimization_summary */ 2120 1.1 mrg NULL, /* stmt_fixup */ 2121 1.1 mrg 0, /* function_transform_todo_flags_start */ 2122 1.1 mrg NULL, /* function_transform */ 2123 1.1 mrg NULL), /* variable_transform */ 2124 1.1 mrg init_p (false) {} 2125 1.1 mrg 2126 1.1 mrg ipa_opt_pass_d * 2127 1.1 mrg make_pass_ipa_pure_const (gcc::context *ctxt) 2128 1.1 mrg { 2129 1.1 mrg return new pass_ipa_pure_const (ctxt); 2130 1.1 mrg } 2131 1.1 mrg 2132 1.1 mrg /* Simple local pass for pure const discovery reusing the analysis from 2133 1.1 mrg ipa_pure_const. This pass is effective when executed together with 2134 1.1 mrg other optimization passes in early optimization pass queue. */ 2135 1.1 mrg 2136 1.1 mrg namespace { 2137 1.1 mrg 2138 1.1 mrg const pass_data pass_data_local_pure_const = 2139 1.1 mrg { 2140 1.1 mrg GIMPLE_PASS, /* type */ 2141 1.1 mrg "local-pure-const", /* name */ 2142 1.1 mrg OPTGROUP_NONE, /* optinfo_flags */ 2143 1.1 mrg TV_IPA_PURE_CONST, /* tv_id */ 2144 1.1 mrg 0, /* properties_required */ 2145 1.1 mrg 0, /* properties_provided */ 2146 1.1 mrg 0, /* properties_destroyed */ 2147 1.1 mrg 0, /* todo_flags_start */ 2148 1.1 mrg 0, /* todo_flags_finish */ 2149 1.1 mrg }; 2150 1.1 mrg 2151 1.1 mrg class pass_local_pure_const : public gimple_opt_pass 2152 1.1 mrg { 2153 1.1 mrg public: 2154 1.1 mrg pass_local_pure_const (gcc::context *ctxt) 2155 1.1 mrg : gimple_opt_pass (pass_data_local_pure_const, ctxt) 2156 1.1 mrg {} 2157 1.1 mrg 2158 1.1 mrg /* opt_pass methods: */ 2159 1.1 mrg opt_pass * clone () { return new pass_local_pure_const (m_ctxt); } 2160 1.1 mrg virtual bool gate (function *) { return gate_pure_const (); } 2161 1.1 mrg virtual unsigned int execute (function *); 2162 1.1 mrg 2163 1.1 mrg }; // class pass_local_pure_const 2164 1.1 mrg 2165 1.1 mrg unsigned int 2166 1.1 mrg pass_local_pure_const::execute (function *fun) 2167 1.1 mrg { 2168 1.1 mrg bool changed = false; 2169 1.1 mrg funct_state l; 2170 1.1 mrg bool skip; 2171 1.1 mrg struct cgraph_node *node; 2172 1.1 mrg 2173 1.1 mrg node = cgraph_node::get (current_function_decl); 2174 1.1 mrg skip = skip_function_for_local_pure_const (node); 2175 1.1 mrg 2176 1.1 mrg if (!warn_suggest_attribute_const 2177 1.1 mrg && !warn_suggest_attribute_pure 2178 1.1 mrg && skip) 2179 1.1 mrg return 0; 2180 1.1 mrg 2181 1.1 mrg l = analyze_function (node, false); 2182 1.1 mrg 2183 1.1 mrg /* Do NORETURN discovery. */ 2184 1.1 mrg if (!skip && !TREE_THIS_VOLATILE (current_function_decl) 2185 1.1 mrg && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) == 0) 2186 1.1 mrg { 2187 1.1 mrg warn_function_noreturn (fun->decl); 2188 1.1 mrg if (dump_file) 2189 1.1 mrg fprintf (dump_file, "Function found to be noreturn: %s\n", 2190 1.1 mrg current_function_name ()); 2191 1.1 mrg 2192 1.1 mrg /* Update declaration and reduce profile to executed once. */ 2193 1.1 mrg if (cgraph_node::get (current_function_decl)->set_noreturn_flag (true)) 2194 1.1 mrg changed = true; 2195 1.1 mrg if (node->frequency > NODE_FREQUENCY_EXECUTED_ONCE) 2196 1.1 mrg node->frequency = NODE_FREQUENCY_EXECUTED_ONCE; 2197 1.1 mrg } 2198 1.1 mrg 2199 1.1 mrg switch (l->pure_const_state) 2200 1.1 mrg { 2201 1.1 mrg case IPA_CONST: 2202 1.1 mrg changed |= ipa_make_function_const 2203 1.1 mrg (cgraph_node::get (current_function_decl), l->looping, true); 2204 1.1 mrg break; 2205 1.1 mrg 2206 1.1 mrg case IPA_PURE: 2207 1.1 mrg changed |= ipa_make_function_pure 2208 1.1 mrg (cgraph_node::get (current_function_decl), l->looping, true); 2209 1.1 mrg break; 2210 1.1 mrg 2211 1.1 mrg default: 2212 1.1 mrg break; 2213 1.1 mrg } 2214 1.1 mrg if (!l->can_throw && !TREE_NOTHROW (current_function_decl)) 2215 1.1 mrg { 2216 1.1 mrg node->set_nothrow_flag (true); 2217 1.1 mrg changed = true; 2218 1.1 mrg if (dump_file) 2219 1.1 mrg fprintf (dump_file, "Function found to be nothrow: %s\n", 2220 1.1 mrg current_function_name ()); 2221 1.1 mrg } 2222 1.1 mrg 2223 1.1 mrg if (l->malloc_state == STATE_MALLOC 2224 1.1 mrg && !DECL_IS_MALLOC (current_function_decl)) 2225 1.1 mrg { 2226 1.1 mrg node->set_malloc_flag (true); 2227 1.1 mrg if (warn_suggest_attribute_malloc) 2228 1.1 mrg warn_function_malloc (node->decl); 2229 1.1 mrg changed = true; 2230 1.1 mrg if (dump_file) 2231 1.1 mrg fprintf (dump_file, "Function found to be malloc: %s\n", 2232 1.1 mrg node->dump_name ()); 2233 1.1 mrg } 2234 1.1 mrg 2235 1.1 mrg free (l); 2236 1.1 mrg if (changed) 2237 1.1 mrg return execute_fixup_cfg (); 2238 1.1 mrg else 2239 1.1 mrg return 0; 2240 1.1 mrg } 2241 1.1 mrg 2242 1.1 mrg } // anon namespace 2243 1.1 mrg 2244 1.1 mrg gimple_opt_pass * 2245 1.1 mrg make_pass_local_pure_const (gcc::context *ctxt) 2246 1.1 mrg { 2247 1.1 mrg return new pass_local_pure_const (ctxt); 2248 1.1 mrg } 2249 1.1 mrg 2250 1.1 mrg /* Emit noreturn warnings. */ 2251 1.1 mrg 2252 1.1 mrg namespace { 2253 1.1 mrg 2254 1.1 mrg const pass_data pass_data_warn_function_noreturn = 2255 1.1 mrg { 2256 1.1 mrg GIMPLE_PASS, /* type */ 2257 1.1 mrg "*warn_function_noreturn", /* name */ 2258 1.1 mrg OPTGROUP_NONE, /* optinfo_flags */ 2259 1.1 mrg TV_NONE, /* tv_id */ 2260 1.1 mrg PROP_cfg, /* properties_required */ 2261 1.1 mrg 0, /* properties_provided */ 2262 1.1 mrg 0, /* properties_destroyed */ 2263 1.1 mrg 0, /* todo_flags_start */ 2264 1.1 mrg 0, /* todo_flags_finish */ 2265 1.1 mrg }; 2266 1.1 mrg 2267 1.1 mrg class pass_warn_function_noreturn : public gimple_opt_pass 2268 1.1 mrg { 2269 1.1 mrg public: 2270 1.1 mrg pass_warn_function_noreturn (gcc::context *ctxt) 2271 1.1 mrg : gimple_opt_pass (pass_data_warn_function_noreturn, ctxt) 2272 1.1 mrg {} 2273 1.1 mrg 2274 1.1 mrg /* opt_pass methods: */ 2275 1.1 mrg virtual bool gate (function *) { return warn_suggest_attribute_noreturn; } 2276 1.1 mrg virtual unsigned int execute (function *fun) 2277 1.1 mrg { 2278 1.1 mrg if (!TREE_THIS_VOLATILE (current_function_decl) 2279 1.1 mrg && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) == 0) 2280 1.1 mrg warn_function_noreturn (current_function_decl); 2281 1.1 mrg return 0; 2282 1.1 mrg } 2283 1.1 mrg 2284 1.1 mrg }; // class pass_warn_function_noreturn 2285 1.1 mrg 2286 1.1 mrg } // anon namespace 2287 1.1 mrg 2288 1.1 mrg gimple_opt_pass * 2289 1.1 mrg make_pass_warn_function_noreturn (gcc::context *ctxt) 2290 1.1 mrg { 2291 1.1 mrg return new pass_warn_function_noreturn (ctxt); 2292 1.1 mrg } 2293 1.1 mrg 2294 1.1 mrg /* Simple local pass for pure const discovery reusing the analysis from 2295 1.1 mrg ipa_pure_const. This pass is effective when executed together with 2296 1.1 mrg other optimization passes in early optimization pass queue. */ 2297 1.1 mrg 2298 1.1 mrg namespace { 2299 1.1 mrg 2300 1.1 mrg const pass_data pass_data_nothrow = 2301 1.1 mrg { 2302 1.1 mrg GIMPLE_PASS, /* type */ 2303 1.1 mrg "nothrow", /* name */ 2304 1.1 mrg OPTGROUP_NONE, /* optinfo_flags */ 2305 1.1 mrg TV_IPA_PURE_CONST, /* tv_id */ 2306 1.1 mrg 0, /* properties_required */ 2307 1.1 mrg 0, /* properties_provided */ 2308 1.1 mrg 0, /* properties_destroyed */ 2309 1.1 mrg 0, /* todo_flags_start */ 2310 1.1 mrg 0, /* todo_flags_finish */ 2311 1.1 mrg }; 2312 1.1 mrg 2313 1.1 mrg class pass_nothrow : public gimple_opt_pass 2314 1.1 mrg { 2315 1.1 mrg public: 2316 1.1 mrg pass_nothrow (gcc::context *ctxt) 2317 1.1 mrg : gimple_opt_pass (pass_data_nothrow, ctxt) 2318 1.1 mrg {} 2319 1.1 mrg 2320 1.1 mrg /* opt_pass methods: */ 2321 1.1 mrg opt_pass * clone () { return new pass_nothrow (m_ctxt); } 2322 1.1 mrg virtual bool gate (function *) { return optimize; } 2323 1.1 mrg virtual unsigned int execute (function *); 2324 1.1 mrg 2325 1.1 mrg }; // class pass_nothrow 2326 1.1 mrg 2327 1.1 mrg unsigned int 2328 1.1 mrg pass_nothrow::execute (function *) 2329 1.1 mrg { 2330 1.1 mrg struct cgraph_node *node; 2331 1.1 mrg basic_block this_block; 2332 1.1 mrg 2333 1.1 mrg if (TREE_NOTHROW (current_function_decl)) 2334 1.1 mrg return 0; 2335 1.1 mrg 2336 1.1 mrg node = cgraph_node::get (current_function_decl); 2337 1.1 mrg 2338 1.1 mrg /* We run during lowering, we cannot really use availability yet. */ 2339 1.1 mrg if (cgraph_node::get (current_function_decl)->get_availability () 2340 1.1 mrg <= AVAIL_INTERPOSABLE) 2341 1.1 mrg { 2342 1.1 mrg if (dump_file) 2343 1.1 mrg fprintf (dump_file, "Function is interposable;" 2344 1.1 mrg " not analyzing.\n"); 2345 1.1 mrg return true; 2346 1.1 mrg } 2347 1.1 mrg 2348 1.1 mrg FOR_EACH_BB_FN (this_block, cfun) 2349 1.1 mrg { 2350 1.1 mrg for (gimple_stmt_iterator gsi = gsi_start_bb (this_block); 2351 1.1 mrg !gsi_end_p (gsi); 2352 1.1 mrg gsi_next (&gsi)) 2353 1.1 mrg if (stmt_can_throw_external (cfun, gsi_stmt (gsi))) 2354 1.1 mrg { 2355 1.1 mrg if (is_gimple_call (gsi_stmt (gsi))) 2356 1.1 mrg { 2357 1.1 mrg tree callee_t = gimple_call_fndecl (gsi_stmt (gsi)); 2358 1.1 mrg if (callee_t && recursive_call_p (current_function_decl, 2359 1.1 mrg callee_t)) 2360 1.1 mrg continue; 2361 1.1 mrg } 2362 1.1 mrg 2363 1.1 mrg if (dump_file) 2364 1.1 mrg { 2365 1.1 mrg fprintf (dump_file, "Statement can throw: "); 2366 1.1 mrg print_gimple_stmt (dump_file, gsi_stmt (gsi), 0); 2367 1.1 mrg } 2368 1.1 mrg return 0; 2369 1.1 mrg } 2370 1.1 mrg } 2371 1.1 mrg 2372 1.1 mrg node->set_nothrow_flag (true); 2373 1.1 mrg 2374 1.1 mrg bool cfg_changed = false; 2375 1.1 mrg if (self_recursive_p (node)) 2376 1.1 mrg FOR_EACH_BB_FN (this_block, cfun) 2377 1.1 mrg if (gimple *g = last_stmt (this_block)) 2378 1.1 mrg if (is_gimple_call (g)) 2379 1.1 mrg { 2380 1.1 mrg tree callee_t = gimple_call_fndecl (g); 2381 1.1 mrg if (callee_t 2382 1.1 mrg && recursive_call_p (current_function_decl, callee_t) 2383 1.1 mrg && maybe_clean_eh_stmt (g) 2384 1.1 mrg && gimple_purge_dead_eh_edges (this_block)) 2385 1.1 mrg cfg_changed = true; 2386 1.1 mrg } 2387 1.1 mrg 2388 1.1 mrg if (dump_file) 2389 1.1 mrg fprintf (dump_file, "Function found to be nothrow: %s\n", 2390 1.1 mrg current_function_name ()); 2391 1.1 mrg return cfg_changed ? TODO_cleanup_cfg : 0; 2392 1.1 mrg } 2393 1.1 mrg 2394 1.1 mrg } // anon namespace 2395 1.1 mrg 2396 1.1 mrg gimple_opt_pass * 2397 1.1 mrg make_pass_nothrow (gcc::context *ctxt) 2398 1.1 mrg { 2399 1.1 mrg return new pass_nothrow (ctxt); 2400 } 2401