- add explicit mode_X tarval_unreachable and tarval_reachable tarvals needed for combo
- fixed a doxygen comment
[r20702]
*/
int tarval_is_minus_one(tarval *tv);
*/
int tarval_is_minus_one(tarval *tv);
* returns non-zero if all bits in the tarval are set
*/
int tarval_is_all_one(tarval *tv);
* returns non-zero if all bits in the tarval are set
*/
int tarval_is_all_one(tarval *tv);
+/**
+ * Return non-zero if the tarval is a constant (ie. NOT
+ * a reserved tarval like bad, undef, reachable etc.)
+ */
+int tarval_is_constant(tarval *tv);
+
/** The 'bad' tarval. */
extern tarval *tarval_bad;
/** Returns the 'bad' tarval. */
/** The 'bad' tarval. */
extern tarval *tarval_bad;
/** Returns the 'bad' tarval. */
/** The mode_b tarval 'false'. */
extern tarval *tarval_b_false;
/** The mode_b tarval 'false'. */
extern tarval *tarval_b_false;
/** Returns the mode_b tarval 'false'. */
tarval *get_tarval_b_false(void);
/** Returns the mode_b tarval 'false'. */
tarval *get_tarval_b_false(void);
/** Returns the mode_b tarval 'true'. */
tarval *get_tarval_b_true(void);
/** Returns the mode_b tarval 'true'. */
tarval *get_tarval_b_true(void);
+/** The mode_X tarval 'unreachable'. */
+extern tarval *tarval_unreachable;
+/** Returns the mode_X tarval 'unreachable'. */
+tarval *get_tarval_unreachable(void);
+
+/** The mode_X tarval 'reachable'. */
+extern tarval *tarval_reachable;
+/** Returns the mode_X tarval 'reachable'. */
+tarval *get_tarval_reachable(void);
+
/** The 'top' tarval. This is just another name for the 'undefined' tarval. */
#define tarval_top tarval_undefined
/** Returns the 'top' tarval. */
/** The 'top' tarval. This is just another name for the 'undefined' tarval. */
#define tarval_top tarval_undefined
/** Returns the 'top' tarval. */
/*
* public variables declared in tv.h
*/
/*
* public variables declared in tv.h
*/
-static tarval reserved_tv[4];
+static tarval reserved_tv[6];
-tarval *tarval_bad = &reserved_tv[0];
-tarval *tarval_undefined = &reserved_tv[1];
-tarval *tarval_b_false = &reserved_tv[2];
-tarval *tarval_b_true = &reserved_tv[3];
+tarval *tarval_bad = &reserved_tv[0];
+tarval *tarval_undefined = &reserved_tv[1];
+tarval *tarval_b_false = &reserved_tv[2];
+tarval *tarval_b_true = &reserved_tv[3];
+tarval *tarval_reachable = &reserved_tv[4];
+tarval *tarval_unreachable = &reserved_tv[5];
/*
* public functions declared in tv.h
/*
* public functions declared in tv.h
case irms_internal_boolean:
/* match [tT][rR][uU][eE]|[fF][aA][lL][sS][eE] */
case irms_internal_boolean:
/* match [tT][rR][uU][eE]|[fF][aA][lL][sS][eE] */
- if (strcasecmp(str, "true")) return tarval_b_true;
- else if (strcasecmp(str, "false")) return tarval_b_true;
+ if (strcasecmp(str, "true"))
+ return tarval_b_true;
+ else if (strcasecmp(str, "false"))
+ return tarval_b_true;
else
/* XXX This is C semantics */
return atoi(str) ? tarval_b_true : tarval_b_false;
else
/* XXX This is C semantics */
return atoi(str) ? tarval_b_true : tarval_b_false;
return _get_tarval_b_true();
}
return _get_tarval_b_true();
}
+tarval *(get_tarval_reachable)(void) {
+ return _get_tarval_reachable();
+}
+
+tarval *(get_tarval_unreachable)(void) {
+ return _get_tarval_unreachable();
+}
+
tarval *get_tarval_max(ir_mode *mode) {
assert(mode);
tarval *get_tarval_max(ir_mode *mode) {
assert(mode);
+int tarval_is_constant(tarval *tv) {
+ int num_res = sizeof(reserved_tv) / sizeof(reserved_tv[0]);
+
+ /* reserved tarvals are NOT constants */
+ return (tv < &reserved_tv[0] || tv > &reserved_tv[num_res - 1]);
+}
+
tarval *get_tarval_minus_one(ir_mode *mode) {
assert(mode);
tarval *get_tarval_minus_one(ir_mode *mode) {
assert(mode);
-tarval *tarval_or (tarval *a, tarval *b) {
+tarval *tarval_or(tarval *a, tarval *b) {
assert(a);
assert(b);
assert(a->mode == b->mode);
assert(a);
assert(b);
assert(a->mode == b->mode);
return snprintf(buf, len, "<TV_BAD>");
if (tv == tarval_undefined)
return snprintf(buf, len, "<TV_UNDEF>");
return snprintf(buf, len, "<TV_BAD>");
if (tv == tarval_undefined)
return snprintf(buf, len, "<TV_UNDEF>");
+ if (tv == tarval_unreachable)
+ return snprintf(buf, len, "<TV_UNREACHABLE>");
+ if (tv == tarval_reachable)
+ return snprintf(buf, len, "<TV_REACHABLE>");
return snprintf(buf, len, "<TV_??""?>");
}
return snprintf(buf, len, "<TV_??""?>");
}
* Initialization of the tarval module: called after init_mode()
*/
void init_tarval_2(void) {
* Initialization of the tarval module: called after init_mode()
*/
void init_tarval_2(void) {
- tarval_bad->kind = k_tarval;
- tarval_bad->mode = mode_BAD;
- tarval_bad->value = INT_TO_PTR(resid_tarval_bad);
+ tarval_bad->kind = k_tarval;
+ tarval_bad->mode = mode_BAD;
+ tarval_bad->value = INT_TO_PTR(resid_tarval_bad);
+
+ tarval_undefined->kind = k_tarval;
+ tarval_undefined->mode = mode_ANY;
+ tarval_undefined->value = INT_TO_PTR(resid_tarval_undefined);
+
+ tarval_b_true->kind = k_tarval;
+ tarval_b_true->mode = mode_b;
+ tarval_b_true->value = INT_TO_PTR(resid_tarval_b_true);
- tarval_undefined->kind = k_tarval;
- tarval_undefined->mode = mode_ANY;
- tarval_undefined->value = INT_TO_PTR(resid_tarval_undefined);
+ tarval_b_false->kind = k_tarval;
+ tarval_b_false->mode = mode_b;
+ tarval_b_false->value = INT_TO_PTR(resid_tarval_b_false);
- tarval_b_true->kind = k_tarval;
- tarval_b_true->mode = mode_b;
- tarval_b_true->value = INT_TO_PTR(resid_tarval_b_true);
+ tarval_unreachable->kind = k_tarval;
+ tarval_unreachable->mode = mode_X;
+ tarval_unreachable->value = INT_TO_PTR(resid_tarval_unreachable);
- tarval_b_false->kind = k_tarval;
- tarval_b_false->mode = mode_b;
- tarval_b_false->value = INT_TO_PTR(resid_tarval_b_false);
+ tarval_reachable->kind = k_tarval;
+ tarval_reachable->mode = mode_X;
+ tarval_reachable->value = INT_TO_PTR(resid_tarval_reachable);
/*
* assign output modes that are compatible with the
/*
* assign output modes that are compatible with the
/** Debugging aid for the firmEvaluator: Marks for reserved tarvals values. */
enum reserved_id {
/** Debugging aid for the firmEvaluator: Marks for reserved tarvals values. */
enum reserved_id {
- resid_tarval_bad = 1, /**< tarval_bad marker. */
- resid_tarval_undefined = 2, /**< tarval_undefined marker. */
- resid_tarval_b_false = 3, /**< tarval_b_false marker. */
- resid_tarval_b_true = 4 /**< tarval_b_true marker. */
+ resid_tarval_bad = 1, /**< tarval_bad marker. */
+ resid_tarval_undefined = 2, /**< tarval_undefined marker. */
+ resid_tarval_b_false = 3, /**< tarval_b_false marker. */
+ resid_tarval_b_true = 4, /**< tarval_b_true marker. */
+ resid_tarval_unreachable = 5, /**< tarval_unreachable marker. */
+ resid_tarval_reachable = 6 /**< tarval_reachable marker. */
* irmode.h for predefined modes
*/
struct tarval {
* irmode.h for predefined modes
*/
struct tarval {
- firm_kind kind; /**< must be k_tarval */
- ir_mode *mode; /**< the mode of the stored value */
- const void *value; /**< the value stored in an internal way... */
- unsigned int length; /**< the length of the stored value */
+ firm_kind kind; /**< must be k_tarval */
+ ir_mode *mode; /**< the mode of the stored value */
+ const void *value; /**< the value stored in an internal way... */
+ unsigned int length; /**< the length of the stored value */
};
/* inline functions */
};
/* inline functions */
*/
static INLINE ir_mode *
_get_tarval_mode(const tarval *tv) {
*/
static INLINE ir_mode *
_get_tarval_mode(const tarval *tv) {
- assert(tv);
- return tv->mode;
+ assert(tv);
+ return tv->mode;
}
static INLINE tarval *
_get_tarval_bad(void) {
}
static INLINE tarval *
_get_tarval_bad(void) {
}
static INLINE tarval *
_get_tarval_undefined(void) {
}
static INLINE tarval *
_get_tarval_undefined(void) {
- return tarval_undefined;
+ return tarval_undefined;
}
static INLINE tarval *
_get_tarval_b_false(void) {
}
static INLINE tarval *
_get_tarval_b_false(void) {
}
static INLINE tarval *
_get_tarval_b_true(void) {
}
static INLINE tarval *
_get_tarval_b_true(void) {
+ return tarval_b_true;
+}
+
+static INLINE tarval *
+_get_tarval_reachable(void) {
+ return tarval_reachable;
+}
+
+static INLINE tarval *
+_get_tarval_unreachable(void) {
+ return tarval_unreachable;
return get_kind(thing) == k_tarval;
}
return get_kind(thing) == k_tarval;
}
-#define get_tarval_mode(tv) _get_tarval_mode(tv)
-#define get_tarval_bad() _get_tarval_bad()
-#define get_tarval_undefined() _get_tarval_undefined()
-#define get_tarval_b_false() _get_tarval_b_false()
-#define get_tarval_b_true() _get_tarval_b_true()
-#define get_tarval_P_void() _get_tarval_P_void()
-#define is_tarval(thing) _is_tarval(thing)
+#define get_tarval_mode(tv) _get_tarval_mode(tv)
+#define get_tarval_bad() _get_tarval_bad()
+#define get_tarval_undefined() _get_tarval_undefined()
+#define get_tarval_b_false() _get_tarval_b_false()
+#define get_tarval_b_true() _get_tarval_b_true()
+#define get_tarval_unreachable() _get_tarval_unreachable()
+#define get_tarval_reachable() _get_tarval_reachable()
+#define get_tarval_P_void() _get_tarval_P_void()
+#define is_tarval(thing) _is_tarval(thing)
#endif /* FIRM_TV_TV_T_H */
#endif /* FIRM_TV_TV_T_H */