diff options
author | Martin Liska <mliska@suse.cz> | 2018-03-18 21:17:10 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-03-18 20:17:10 +0000 |
commit | f7dbf8e56459916a66af9fc62608109f65babd51 (patch) | |
tree | f97caf2a9bb93f1537a30e9654d2e819ecfd8805 /gcc/regrename.c | |
parent | 96c8b2534d19a0769152cd33e7fccc66a8785389 (diff) | |
download | gcc-f7dbf8e56459916a66af9fc62608109f65babd51.zip gcc-f7dbf8e56459916a66af9fc62608109f65babd51.tar.gz gcc-f7dbf8e56459916a66af9fc62608109f65babd51.tar.bz2 |
Fix UBSAN in regrename.c (PR rtl-optimization/84635).
2018-03-18 Martin Liska <mliska@suse.cz>
PR rtl-optimization/84635
* regrename.c (build_def_use): Use matches_mode only when
matches >= 0.
From-SVN: r258634
Diffstat (limited to 'gcc/regrename.c')
-rw-r--r-- | gcc/regrename.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/gcc/regrename.c b/gcc/regrename.c index dcec77a..4575481 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -1703,14 +1703,18 @@ build_def_use (basic_block bb) and we must instead make sure to make the operand visible to the machinery that tracks hard registers. */ machine_mode i_mode = recog_data.operand_mode[i]; - machine_mode matches_mode = recog_data.operand_mode[matches]; - if (matches >= 0 - && maybe_ne (GET_MODE_SIZE (i_mode), - GET_MODE_SIZE (matches_mode)) - && !verify_reg_in_set (op, &live_in_chains)) + if (matches >= 0) { - untracked_operands |= 1 << i; - untracked_operands |= 1 << matches; + machine_mode matches_mode + = recog_data.operand_mode[matches]; + + if (maybe_ne (GET_MODE_SIZE (i_mode), + GET_MODE_SIZE (matches_mode)) + && !verify_reg_in_set (op, &live_in_chains)) + { + untracked_operands |= 1 << i; + untracked_operands |= 1 << matches; + } } } #ifdef STACK_REGS |