[Bug rtl-optimization/88317] ICE: Segmentation fault (in split_reg -> bitmap_set_bit -> bitmap_list_link_element)
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 4 10:07:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88317
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-12-04
CC| |rguenth at gcc dot gnu.org,
| |vmakarov at gcc dot gnu.org
Version|unknown |9.0
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed. Running via valgrind makes it succeed (eh).
So, the bitmap element in check_only_regs (global static regset) is corrupted,
it receives the broken value via setting a bit in scratch_operand_bitmap
(likewise global static regset):
Hardware watchpoint 5: *$17
Old value = (bitmap_element *) 0x0
New value = (bitmap_element *) 0x1000000000000
bitmap_set_bit (head=head@entry=0x23db920 <scratch_operand_bitmap>,
bit=<optimized out>) at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:947
947 if (!head->tree_form)
#0 bitmap_set_bit (head=head@entry=0x23db920 <scratch_operand_bitmap>,
bit=<optimized out>) at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:947
#1 0x0000000000beff37 in lra_register_new_scratch_op (
insn=insn@entry=0x7ffff6632940, nop=nop@entry=0)
at /space/rguenther/src/svn/trunk2/gcc/lra.c:2071
#2 0x0000000000bf0481 in remove_scratches ()
at /space/rguenther/src/svn/trunk2/gcc/lra.c:2105
#3 lra (f=<optimized out>) at /space/rguenther/src/svn/trunk2/gcc/lra.c:2407
#4 0x0000000000ba3ada in do_reload ()
at /space/rguenther/src/svn/trunk2/gcc/ira.c:5469
#5 (anonymous namespace)::pass_reload::execute (this=<optimized out>)
at /space/rguenther/src/svn/trunk2/gcc/ira.c:5653
#6 0x0000000000cb46e2 in execute_one_pass (
pass=pass@entry=<opt_pass* 0x2530630 "reload"(283)>)
at /space/rguenther/src/svn/trunk2/gcc/passes.c:2483
#7 0x0000000000cb4f98 in execute_pass_list_1 (
pass=<opt_pass* 0x2530630 "reload"(283)>)
at /space/rguenther/src/svn/trunk2/gcc/passes.c:2569
#8 0x0000000000cb4faa in execute_pass_list_1 (
pass=<opt_pass* 0x252f470 "*rest_of_compilation"(-1)>)
at /space/rguenther/src/svn/trunk2/gcc/passes.c:2570
#9 0x0000000000cb4ff5 in execute_pass_list (fn=0x7ffff67b20b0,
pass=<optimized out>) at /space/rguenther/src/svn/trunk2/gcc/passes.c:2580
Program received signal SIGSEGV, Segmentation fault.
bitmap_list_link_element (element=0x32c6238, head=0x23de360 <check_only_regs>)
at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:212
212 ptr->prev != 0 && ptr->prev->indx > indx;
(gdb) p *head->first
$18 = {next = 0x32c6260, prev = 0x1000000000000, indx = 40341960, bits = {0,
576460752303423490}}
#0 bitmap_list_link_element (element=0x32c6238,
head=0x23de360 <check_only_regs>)
at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:212
#1 bitmap_set_bit (head=head@entry=0x23de360 <check_only_regs>,
bit=bit@entry=1) at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:948
#2 0x0000000000bfa38e in split_reg (before_p=before_p@entry=true,
original_regno=original_regno@entry=1, insn=insn@entry=0x7ffff606ee00,
next_usage_insns=next_usage_insns@entry=0x0, to=to@entry=0x7ffff5f3a380)
at /space/rguenther/src/svn/trunk2/gcc/lra-constraints.c:5656
#3 0x0000000000bfc2a4 in spill_hard_reg_in_range (regno=regno@entry=25575,
rclass=rclass@entry=DREG, from=from@entry=0x7ffff606ee00,
to=0x7ffff5f3a380)
at /space/rguenther/src/svn/trunk2/gcc/lra-constraints.c:5764
#4 0x0000000000bf64b9 in lra_split_hard_reg_for ()
at /space/rguenther/src/svn/trunk2/gcc/lra-assigns.c:1765
#5 0x0000000000bf08a7 in lra (f=<optimized out>)
at /space/rguenther/src/svn/trunk2/gcc/lra.c:2533
#6 0x0000000000ba3ada in do_reload ()
at /space/rguenther/src/svn/trunk2/gcc/ira.c:5469
#7 (anonymous namespace)::pass_reload::execute (this=<optimized out>)
at /space/rguenther/src/svn/trunk2/gcc/ira.c:5653
#8 0x0000000000cb46e2 in execute_one_pass (
pass=pass@entry=<opt_pass* 0x2530630 "reload"(283)>)
#9 0x0000000000cb4f98 in execute_pass_list_1 (
pass=<opt_pass* 0x2530630 "reload"(283)>)
at /space/rguenther/src/svn/trunk2/gcc/passes.c:2569
#10 0x0000000000cb4faa in execute_pass_list_1 (
pass=<opt_pass* 0x252f470 "*rest_of_compilation"(-1)>)
at /space/rguenther/src/svn/trunk2/gcc/passes.c:2570
#11 0x0000000000cb4ff5 in execute_pass_list (fn=0x7ffff67b20b0,
pass=<optimized out>) at /space/rguenther/src/svn/trunk2/gcc/passes.c:2580
the odd thing is that the bitmaps do not share an element but the "shared"
elements even overlap partially.
Breakpoint 6, bitmap_obstack_release (bit_obstack=0x23289a0 <reg_obstack>)
at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:732
732 if (!bit_obstack)
(gdb) p check_only_regs
$33 = {indx = 0, tree_form = false, first = 0x2679728, current = 0x2679728,
obstack = 0x23289a0 <reg_obstack>}
(gdb) p check_only_regs->first
$34 = (bitmap_element *) 0x2679728
(gdb) p *check_only_regs->first
$35 = {next = 0x0, prev = 0x0, indx = 0, bits = {4, 576460752303423488}}
so check_only_regs is _not_ cleared when we release its obstack!
This happens through lra_split_hard_reg_for calling into
spill_hard_reg_in_range:
#0 0x0000000000881f19 in bitmap_list_link_element (element=0x2679728,
head=0x23de360 <check_only_regs>)
at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:204
#1 bitmap_set_bit (head=head@entry=0x23de360 <check_only_regs>,
bit=bit@entry=123) at /space/rguenther/src/svn/trunk2/gcc/bitmap.c:948
#2 0x0000000000bfa380 in split_reg (before_p=before_p@entry=true,
original_regno=original_regno@entry=2, insn=insn@entry=0x7ffff6487000,
next_usage_insns=next_usage_insns@entry=0x0, to=to@entry=0x7ffff6678740)
at /space/rguenther/src/svn/trunk2/gcc/lra-constraints.c:5655
#3 0x0000000000bfc2a4 in spill_hard_reg_in_range (regno=regno@entry=121,
rclass=rclass@entry=CREG, from=from@entry=0x7ffff6487000,
to=0x7ffff6678740)
at /space/rguenther/src/svn/trunk2/gcc/lra-constraints.c:5764
#4 0x0000000000bf64b9 in lra_split_hard_reg_for ()
at /space/rguenther/src/svn/trunk2/gcc/lra-assigns.c:1765
#5 0x0000000000bf08a7 in lra (f=<optimized out>)
at /space/rguenther/src/svn/trunk2/gcc/lra.c:2533
#6 0x0000000000ba3ada in do_reload ()
at /space/rguenther/src/svn/trunk2/gcc/ira.c:5469
which is the problem. Only bitmap alterations through lra_inheritance ()
are properly protected.
I believe we want to replace bitmap_initialize (&...); ... bitmap_clear (&...);
patterns with clearing that poisons the obstack member so we do not run
into this kind of problem silently.
Vlad - can you look into the above? There's also lra_split_regs set
(and maybe others) which will have similar problems. The following should
make it easier to debug:
diff --git a/gcc/bitmap.h b/gcc/bitmap.h
index 9a180daa745..98f7b50b18b 100644
--- a/gcc/bitmap.h
+++ b/gcc/bitmap.h
@@ -441,6 +441,15 @@ bitmap_initialize (bitmap head, bitmap_obstack *obstack
CXX
_MEM_STAT_INFO)
bitmap_register (head PASS_MEM_STAT);
}
+/* Release a bitmap header. */
+
+static inline void
+bitmap_release (bitmap head)
+{
+ bitmap_clear (head);
+ head->obstack = (bitmap_obstack *)0xdeadbeef;
+}
+
/* Allocate and free bitmaps from obstack, malloc and gc'd memory. */
extern bitmap bitmap_alloc (bitmap_obstack *obstack CXX_MEM_STAT_INFO);
#define BITMAP_ALLOC bitmap_alloc
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 04a90723aab..8bf33d4771e 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -6647,11 +6647,11 @@ lra_inheritance (void)
inherit_in_ebb. */
update_ebb_live_info (BB_HEAD (start_bb), BB_END (bb));
}
- bitmap_clear (&ebb_global_regs);
- bitmap_clear (&temp_bitmap);
- bitmap_clear (&live_regs);
- bitmap_clear (&invalid_invariant_regs);
- bitmap_clear (&check_only_regs);
+ bitmap_release (&ebb_global_regs);
+ bitmap_release (&temp_bitmap);
+ bitmap_release (&live_regs);
+ bitmap_release (&invalid_invariant_regs);
+ bitmap_release (&check_only_regs);
free (usage_insns);
timevar_pop (TV_LRA_INHERITANCE);
The call to spill_hard_reg_in_range has been introduced with r258602. Note
that if the call happens before the first call to lra_inheritance then
the bitmap will appear to be GC managed...
More information about the Gcc-bugs
mailing list