summaryrefslogtreecommitdiff
path: root/gcc/omp-expand.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-08-08 11:07:09 +0200
committerJakub Jelinek <jakub@redhat.com>2020-08-08 11:07:09 +0200
commit87d6dae308d604bad111b1c0bfea7835888eed8d (patch)
treef8720bf06846b88db70af1b92ce017cf640a5fd9 /gcc/omp-expand.c
parent10c8507372f3e1c09df0bfe6449c126dee5075de (diff)
openmp: Avoid floating point comparison at the end of bb with -fnon-call-exceptions
The following testcase ICEs with -fexceptions -fnon-call-exceptions because in that mode floating point comparisons should not be done at the end of bb in GIMPLE_COND. Fixed by forcing it into a bool SSA_NAME and comparing that against false. 2020-08-08 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/96424 * omp-expand.c: Include tree-eh.h. (expand_omp_for_init_vars): Handle -fexceptions -fnon-call-exceptions by forcing floating point comparison into a bool temporary. * c-c++-common/gomp/pr96424.c: New test.
Diffstat (limited to 'gcc/omp-expand.c')
-rw-r--r--gcc/omp-expand.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c
index ea4c77aff98..eb37b38e25d 100644
--- a/gcc/omp-expand.c
+++ b/gcc/omp-expand.c
@@ -58,6 +58,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimple-pretty-print.h"
#include "stringpool.h"
#include "attribs.h"
+#include "tree-eh.h"
/* OMP region information. Every parallel and workshare
directive is enclosed between two markers, the OMP_* directive
@@ -2553,10 +2554,23 @@ expand_omp_for_init_vars (struct omp_for_data *fd, gimple_stmt_iterator *gsi,
flag_rounding_math = save_flag_rounding_math;
t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE, false,
GSI_CONTINUE_LINKING);
- cond_stmt
- = gimple_build_cond (LT_EXPR, t,
- build_zero_cst (double_type_node),
- NULL_TREE, NULL_TREE);
+ if (flag_exceptions
+ && cfun->can_throw_non_call_exceptions
+ && operation_could_trap_p (LT_EXPR, true, false, NULL_TREE))
+ {
+ tree tem = fold_build2 (LT_EXPR, boolean_type_node, t,
+ build_zero_cst (double_type_node));
+ tem = force_gimple_operand_gsi (gsi, tem, true, NULL_TREE,
+ false, GSI_CONTINUE_LINKING);
+ cond_stmt = gimple_build_cond (NE_EXPR, tem,
+ boolean_false_node,
+ NULL_TREE, NULL_TREE);
+ }
+ else
+ cond_stmt
+ = gimple_build_cond (LT_EXPR, t,
+ build_zero_cst (double_type_node),
+ NULL_TREE, NULL_TREE);
gsi_insert_after (gsi, cond_stmt, GSI_CONTINUE_LINKING);
e = split_block (gsi_bb (*gsi), cond_stmt);
basic_block bb1 = e->src;