Commit 6dcb9e91 by Vladimir Makarov Committed by Vladimir Makarov

re PR sanitizer/82353 (runtime ubsan crash)

2017-10-11  Vladimir Makarov  <vmakarov@redhat.com>

	PR sanitizer/82353
	* lra.c (collect_non_operand_hard_regs): Don't ignore operator
	locations.
	* lra-lives.c (bb_killed_pseudos, bb_gen_pseudos): Move up.
	(make_hard_regno_born, make_hard_regno_dead): Update
	bb_killed_pseudos and bb_gen_pseudos.

2017-10-11  Vladimir Makarov  <vmakarov@redhat.com>

	PR sanitizer/82353
	* gcc.target/i386/i386.exp (tests): Permit '.C' extension.
	* gcc.target/i386/pr82353.C: New.

From-SVN: r253656
parent b90c9338
2017-10-11 Vladimir Makarov <vmakarov@redhat.com>
PR sanitizer/82353
* lra.c (collect_non_operand_hard_regs): Don't ignore operator
locations.
* lra-lives.c (bb_killed_pseudos, bb_gen_pseudos): Move up.
(make_hard_regno_born, make_hard_regno_dead): Update
bb_killed_pseudos and bb_gen_pseudos.
2017-10-11 Nathan Sidwell <nathan@acm.org> 2017-10-11 Nathan Sidwell <nathan@acm.org>
* incpath.h (enum incpath_kind): Name enum, prefix values. * incpath.h (enum incpath_kind): Name enum, prefix values.
...@@ -220,6 +220,9 @@ lra_intersected_live_ranges_p (lra_live_range_t r1, lra_live_range_t r2) ...@@ -220,6 +220,9 @@ lra_intersected_live_ranges_p (lra_live_range_t r1, lra_live_range_t r2)
return false; return false;
} }
/* The corresponding bitmaps of BB currently being processed. */
static bitmap bb_killed_pseudos, bb_gen_pseudos;
/* The function processing birth of hard register REGNO. It updates /* The function processing birth of hard register REGNO. It updates
living hard regs, START_LIVING, and conflict hard regs for living living hard regs, START_LIVING, and conflict hard regs for living
pseudos. Conflict hard regs for the pic pseudo is not updated if pseudos. Conflict hard regs for the pic pseudo is not updated if
...@@ -243,6 +246,7 @@ make_hard_regno_born (int regno, bool check_pic_pseudo_p ATTRIBUTE_UNUSED) ...@@ -243,6 +246,7 @@ make_hard_regno_born (int regno, bool check_pic_pseudo_p ATTRIBUTE_UNUSED)
|| i != REGNO (pic_offset_table_rtx)) || i != REGNO (pic_offset_table_rtx))
#endif #endif
SET_HARD_REG_BIT (lra_reg_info[i].conflict_hard_regs, regno); SET_HARD_REG_BIT (lra_reg_info[i].conflict_hard_regs, regno);
bitmap_set_bit (bb_gen_pseudos, regno);
} }
/* Process the death of hard register REGNO. This updates /* Process the death of hard register REGNO. This updates
...@@ -255,6 +259,8 @@ make_hard_regno_dead (int regno) ...@@ -255,6 +259,8 @@ make_hard_regno_dead (int regno)
return; return;
sparseset_set_bit (start_dying, regno); sparseset_set_bit (start_dying, regno);
CLEAR_HARD_REG_BIT (hard_regs_live, regno); CLEAR_HARD_REG_BIT (hard_regs_live, regno);
bitmap_clear_bit (bb_gen_pseudos, regno);
bitmap_set_bit (bb_killed_pseudos, regno);
} }
/* Mark pseudo REGNO as living at program point POINT, update conflicting /* Mark pseudo REGNO as living at program point POINT, update conflicting
...@@ -299,9 +305,6 @@ mark_pseudo_dead (int regno, int point) ...@@ -299,9 +305,6 @@ mark_pseudo_dead (int regno, int point)
} }
} }
/* The corresponding bitmaps of BB currently being processed. */
static bitmap bb_killed_pseudos, bb_gen_pseudos;
/* Mark register REGNO (pseudo or hard register) in MODE as live at /* Mark register REGNO (pseudo or hard register) in MODE as live at
program point POINT. Update BB_GEN_PSEUDOS. program point POINT. Update BB_GEN_PSEUDOS.
Return TRUE if the liveness tracking sets were modified, or FALSE Return TRUE if the liveness tracking sets were modified, or FALSE
......
...@@ -820,7 +820,8 @@ collect_non_operand_hard_regs (rtx *x, lra_insn_recog_data_t data, ...@@ -820,7 +820,8 @@ collect_non_operand_hard_regs (rtx *x, lra_insn_recog_data_t data,
const char *fmt = GET_RTX_FORMAT (code); const char *fmt = GET_RTX_FORMAT (code);
for (i = 0; i < data->insn_static_data->n_operands; i++) for (i = 0; i < data->insn_static_data->n_operands; i++)
if (x == data->operand_loc[i]) if (! data->insn_static_data->operand[i].is_operator
&& x == data->operand_loc[i])
/* It is an operand loc. Stop here. */ /* It is an operand loc. Stop here. */
return list; return list;
for (i = 0; i < data->insn_static_data->n_dups; i++) for (i = 0; i < data->insn_static_data->n_dups; i++)
......
2017-10-11 Vladimir Makarov <vmakarov@redhat.com>
PR sanitizer/82353
* gcc.target/i386/i386.exp (tests): Permit '.C' extension.
* gcc.target/i386/pr82353.C: New.
2017-10-11 Uros Bizjak <ubizjak@gmail.com> 2017-10-11 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/387-ficom-1.c: New test. * gcc.target/i386/387-ficom-1.c: New test.
......
...@@ -445,7 +445,7 @@ if [runtest_file_p $runtests $srcdir/$subdir/vect-args.c] { ...@@ -445,7 +445,7 @@ if [runtest_file_p $runtests $srcdir/$subdir/vect-args.c] {
} }
# Everything else. # Everything else.
set tests [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] set tests [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]]
set tests [prune $tests $srcdir/$subdir/vect-args.c] set tests [prune $tests $srcdir/$subdir/vect-args.c]
# Main loop. # Main loop.
......
/* { dg-do compile } */
/* { dg-options "-O2 -std=c++11 -fsanitize=undefined -fno-sanitize-recover=undefined -w -fdump-rtl-reload" } */
extern unsigned long tf_2_var_1, tf_2_var_21;
extern bool tf_2_var_2, tf_2_var_24, tf_2_var_6, tf_2_var_5;
extern unsigned char tf_2_var_16, tf_2_var_31;
extern short tf_2_var_69;
extern unsigned tf_2_var_233;
struct tf_2_struct_1 {
short member_1_0 : 27;
long member_1_1 : 10;
};
struct a {
int member_2_0 : 5;
};
struct tf_2_struct_3 {
static tf_2_struct_1 member_3_0;
};
struct tf_2_struct_4 {
static unsigned member_4_0;
a member_4_1;
};
struct tf_2_struct_5 {
tf_2_struct_1 member_5_2;
tf_2_struct_4 member_5_4;
};
struct tf_2_struct_6 {
tf_2_struct_5 member_6_2;
short member_6_4;
} extern tf_2_struct_obj_2;
extern tf_2_struct_3 tf_2_struct_obj_8;
tf_2_struct_1 a;
tf_2_struct_5 b;
tf_2_struct_1 tf_2_struct_3::member_3_0;
unsigned tf_2_struct_4::member_4_0;
void tf_2_init() {
a.member_1_1 = tf_2_struct_obj_2.member_6_2.member_5_2.member_1_1 = 5;
}
void tf_2_foo() {
int c = tf_2_struct_obj_2.member_6_2.member_5_4.member_4_1.member_2_0 -
-~tf_2_struct_obj_2.member_6_4 * char(90284000534361);
tf_2_struct_obj_8.member_3_0.member_1_0 =
tf_2_var_24 >
tf_2_var_21 * a.member_1_0 * tf_2_var_2 - tf_2_var_5 % a.member_1_1;
if ((~(tf_2_var_31 * tf_2_var_6) &&
-~tf_2_struct_obj_2.member_6_4 * 90284000534361) %
~tf_2_var_31 * tf_2_var_6)
b.member_5_2.member_1_0 << tf_2_var_16 << tf_2_var_1;
tf_2_var_233 = -~tf_2_struct_obj_2.member_6_4 * char(90284000534361);
int d(tf_2_struct_obj_2.member_6_4);
if (b.member_5_2.member_1_0)
b.member_5_2.member_1_1 = c;
bool e(~-~tf_2_struct_obj_2.member_6_4);
a.member_1_1 % e;
if (tf_2_var_5 / tf_2_struct_obj_2.member_6_2.member_5_2.member_1_1)
b.member_5_4.member_4_0 = tf_2_var_21 * a.member_1_0 * tf_2_var_2;
tf_2_var_69 = tf_2_var_6;
}
/* { dg-final { scan-rtl-dump-not "Inserting rematerialization insn" "reload" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment