diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-11 07:33:23 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-11 07:33:23 +0000 |
commit | 171557e8ce0106d9cc0321be218b42bbaaefeec0 (patch) | |
tree | 654aa05676a650f4bfb708a7c200e82d0a1e39c8 /gcc/dse.c | |
parent | 96efe7138202a220c3f6168a4e7f3fc9f4e93a83 (diff) | |
download | gcc-171557e8ce0106d9cc0321be218b42bbaaefeec0.tar.gz |
PR target/37382
* expmed.c (extract_low_bits): Avoid creating invalid subregs.
* dse.c (find_shift_sequence): Use extract_low_bits instead of
simplify_gen_subreg.
* gcc.c-torture/compile/pr37382.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140265 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dse.c')
-rw-r--r-- | gcc/dse.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/gcc/dse.c b/gcc/dse.c index 7283bbe67e4..0a3ebb40ffa 100644 --- a/gcc/dse.c +++ b/gcc/dse.c @@ -1445,7 +1445,7 @@ find_shift_sequence (int access_size, new_mode = GET_MODE_WIDER_MODE (new_mode)) { rtx target, new_reg, shift_seq, insn, new_lhs; - int cost, offset; + int cost; /* Try a wider mode if truncating the store mode to NEW_MODE requires a real instruction. */ @@ -1459,11 +1459,6 @@ find_shift_sequence (int access_size, if (!CONSTANT_P (store_info->rhs) && !MODES_TIEABLE_P (new_mode, store_mode)) continue; - offset = subreg_lowpart_offset (new_mode, store_mode); - new_lhs = simplify_gen_subreg (new_mode, copy_rtx (store_info->rhs), - store_mode, offset); - if (new_lhs == NULL_RTX) - continue; new_reg = gen_reg_rtx (new_mode); @@ -1496,6 +1491,11 @@ find_shift_sequence (int access_size, if (cost > COSTS_N_INSNS (1)) continue; + new_lhs = extract_low_bits (new_mode, store_mode, + copy_rtx (store_info->rhs)); + if (new_lhs == NULL_RTX) + continue; + /* We found an acceptable shift. Generate a move to take the value from the store and put it into the shift pseudo, then shift it, then generate another |