diff options
author | Jeff Law <law@redhat.com> | 2015-12-18 10:17:14 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2015-12-18 10:17:14 -0700 |
commit | 3f1d32a5fd3475d1e75452cb5fefe712e043540c (patch) | |
tree | 1f9cb33de6c2b56bbe4cfc7761ac15dc58e0038a /gcc/cse.c | |
parent | a012998e615e7ff43642d4de100cf4e3c369212c (diff) | |
download | gcc-3f1d32a5fd3475d1e75452cb5fefe712e043540c.zip gcc-3f1d32a5fd3475d1e75452cb5fefe712e043540c.tar.gz gcc-3f1d32a5fd3475d1e75452cb5fefe712e043540c.tar.bz2 |
[PATCH] [PR rtl-optimization/49847] Fix ICE in CSE due to cc0-setter and cc0-user in different blocks
PR rtl-optimization/49847
* cse.c (record_jump_equiv): Handle fold_rtx returning NULL_RTX.
PR rtl-optimization/49847
* g++.dg/pr49847-2.C: New test.
From-SVN: r231821
Diffstat (limited to 'gcc/cse.c')
-rw-r--r-- | gcc/cse.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -3874,6 +3874,13 @@ record_jump_equiv (rtx_insn *insn, bool taken) op0 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 0), insn); op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn); + /* On a cc0 target the cc0-setter and cc0-user may end up in different + blocks. When that happens the tracking of the cc0-setter via + PREV_INSN_CC0 is spoiled. That means that fold_rtx may return + NULL_RTX. In those cases, there's nothing to record. */ + if (op0 == NULL_RTX || op1 == NULL_RTX) + return; + code = find_comparison_args (code, &op0, &op1, &mode0, &mode1); if (! cond_known_true) { |