From 4886ec8e709d547391d199bd88579d0f523f4e2d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 4 Feb 2015 23:32:36 +0100 Subject: [PATCH] re PR middle-end/64824 (ICE in gimple verification) PR c/64824 PR c/64868 gcc/c/ * c-parser.c (c_parser_omp_atomic): Handle RDIV_EXPR. gcc/cp/ * parser.c (cp_parser_omp_atomic): Handle RDIV_EXPR. gcc/c-family/ * c-omp.c (c_finish_omp_atomic): Use TRUNC_DIV_EXPR instead of RDIV_EXPR. Use build_binary_op instead of build2_loc. libgomp/ * testsuite/libgomp.c/pr64824.c: New test. * testsuite/libgomp.c/pr64868.c: New test. * testsuite/libgomp.c++/pr64824.C: New test. * testsuite/libgomp.c++/pr64868.C: New test. From-SVN: r220420 --- gcc/c-family/ChangeLog | 8 +++ gcc/c-family/c-omp.c | 5 +- gcc/c/ChangeLog | 6 ++ gcc/c/c-parser.c | 1 + gcc/cp/ChangeLog | 6 ++ gcc/cp/parser.c | 1 + libgomp/ChangeLog | 9 +++ libgomp/testsuite/libgomp.c++/pr64824.C | 5 ++ libgomp/testsuite/libgomp.c++/pr64868.C | 5 ++ libgomp/testsuite/libgomp.c/pr64824.c | 16 +++++ libgomp/testsuite/libgomp.c/pr64868.c | 87 +++++++++++++++++++++++++ 11 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 libgomp/testsuite/libgomp.c++/pr64824.C create mode 100644 libgomp/testsuite/libgomp.c++/pr64868.C create mode 100644 libgomp/testsuite/libgomp.c/pr64824.c create mode 100644 libgomp/testsuite/libgomp.c/pr64868.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 9764b7c144a..6e4553af921 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,11 @@ +2015-02-04 Jakub Jelinek + + PR c/64824 + PR c/64868 + * c-omp.c (c_finish_omp_atomic): Use TRUNC_DIV_EXPR + instead of RDIV_EXPR. Use build_binary_op instead of + build2_loc. + 2015-01-30 Joseph Myers * c-opts.c, c-pch.c, cppspec.c: All callers of fatal_error changed diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index 87150459f81..86a9f54b806 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -206,6 +206,9 @@ c_finish_omp_atomic (location_t loc, enum tree_code code, return error_mark_node; } + if (opcode == RDIV_EXPR) + opcode = TRUNC_DIV_EXPR; + /* ??? Validate that rhs does not overlap lhs. */ /* Take and save the address of the lhs. From then on we'll reference it @@ -240,7 +243,7 @@ c_finish_omp_atomic (location_t loc, enum tree_code code, to do this, and then take it apart again. */ if (swapped) { - rhs = build2_loc (loc, opcode, TREE_TYPE (lhs), rhs, lhs); + rhs = build_binary_op (loc, opcode, rhs, lhs, 1); opcode = NOP_EXPR; } bool save = in_late_binary_op; diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index f90efeb38bb..4c822f4ca09 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2015-02-04 Jakub Jelinek + + PR c/64824 + PR c/64868 + * c-parser.c (c_parser_omp_atomic): Handle RDIV_EXPR. + 2015-02-02 Bruno Loff * c-parser.c (c_parser_declspecs): Call invoke_plugin_callbacks after diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 0387f0e698f..982ba6a894c 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -12611,6 +12611,7 @@ restart: { case MULT_EXPR: case TRUNC_DIV_EXPR: + case RDIV_EXPR: case PLUS_EXPR: case MINUS_EXPR: case LSHIFT_EXPR: diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 60d7e676d95..3ab1d77a362 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-02-04 Jakub Jelinek + + PR c/64824 + PR c/64868 + * parser.c (cp_parser_omp_atomic): Handle RDIV_EXPR. + 2015-02-03 Paolo Carlini PR c++/64877 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7168aba358c..57dfbcc4117 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -29835,6 +29835,7 @@ restart: { case MULT_EXPR: case TRUNC_DIV_EXPR: + case RDIV_EXPR: case PLUS_EXPR: case MINUS_EXPR: case LSHIFT_EXPR: diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 104d42cd3b9..21b42d154e8 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,12 @@ +2015-02-04 Jakub Jelinek + + PR c/64824 + PR c/64868 + * testsuite/libgomp.c/pr64824.c: New test. + * testsuite/libgomp.c/pr64868.c: New test. + * testsuite/libgomp.c++/pr64824.C: New test. + * testsuite/libgomp.c++/pr64868.C: New test. + 2015-02-01 David Edelsohn PR libgomp/64635 diff --git a/libgomp/testsuite/libgomp.c++/pr64824.C b/libgomp/testsuite/libgomp.c++/pr64824.C new file mode 100644 index 00000000000..348f6d6e0c2 --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/pr64824.C @@ -0,0 +1,5 @@ +// PR c/64824 +// { dg-do run } +// { dg-options "-O2 -fopenmp" } + +#include "../libgomp.c/pr64824.c" diff --git a/libgomp/testsuite/libgomp.c++/pr64868.C b/libgomp/testsuite/libgomp.c++/pr64868.C new file mode 100644 index 00000000000..2d730ac4924 --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/pr64868.C @@ -0,0 +1,5 @@ +// PR c/64868 +// { dg-do run } +// { dg-options "-O2 -fopenmp" } + +#include "../libgomp.c/pr64868.c" diff --git a/libgomp/testsuite/libgomp.c/pr64824.c b/libgomp/testsuite/libgomp.c/pr64824.c new file mode 100644 index 00000000000..544d0b0fc1f --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr64824.c @@ -0,0 +1,16 @@ +/* PR c/64824 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fopenmp" } */ + +int +main () +{ + long long a; + long long b = 1LL; + int c = 3; +#pragma omp atomic capture + a = b = c << b; + if (b != 6LL || a != 6LL) + __builtin_abort (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr64868.c b/libgomp/testsuite/libgomp.c/pr64868.c new file mode 100644 index 00000000000..acdf9984108 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr64868.c @@ -0,0 +1,87 @@ +/* PR c/64868 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fopenmp" } */ + +float f = 2.0f; +double d = 4.0; +long double ld = 8.0L; + +void +foo () +{ +#pragma omp atomic + f = 1.0f / f; +#pragma omp atomic + f = 1 / f; +#pragma omp atomic + f = f / 2.0f; +#pragma omp atomic + f = f / 2; +#pragma omp atomic + f /= 2.0f; +#pragma omp atomic + f /= 2; +#pragma omp atomic + d = 1.0 / d; +#pragma omp atomic + d = 1 / d; +#pragma omp atomic + d = d / 2.0; +#pragma omp atomic + d = d / 2; +#pragma omp atomic + d /= 2.0; +#pragma omp atomic + d /= 2; +#pragma omp atomic + ld = 1.0L / ld; +#pragma omp atomic + ld = 1 / ld; +#pragma omp atomic + ld = ld / 2.0L; +#pragma omp atomic + ld = ld / 2; +#pragma omp atomic + ld /= 2.0L; +#pragma omp atomic + ld /= 2; + if (f != 0.125f || d != 0.25 || ld != 0.5L) + __builtin_abort (); +} + +#ifdef __cplusplus +template +void +bar () +{ + T v = ::d; +#pragma omp atomic + v *= 16; +#pragma omp atomic + v = 1.0 / v; +#pragma omp atomic + v = N1 / v; +#pragma omp atomic + v = v / 2.0; +#pragma omp atomic + v = v / N2; +#pragma omp atomic + v /= 2.0; +#pragma omp atomic + v /= N2; + if (v != 0.25) + __builtin_abort (); +} +#endif + +int +main () +{ + foo (); +#ifdef __cplusplus + bar (); + bar (); + bar (); +#endif + return 0; +} -- 2.30.2