* 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(const ir_node *n, ir_node_cnst_ptr *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(const ir_node *n, ir_node_cnst_ptr *confirm) {
+int value_not_null(const ir_node *n, ir_node_cnst_ptr *confirm)
+{
tarval *tv;
*confirm = NULL;
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)) {
/* 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;
* @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;
* @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)