Turns out decrementing the users was very very bad.

This commit is contained in:
Bill Currie 2011-01-11 10:55:51 +09:00
parent 099eb2d31c
commit c73ac30e3f

View file

@ -217,25 +217,25 @@ do_op_float (int op, expr_t *e, expr_t *e1, expr_t *e2)
e->e.expr.type = type;
if (op == '*' && is_constant (e1) && e1->e.float_val == 1)
return dec_users (e2);
return e2;
if (op == '*' && is_constant (e2) && e2->e.float_val == 1)
return dec_users (e1);
return e1;
if (op == '*' && is_constant (e1) && e1->e.float_val == 0)
return dec_users (e1);
return e1;
if (op == '*' && is_constant (e2) && e2->e.float_val == 0)
return dec_users (e2);
return e2;
if (op == '/' && is_constant (e2) && e2->e.float_val == 1)
return dec_users (e1);
return e1;
if (op == '/' && is_constant (e2) && e2->e.float_val == 0)
return error (e, "division by zero");
if (op == '/' && is_constant (e1) && e1->e.float_val == 0)
return dec_users (e1);
return e1;
if (op == '+' && is_constant (e1) && e1->e.float_val == 0)
return dec_users (e2);
return e2;
if (op == '+' && is_constant (e2) && e2->e.float_val == 0)
return dec_users (e1);
return e1;
if (op == '-' && is_constant (e2) && e2->e.float_val == 0)
return dec_users (e1);
return e1;
if (op == '=' || op == 'b' || !is_constant (e1) || !is_constant (e2))
return e;
@ -351,10 +351,10 @@ do_op_vector (int op, expr_t *e, expr_t *e1, expr_t *e2)
if (op == '*' && is_constant (e1) && e1->type == ex_float
&& e1->e.float_val == 1)
return dec_users (e2);
return e2;
if (op == '*' && is_constant (e2) && e2->type == ex_float
&& e2->e.float_val == 1)
return dec_users (e1);
return e1;
if (op == '*' && is_constant (e1) && e1->type == ex_float
&& e1->e.float_val == 0)
return new_vector_expr (vec3_origin);
@ -363,16 +363,16 @@ do_op_vector (int op, expr_t *e, expr_t *e1, expr_t *e2)
return new_vector_expr (vec3_origin);
if (op == '/' && is_constant (e2) && e2->type == ex_float
&& e2->e.float_val == 1)
return dec_users (e1);
return e1;
if (op == '/' && is_constant (e2) && e2->type == ex_float
&& e2->e.float_val == 0)
return error (e, "division by zero");
if (op == '+' && is_constant (e1) && VectorIsZero (e1->e.vector_val))
return dec_users (e2);
return e2;
if (op == '+' && is_constant (e2) && VectorIsZero (e2->e.vector_val))
return dec_users (e1);
return e1;
if (op == '-' && is_constant (e2) && VectorIsZero (e2->e.vector_val))
return dec_users (e1);
return e1;
if (op == '=' || op == 'b' || !is_constant (e1) || !is_constant (e2))
return e;
@ -537,10 +537,10 @@ do_op_quaternion (int op, expr_t *e, expr_t *e1, expr_t *e2)
if (op == '*' && is_constant (e1) && e1->type == ex_float
&& e1->e.float_val == 1)
return dec_users (e2);
return e2;
if (op == '*' && is_constant (e2) && e2->type == ex_float
&& e2->e.float_val == 1)
return dec_users (e1);
return e1;
if (op == '*' && is_constant (e1) && e1->type == ex_float
&& e1->e.float_val == 0)
return new_quaternion_expr (quat_origin);
@ -549,16 +549,16 @@ do_op_quaternion (int op, expr_t *e, expr_t *e1, expr_t *e2)
return new_quaternion_expr (quat_origin);
if (op == '/' && is_constant (e2) && e2->type == ex_float
&& e2->e.float_val == 1)
return dec_users (e1);
return e1;
if (op == '/' && is_constant (e2) && e2->type == ex_float
&& e2->e.float_val == 0)
return error (e, "division by zero");
if (op == '+' && is_constant (e1) && QuatIsZero (e1->e.quaternion_val))
return dec_users (e2);
return e2;
if (op == '+' && is_constant (e2) && QuatIsZero (e2->e.quaternion_val))
return dec_users (e1);
return e1;
if (op == '-' && is_constant (e2) && QuatIsZero (e2->e.quaternion_val))
return dec_users (e1);
return e1;
if (op == '=' || op == 'b' || !is_constant (e1) || !is_constant (e2))
return e;
@ -629,25 +629,25 @@ do_op_integer (int op, expr_t *e, expr_t *e1, expr_t *e2)
}
if (op == '*' && is_constant (e1) && e1->e.integer_val == 1)
return dec_users (e2);
return e2;
if (op == '*' && is_constant (e2) && e2->e.integer_val == 1)
return dec_users (e1);
return e1;
if (op == '*' && is_constant (e1) && e1->e.integer_val == 0)
return dec_users (e1);
return e1;
if (op == '*' && is_constant (e2) && e2->e.integer_val == 0)
return dec_users (e2);
return e2;
if (op == '/' && is_constant (e2) && e2->e.integer_val == 1)
return dec_users (e1);
return e1;
if (op == '/' && is_constant (e2) && e2->e.integer_val == 0)
return error (e, "division by zero");
if (op == '/' && is_constant (e1) && e1->e.integer_val == 0)
return dec_users (e1);
return e1;
if (op == '+' && is_constant (e1) && e1->e.integer_val == 0)
return dec_users (e2);
return e2;
if (op == '+' && is_constant (e2) && e2->e.integer_val == 0)
return dec_users (e1);
return e1;
if (op == '-' && is_constant (e2) && e2->e.integer_val == 0)
return dec_users (e1);
return e1;
if (op == '=' || op == 'b' || !is_constant (e1) || !is_constant (e2))
return e;