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.
This commit is contained in:
Richard Biener 2020-11-16 08:40:47 +01:00
parent c2099c1670
commit aaccdb9cec
2 changed files with 28 additions and 1 deletions

View File

@ -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);
}
}
}

View File

@ -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)