From cc4029ee7987de113a4e55a243818dd754245345 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Sun, 8 Sep 2013 23:41:38 +0000 Subject: [PATCH] Fix handling of very long asm statements in inliner An auto generated program with a 6.4mio line asm statement gave with 4.7 and 4.8: xxx.c:6400017:1: internal compiler error: in account_size_time, at ipa-inline-analysis.c:601 The problem is that the inliner counts the number of lines in the asm statement and multiplies that with a weight. With the weight this overflows 32bit signed int, and triggers an assert for negative time. Fix this by limiting the number of lines to 1000 for asm cost estimation. The RTL backend also does similar multiplications for jump shortening. I haven't tried to address this, but presumably it's less likely to result in a failure. gcc/: 2013-09-08 Andi Kleen * tree-inline.c (estimate_num_insns): Limit asm cost to 1000. From-SVN: r202374 --- gcc/ChangeLog | 4 ++++ gcc/tree-inline.c | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4953bba..6f3e0b8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2013-09-08 Andi Kleen + + * tree-inline.c (estimate_num_insns): Limit asm cost to 1000. + 2013-09-08 Jan Hubicka * ipa.c (walk_polymorphic_call_targets): Fix inliner summary update. diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index af26c85..40eb380 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3744,7 +3744,14 @@ estimate_num_insns (gimple stmt, eni_weights *weights) return 0; case GIMPLE_ASM: - return asm_str_count (gimple_asm_string (stmt)); + { + int count = asm_str_count (gimple_asm_string (stmt)); + /* 1000 means infinity. This avoids overflows later + with very long asm statements. */ + if (count > 1000) + count = 1000; + return count; + } case GIMPLE_RESX: /* This is either going to be an external function call with one -- 2.7.4