aboutsummaryrefslogtreecommitdiff
path: root/gcc/unroll.c
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1994-08-14 15:55:17 -0700
committerJim Wilson <wilson@gcc.gnu.org>1994-08-14 15:55:17 -0700
commit8700c49499167593375eac262646fb9246904015 (patch)
tree8962306cefc1fe4df756c43a6578028f0b84965f /gcc/unroll.c
parentbbd4b75be010f6776f2ec809b38e109b4bf81225 (diff)
downloadgcc-8700c49499167593375eac262646fb9246904015.zip
gcc-8700c49499167593375eac262646fb9246904015.tar.gz
gcc-8700c49499167593375eac262646fb9246904015.tar.bz2
(calculate_giv_inc): Handle constants loaded with IOR.
From-SVN: r7918
Diffstat (limited to 'gcc/unroll.c')
-rw-r--r--gcc/unroll.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/gcc/unroll.c b/gcc/unroll.c
index 9b968ac..fafa627 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -1335,11 +1335,27 @@ calculate_giv_inc (pattern, src_insn, regno)
one of the LO_SUM rtx. */
if (GET_CODE (increment) == LO_SUM)
increment = XEXP (increment, 1);
+ else if (GET_CODE (increment) == IOR)
+ {
+ /* The rs6000 port loads some constants with IOR. */
+ rtx second_part = XEXP (increment, 1);
+
+ src_insn = PREV_INSN (src_insn);
+ increment = SET_SRC (PATTERN (src_insn));
+ /* Don't need the last insn anymore. */
+ delete_insn (get_last_insn ());
+
+ if (GET_CODE (second_part) != CONST_INT
+ || GET_CODE (increment) != CONST_INT)
+ abort ();
+
+ increment = GEN_INT (INTVAL (increment) | INTVAL (second_part));
+ }
if (GET_CODE (increment) != CONST_INT)
abort ();
- /* The insn loading the constant into a register is not longer needed,
+ /* The insn loading the constant into a register is no longer needed,
so delete it. */
delete_insn (get_last_insn ());
}