Commit 8150f05c by Jie Zhang Committed by Jie Zhang

combine.c (try_combine): If insns need to be kept around...

	* combine.c (try_combine): If insns need to be kept around,
	check that they can be copied in the merged instruction.

	testsuite/
	g++.dg/opt/combine.c: New test.

From-SVN: r165911
parent 0ebd05fe
2010-10-25 Jie Zhang <jie@codesourcery.com>
* combine.c (try_combine): If insns need to be kept around,
check that they can be copied in the merged instruction.
2010-10-24 Eric Botcazou <ebotcazou@adacore.com> 2010-10-24 Eric Botcazou <ebotcazou@adacore.com>
* reg-stack.c (convert_regs_1): Return boolean value, true if the CFG * reg-stack.c (convert_regs_1): Return boolean value, true if the CFG
...@@ -2917,6 +2917,18 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -2917,6 +2917,18 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
else else
added_sets_0 = 0; added_sets_0 = 0;
/* We are about to copy insns for the case where they need to be kept
around. Check that they can be copied in the merged instruction. */
if (targetm.cannot_copy_insn_p
&& ((added_sets_2 && targetm.cannot_copy_insn_p (i2))
|| (i1 && added_sets_1 && targetm.cannot_copy_insn_p (i1))
|| (i0 && added_sets_0 && targetm.cannot_copy_insn_p (i0))))
{
undo_all ();
return 0;
}
/* If the set in I2 needs to be kept around, we must make a copy of /* If the set in I2 needs to be kept around, we must make a copy of
PATTERN (I2), so that when we substitute I1SRC for I1DEST in PATTERN (I2), so that when we substitute I1SRC for I1DEST in
PATTERN (I2), we are only substituting for the original I1DEST, not into PATTERN (I2), we are only substituting for the original I1DEST, not into
......
2010-10-25 Jie Zhang <jie@codesourcery.com>
g++.dg/opt/combine.c: New test.
2010-10-24 Eric Botcazou <ebotcazou@adacore.com> 2010-10-24 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt7.ad[sb]: New test. * gnat.dg/opt7.ad[sb]: New test.
......
// { dg-do assemble { target fpic } }
// { dg-options "-O2 -fweb -fPIC -fvisibility=hidden" }
class QBasicAtomicInt
{
public:
volatile int _q_value;
inline operator int () const {return _q_value;}
};
class QVariant;
class QScriptContext;
class QScriptEngine;
class QScriptValue
{
public:
QVariant toVariant () const;
};
class QScriptDebuggerBackendPrivate
{
static QScriptValue trace (QScriptContext *context);
};
template <typename T> struct QMetaTypeId { };
template <typename T> struct QMetaTypeId2
{
static inline int qt_metatype_id ()
{
return QMetaTypeId<T>::qt_metatype_id () ;
}
};
template <typename T> inline int qMetaTypeId (T * = 0)
{
return QMetaTypeId2<T>::qt_metatype_id () ;
}
class QVariant { };
template<typename T> inline T qvariant_cast (const QVariant &v)
{
const int vid = qMetaTypeId<T> ((0)) ;
};
class QScriptContext
{
public:
QScriptValue callee () const;
};
class QScriptEngine
{
public:
static bool convertV2 (const QScriptValue &value , int type , void *ptr) ;
};
inline bool qscriptvalue_cast_helper (const QScriptValue &value , int type , void *ptr)
{
return QScriptEngine::convertV2 (value, type, ptr) ;
}
template<typename T> T qscriptvalue_cast (const QScriptValue &value)
{
T t;
const int id = qMetaTypeId<T> () ;
if ( qscriptvalue_cast_helper (value, id, &t))
return qvariant_cast<T> (value.toVariant ()) ;
}
template <> struct QMetaTypeId< QScriptDebuggerBackendPrivate* >
{
static int qt_metatype_id ()
{
static QBasicAtomicInt metatype_id = { (0) };
return metatype_id;
}
};
QScriptValue QScriptDebuggerBackendPrivate::trace (QScriptContext *context)
{
QScriptValue data = context->callee () ;
QScriptDebuggerBackendPrivate *self = qscriptvalue_cast<QScriptDebuggerBackendPrivate*> (data) ;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment