aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/internal-fn.def3
-rw-r--r--gcc/testsuite/gcc.dg/pr106099.c10
-rw-r--r--gcc/tree-cfg.cc14
3 files changed, 19 insertions, 8 deletions
diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def
index 7bf661c..5e67218 100644
--- a/gcc/internal-fn.def
+++ b/gcc/internal-fn.def
@@ -458,7 +458,8 @@ DEF_INTERNAL_FN (SPACESHIP, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL)
/* __builtin_trap created from/for __builtin_unreachable. */
DEF_INTERNAL_FN (TRAP, ECF_CONST | ECF_LEAF | ECF_NORETURN
- | ECF_NOTHROW | ECF_COLD, NULL)
+ | ECF_NOTHROW | ECF_COLD | ECF_LOOPING_CONST_OR_PURE,
+ NULL)
#undef DEF_INTERNAL_INT_FN
#undef DEF_INTERNAL_FLT_FN
diff --git a/gcc/testsuite/gcc.dg/pr106099.c b/gcc/testsuite/gcc.dg/pr106099.c
new file mode 100644
index 0000000..01b1144
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr106099.c
@@ -0,0 +1,10 @@
+/* PR tree-optimization/106099 */
+/* { dg-do compile } */
+/* { dg-options "-O -fharden-compares -fno-tree-forwprop -fno-tree-ch -fno-tree-dominator-opts -fno-tree-ccp -funreachable-traps --param=scev-max-expr-size=1" } */
+
+void
+foo (void)
+{
+ for (unsigned i = 0; i == 0; i++)
+ __builtin_printf ("%d", i);
+}
diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
index 5bcf781..91ec33c 100644
--- a/gcc/tree-cfg.cc
+++ b/gcc/tree-cfg.cc
@@ -9878,16 +9878,16 @@ execute_fixup_cfg (void)
{
if (stmt && is_gimple_call (stmt))
gimple_call_set_ctrl_altering (stmt, false);
- tree fndecl = builtin_decl_unreachable ();
- stmt = gimple_build_call (fndecl, 0);
+ stmt = gimple_build_builtin_unreachable (UNKNOWN_LOCATION);
gimple_stmt_iterator gsi = gsi_last_bb (bb);
gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
if (!cfun->after_inlining)
- {
- gcall *call_stmt = dyn_cast <gcall *> (stmt);
- node->create_edge (cgraph_node::get_create (fndecl),
- call_stmt, bb->count);
- }
+ if (tree fndecl = gimple_call_fndecl (stmt))
+ {
+ gcall *call_stmt = dyn_cast <gcall *> (stmt);
+ node->create_edge (cgraph_node::get_create (fndecl),
+ call_stmt, bb->count);
+ }
}
}
}