diff options
author | Richard Biener <rguenther@suse.de> | 2020-11-16 08:40:47 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-11-16 09:33:04 +0100 |
commit | aaccdb9cec423ef4de9d541dbe0a95fa3346f430 (patch) | |
tree | 585364478cd3954671d8105807738ce55bb913ae | |
parent | c2099c1670f195d37fadee11bd097dd92bc60e46 (diff) | |
download | gcc-aaccdb9cec423ef4de9d541dbe0a95fa3346f430.zip gcc-aaccdb9cec423ef4de9d541dbe0a95fa3346f430.tar.gz gcc-aaccdb9cec423ef4de9d541dbe0a95fa3346f430.tar.bz2 |
tree-optimization/97830 - fix compare of incomplete type size in VN
This avoids passing NULL to expressions_equal_p.
2020-11-16 Richard Biener <rguenther@suse.de>
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.
-rw-r--r-- | gcc/testsuite/gcc.dg/pr97830.c | 24 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 5 |
2 files changed, 28 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/pr97830.c b/gcc/testsuite/gcc.dg/pr97830.c new file mode 100644 index 0000000..3729a65 --- /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 4d78054..81990fc 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) |