* @author Michael Beck
* @version $Id$
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
#undef DEBUG_CONFIRM
* such kind of operation, we use border flags allowing
* all intervals.
*/
-typedef struct _interval_t {
+typedef struct interval_t {
tarval *min; /**< lowest border */
tarval *max; /**< highest border */
unsigned char flags; /**< border flags */
#ifdef DEBUG_CONFIRM
-#define compare_iv(l_iv, r_iv, pnc) compare_iv_dbg(l_iv, r_iv, pnc)
+#define compare_iv(l_iv, r_iv, pnc) compare_iv_dbg(l_iv, r_iv, pnc)
/* forward */
static tarval *compare_iv_dbg(const interval_t *l_iv, const interval_t *r_iv, pn_Cmp pnc);
* This is a often needed case, so we handle here Confirm
* nodes too.
*/
-int value_not_zero(ir_node *n, ir_node **confirm) {
+int value_not_zero(const ir_node *n, ir_node_cnst_ptr *confirm)
+{
#define RET_ON(x) if (x) { *confirm = n; return 1; }; break
tarval *tv;
/* there might be several Confirms one after other that form an interval */
for (;;) {
- if (is_Minus(n) || is_Abs(n)) {
- /* we can safely skip Minus and Abs when checking for != 0 */
+ if (is_Minus(n)) {
+ /* we can safely skip Minus when checking for != 0 */
n = get_unop_op(n);
continue;
}
* - A SymConst(entity) is NEVER a NULL pointer
* - Confirms are evaluated
*/
-int value_not_null(ir_node *n, ir_node **confirm) {
+int value_not_null(const ir_node *n, ir_node_cnst_ptr *confirm)
+{
tarval *tv;
*confirm = NULL;
- n = skip_Cast(n);
+ n = skip_Cast_const(n);
tv = value_of(n);
if (tarval_is_constant(tv) && ! tarval_is_null(tv))
n = skip_Cast(get_Sel_ptr(n));
}
}
+ while (1) {
+ if (is_Cast(n)) { n = get_Cast_op(n); continue; }
+ if (is_Proj(n)) { n = get_Proj_pred(n); continue; }
+ break;
+ }
+
if (is_Global(n)) {
/* global references are never NULL */
return 1;
- } else if (n == get_irg_frame(current_ir_graph)) {
+ } else if (n == get_irg_frame(get_irn_irg(n))) {
/* local references are never NULL */
return 1;
+ } else if (is_Alloc(n)) {
+ /* alloc never returns NULL (it throws an exception instead) */
+ return 1;
} else {
/* check for more Confirms */
for (; is_Confirm(n); n = skip_Cast(get_Confirm_value(n))) {
* If the mode of the value did not honor signed zeros, else
* check for >= 0 or < 0.
*/
-value_classify_sign classify_value_sign(ir_node *n) {
+value_classify_sign classify_value_sign(ir_node *n)
+{
tarval *tv, *c;
ir_mode *mode;
pn_Cmp cmp, ncmp;
}
break;
}
- if (get_irn_op(n) != op_Confirm)
+ if (!is_Confirm(n))
return value_classified_unknown;
tv = value_of(get_Confirm_bound(n));
* @return the filled interval or NULL if no interval
* can be created (happens only on floating point
*/
-static interval_t *get_interval_from_tv(interval_t *iv, tarval *tv) {
+static interval_t *get_interval_from_tv(interval_t *iv, tarval *tv)
+{
ir_mode *mode = get_tarval_mode(tv);
if (tv == tarval_bad) {
* @return the filled interval or NULL if no interval
* can be created (happens only on floating point
*/
-static interval_t *get_interval(interval_t *iv, ir_node *bound, pn_Cmp pnc) {
+static interval_t *get_interval(interval_t *iv, ir_node *bound, pn_Cmp pnc)
+{
ir_mode *mode = get_irn_mode(bound);
tarval *tv = value_of(bound);
* tarval_b_true or tarval_b_false it it can be evaluated,
* tarval_bad else
*/
-static tarval *(compare_iv)(const interval_t *l_iv, const interval_t *r_iv, pn_Cmp pnc) {
+static tarval *(compare_iv)(const interval_t *l_iv, const interval_t *r_iv, pn_Cmp pnc)
+{
pn_Cmp res;
unsigned flags;
tarval *tv_true = tarval_b_true, *tv_false = tarval_b_false;
/**
* Returns non-zero, if a given relation is transitive.
*/
-static int is_transitive(pn_Cmp pnc) {
+static int is_transitive(pn_Cmp pnc)
+{
return (pn_Cmp_False < pnc && pnc < pn_Cmp_Lg);
} /* is_transitive */
* @param right the right operand of the Cmp
* @param pnc the compare relation
*/
-tarval *computed_value_Cmp_Confirm(ir_node *cmp, ir_node *left, ir_node *right, pn_Cmp pnc) {
+tarval *computed_value_Cmp_Confirm(ir_node *cmp, ir_node *left, ir_node *right, pn_Cmp pnc)
+{
ir_node *l_bound;
pn_Cmp l_pnc, res_pnc, neg_pnc;
interval_t l_iv, r_iv;
if ((pnc == pn_Cmp_Eq || pnc == pn_Cmp_Lg) &&
is_Const(right) && is_Const_null(right)) {
/* for == 0 or != 0 we have some special tools */
- ir_mode *mode = get_irn_mode(left);
- ir_node *dummy;
+ ir_mode *mode = get_irn_mode(left);
+ const ir_node *dummy;
if (mode_is_reference(mode)) {
if (value_not_null(left, &dummy)) {
tv = pnc == pn_Cmp_Eq ? tarval_b_false : tarval_b_true;
* @param len length of the string buffer
* @param iv the interval
*/
-static int iv_snprintf(char *buf, size_t len, const interval_t *iv) {
+static int iv_snprintf(char *buf, size_t len, const interval_t *iv)
+{
char smin[64], smax[64];
if (iv) {
* @param r_iv the right interval
* @param pnc the compare relation
*/
-static void print_iv_cmp(const interval_t *l_iv, const interval_t *r_iv, pn_Cmp pnc) {
+static void print_iv_cmp(const interval_t *l_iv, const interval_t *r_iv, pn_Cmp pnc)
+{
char sl[128], sr[128];
iv_snprintf(sl, sizeof(sl), l_iv);
* @param r_iv the right interval
* @param pnc the compare relation
*/
-static tarval *compare_iv_dbg(const interval_t *l_iv, const interval_t *r_iv, pn_Cmp pnc) {
+static tarval *compare_iv_dbg(const interval_t *l_iv, const interval_t *r_iv, pn_Cmp pnc)
+{
tarval *tv = (compare_iv)(l_iv, r_iv, pnc);
if (tv == tarval_bad)