From: Richard Biener Date: Mon, 16 Nov 2020 07:40:47 +0000 (+0100) Subject: tree-optimization/97830 - fix compare of incomplete type size in VN X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=aaccdb9cec423ef4de9d541dbe0a95fa3346f430;p=gcc.git tree-optimization/97830 - fix compare of incomplete type size in VN This avoids passing NULL to expressions_equal_p. 2020-11-16 Richard Biener PR tree-optimization/97830 * tree-ssa-sccvn.c (vn_reference_eq): Check for incomplete types before comparing TYPE_SIZE. * gcc.dg/pr97830.c: New testcase. --- diff --git a/gcc/testsuite/gcc.dg/pr97830.c b/gcc/testsuite/gcc.dg/pr97830.c new file mode 100644 index 00000000000..3729a65aec2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97830.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef enum { LangC } cLanguage; +typedef enum { FunctionOneArg, FunctionStandard } cFunctionType; +void *CCTK_CallFunction_function; +cLanguage CCTK_CallFunction_fdata_0; +cFunctionType CCTK_CallFunction_fdata_1; +void CCTK_CallFunction_data() { + void (*standardfunc)(); + int (*oneargfunc)(); + switch (CCTK_CallFunction_fdata_1) { + case FunctionOneArg: + oneargfunc = CCTK_CallFunction_function; + oneargfunc(CCTK_CallFunction_data); + break; + case FunctionStandard: + switch (CCTK_CallFunction_fdata_0) { + case LangC: + standardfunc = CCTK_CallFunction_function; + standardfunc(CCTK_CallFunction_data); + } + } +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 4d78054b1e0..81990fcbd34 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -702,7 +702,10 @@ vn_reference_eq (const_vn_reference_t const vr1, const_vn_reference_t const vr2) if (vr1->operands == vr2->operands) return true; - if (!expressions_equal_p (TYPE_SIZE (vr1->type), TYPE_SIZE (vr2->type))) + if (COMPLETE_TYPE_P (vr1->type) != COMPLETE_TYPE_P (vr2->type) + || (COMPLETE_TYPE_P (vr1->type) + && !expressions_equal_p (TYPE_SIZE (vr1->type), + TYPE_SIZE (vr2->type)))) return false; if (INTEGRAL_TYPE_P (vr1->type)