Richard Guenther <rguenther@suse.de>
PR rtl-optimization/24257
* gcse.c (find_moveable_store): Only consider a store movable
when the SET_SRC of the insn can be assigned to a register.
* gcc.dg/torture/pr24257.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109701
138bc75d-0d04-0410-961f-
82ee72b054a4
+2006-01-14 Steven Bosscher <stevenb.gcc@gmail.com>
+ Richard Guenther <rguenther@suse.de>
+
+ PR rtl-optimization/24257
+ * gcse.c (find_moveable_store): Only consider a store movable
+ when the SET_SRC of the insn can be assigned to a register.
+
2006-01-14 Ian Lance Taylor <ian@airs.com>
* tree.c (tree_not_class_check_failed): New function.
if (find_reg_note (insn, REG_EH_REGION, NULL_RTX))
return;
+ /* Make sure that the SET_SRC of this store insns can be assigned to
+ a register, or we will fail later on in replace_store_insn, which
+ assumes that we can do this. But sometimes the target machine has
+ oddities like MEM read-modify-write instruction. See for example
+ PR24257. */
+ if (!can_assign_to_reg_p (SET_SRC (set)))
+ return;
+
ptr = ldst_entry (dest);
if (!ptr->pattern_regs)
ptr->pattern_regs = extract_mentioned_regs (dest);
+2006-01-14 Steven Bosscher <stevenb.gcc@gmail.com>
+ Richard Guenther <rguenther@suse.de>
+
+ PR rtl-optimization/24257
+ * gcc.dg/torture/pr24257.c: New testcase.
+
2006-01-13 Adam Nemet <anemet@caviumnetworks.com>
* gcc.c-torture/execute/20060110-1.c: New test.
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -fgcse -fgcse-sm" } */
+
+typedef struct A {
+ int buf, left;
+} A;
+
+static void flush(A *s, int n)
+{
+ s->buf <<= n;
+
+ while (s->left < 32) {
+ s->buf <<= 8;
+ s->left += 8;
+ }
+
+ s->buf=0;
+}
+
+void oof(A *s, int n)
+{
+ s->buf = n;
+ s->left = n;
+
+ flush(s, n);
+}