From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 11607385840B; Sat, 24 Sep 2022 07:31:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 11607385840B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1664004688; bh=bLGmjcvEGdU6Gx1syVDegTMdJgjx7YOmqT1pnpDJCiY=; h=From:To:Subject:Date:From; b=ykK4MiSUyuzn7zB8eAxK5OiBjCsqupuO2J6+jDtFiT/Jvr4egzViDOyh9FL12+JU0 oVNUHFnb0gvsCIjhD52M+Bye00kFECIDspkDxChlebrorjtb8Dhg56bf3xeIezwS4L wT4Q0P5YptRA43Y67zB48jyh3Ax0ZI56qWOPq2uI= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-2828] openmp, c: Tighten up c_tree_equal [PR106981] X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/master X-Git-Oldrev: 4afaeaab52dc9bdb7b24fc08b77dddf8432bc19b X-Git-Newrev: 3c5bccb608c665ac3f62adb1817c42c845812428 Message-Id: <20220924073128.11607385840B@sourceware.org> Date: Sat, 24 Sep 2022 07:31:28 +0000 (GMT) List-Id: https://gcc.gnu.org/g:3c5bccb608c665ac3f62adb1817c42c845812428 commit r13-2828-g3c5bccb608c665ac3f62adb1817c42c845812428 Author: Jakub Jelinek Date: Sat Sep 24 09:19:26 2022 +0200 openmp, c: Tighten up c_tree_equal [PR106981] This patch changes c_tree_equal to work more like cp_tree_equal, be more strict in what it accepts. The ICE on the first testcase was due to INTEGER_CST wi::wide (t1) == wi::wide (t2) comparison which ICEs if the two constants have different precision, but as the second testcase shows, being too lenient in it can also lead to miscompilation of valid OpenMP programs where we think certain expression is the same even when it isn't and can be guaranteed at runtime to represent different memory location. So, the patch looks through only NON_LVALUE_EXPRs and for constants as well as casts requires that the types match before actually comparing the constant values or recursing on the cast operands. 2022-09-24 Jakub Jelinek PR c/106981 gcc/c/ * c-typeck.cc (c_tree_equal): Only strip NON_LVALUE_EXPRs at the start. For CONSTANT_CLASS_P or CASE_CONVERT: return false if t1 and t2 have different types. gcc/testsuite/ * c-c++-common/gomp/pr106981.c: New test. libgomp/ * testsuite/libgomp.c-c++-common/pr106981.c: New test. Diff: --- gcc/c/c-typeck.cc | 16 ++++++++++------ gcc/testsuite/c-c++-common/gomp/pr106981.c | 9 +++++++++ libgomp/testsuite/libgomp.c-c++-common/pr106981.c | 19 +++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index b4ef090836d..ac242b5ed13 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -16051,14 +16051,10 @@ c_tree_equal (tree t1, tree t2) if (!t1 || !t2) return false; - for (code1 = TREE_CODE (t1); - CONVERT_EXPR_CODE_P (code1) - || code1 == NON_LVALUE_EXPR; + for (code1 = TREE_CODE (t1); code1 == NON_LVALUE_EXPR; code1 = TREE_CODE (t1)) t1 = TREE_OPERAND (t1, 0); - for (code2 = TREE_CODE (t2); - CONVERT_EXPR_CODE_P (code2) - || code2 == NON_LVALUE_EXPR; + for (code2 = TREE_CODE (t2); code2 == NON_LVALUE_EXPR; code2 = TREE_CODE (t2)) t2 = TREE_OPERAND (t2, 0); @@ -16069,6 +16065,9 @@ c_tree_equal (tree t1, tree t2) if (code1 != code2) return false; + if (CONSTANT_CLASS_P (t1) && !comptypes (TREE_TYPE (t1), TREE_TYPE (t2))) + return false; + switch (code1) { case INTEGER_CST: @@ -16188,6 +16187,11 @@ c_tree_equal (tree t1, tree t2) return true; } + CASE_CONVERT: + if (!comptypes (TREE_TYPE (t1), TREE_TYPE (t2))) + return false; + break; + default: break; } diff --git a/gcc/testsuite/c-c++-common/gomp/pr106981.c b/gcc/testsuite/c-c++-common/gomp/pr106981.c new file mode 100644 index 00000000000..a21d3c2029d --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr106981.c @@ -0,0 +1,9 @@ +/* PR c/106981 */ +/* { dg-do compile } */ + +void +foo (int a, double *b, double *c, double *d, long long e) +{ +#pragma omp atomic capture + c[a] = d[((int) (e / 10 + 1))] = b[a] + d[((int) e / 10 + 1)]; /* { dg-error "invalid form" } */ +} diff --git a/libgomp/testsuite/libgomp.c-c++-common/pr106981.c b/libgomp/testsuite/libgomp.c-c++-common/pr106981.c new file mode 100644 index 00000000000..ed48d2774f2 --- /dev/null +++ b/libgomp/testsuite/libgomp.c-c++-common/pr106981.c @@ -0,0 +1,19 @@ +/* PR c/106981 */ + +int +main () +{ + int a[0x101]; + unsigned int b = 0x100; + if ((unsigned char) b || (unsigned short) b != 0x100) + return 0; + a[0] = 0; + a[0x100] = 42; + #pragma omp atomic update + a[(unsigned char) b] = a[(unsigned short) b] + a[(unsigned char) b]; + #pragma omp atomic update + a[(unsigned char) b] = a[(unsigned char) b] + a[(unsigned short) b]; + if (a[0] != 84 || a[0x100] != 42) + __builtin_abort (); + return 0; +}