re PR c++/80297 (Compiler time crash: type mismatch in binary expression)

PR c++/80297
	* genmatch.c (capture::gen_transform): For GENERIC unshare_expr
	captures used multiple times, except for the last use.
	* generic-match-head.c: Include gimplify.h.

	* g++.dg/torture/pr80297.C: New test.

Co-Authored-By: Richard Biener <rguenther@suse.de>

From-SVN: r246693
This commit is contained in:
Jakub Jelinek 2017-04-04 21:14:47 +02:00 committed by Jakub Jelinek
parent d16e2ddd26
commit e1201dff2f
5 changed files with 36 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2017-04-04 Jakub Jelinek <jakub@redhat.com>
Richard Biener <rguenther@suse.de>
PR c++/80297
* genmatch.c (capture::gen_transform): For GENERIC unshare_expr
captures used multiple times, except for the last use.
* generic-match-head.c: Include gimplify.h.
2017-04-04 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/79390

View File

@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "builtins.h"
#include "dumpfile.h"
#include "case-cfn-macros.h"
#include "gimplify.h"
/* Routine to determine if the types T1 and T2 are effectively

View File

@ -2525,7 +2525,18 @@ capture::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
}
}
fprintf_indent (f, indent, "%s = captures[%u];\n", dest, where);
/* If in GENERIC some capture is used multiple times, unshare it except
when emitting the last use. */
if (!gimple
&& cinfo->info.exists ()
&& cinfo->info[cinfo->info[where].same_as].result_use_count > 1)
{
fprintf_indent (f, indent, "%s = unshare_expr (captures[%u]);\n",
dest, where);
cinfo->info[cinfo->info[where].same_as].result_use_count--;
}
else
fprintf_indent (f, indent, "%s = captures[%u];\n", dest, where);
/* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
with substituting a capture of that. */

View File

@ -1,5 +1,8 @@
2017-04-04 Jakub Jelinek <jakub@redhat.com>
PR c++/80297
* g++.dg/torture/pr80297.C: New test.
PR tree-optimization/79390
* gcc.target/i386/pr79390.c: New test.
* gcc.dg/ifcvt-4.c: Use -mtune-ctrl=^one_if_conv_insn for i?86/x86_64.

View File

@ -0,0 +1,12 @@
// PR c++/80297
// { dg-do compile }
extern const unsigned long int b;
extern const long long int c;
int
foo ()
{
int a = 809 >> -(b & !c) + b - (long long)(b & !c);
return a;
}