[qfcc] Aggressively cancel terms

While it currently doesn't have any effect on generated code, it proved
to be necessary when experimenting with optimizing the operand of extend
expressions (which proved to produce worse code).

Along with some 0 -> nullptr changes.
This commit is contained in:
Bill Currie 2024-04-07 01:10:54 +09:00
parent 4daa84ed2a
commit 95a50fefa2
2 changed files with 29 additions and 7 deletions

View file

@ -135,7 +135,7 @@ const expr_t *
ext_expr (const expr_t *src, const type_t *type, int extend, bool reverse) ext_expr (const expr_t *src, const type_t *type, int extend, bool reverse)
{ {
if (!src) { if (!src) {
return 0; return nullptr;
} }
bool neg = false; bool neg = false;
if (is_neg (src)) { if (is_neg (src)) {

View file

@ -53,7 +53,7 @@ clean_skips (const expr_t **expr_list)
*dst++ = *src; *dst++ = *src;
} }
} }
*dst = 0; *dst = nullptr;
} }
static const expr_t * static const expr_t *
@ -149,7 +149,7 @@ optimize_cross (const expr_t *expr, const expr_t **adds, const expr_t **subs)
for (auto search = adds; *search; search++) { for (auto search = adds; *search; search++) {
if (*search != &skip) { if (*search != &skip) {
auto c = traverse_scale (*search); auto c = traverse_scale (*search);
const expr_t *scale = 0; const expr_t *scale = nullptr;
bool neg = false; bool neg = false;
if (is_cross (c)) { if (is_cross (c)) {
if (c->expr.e1 == com) { if (c->expr.e1 == com) {
@ -173,7 +173,7 @@ optimize_cross (const expr_t *expr, const expr_t **adds, const expr_t **subs)
for (auto search = subs; *search; search++) { for (auto search = subs; *search; search++) {
if (*search != &skip) { if (*search != &skip) {
auto c = traverse_scale (*search); auto c = traverse_scale (*search);
const expr_t *scale = 0; const expr_t *scale = nullptr;
bool neg = false; bool neg = false;
if (is_cross (c)) { if (is_cross (c)) {
if (c->expr.e1 == com) { if (c->expr.e1 == com) {
@ -282,7 +282,7 @@ optimize_scale (const expr_t *expr, const expr_t **adds, const expr_t **subs)
return expr; return expr;
} }
const expr_t *common = 0; const expr_t *common = nullptr;
int count = 0; int count = 0;
for (auto f = factors; *f; f++) { for (auto f = factors; *f; f++) {
if (fac_counts[f - factors] > count if (fac_counts[f - factors] > count
@ -357,7 +357,7 @@ optimize_mult (const expr_t *expr, const expr_t **adds, const expr_t **subs)
return expr; return expr;
} }
const expr_t *common = 0; const expr_t *common = nullptr;
int count = 0; int count = 0;
for (auto f = factors; *f; f++) { for (auto f = factors; *f; f++) {
if (fac_counts[f - factors] > count if (fac_counts[f - factors] > count
@ -387,7 +387,9 @@ optimize_mult (const expr_t *expr, const expr_t **adds, const expr_t **subs)
auto type = get_type (expr); auto type = get_type (expr);
auto col = gather_terms (type, com_adds, com_subs); auto col = gather_terms (type, com_adds, com_subs);
col = optimize_core (col); if (!(col = optimize_core (col))) {
return nullptr;
}
auto mult = typed_binary_expr (type, expr->expr.op, col, common); auto mult = typed_binary_expr (type, expr->expr.op, col, common);
mult = edag_add_expr (mult); mult = edag_add_expr (mult);
@ -537,6 +539,25 @@ optimize_adds (const expr_t **expr_list)
clean_skips (expr_list); clean_skips (expr_list);
} }
static void
cancel_terms (const expr_t **adds, const expr_t **subs)
{
for (auto a = adds; *a; a++) {
if (*a == &skip) {
continue;
}
for (auto s = subs; *s; s++) {
if (*s == *a) {
*a = &skip;
*s = &skip;
break;
}
}
}
clean_skips (adds);
clean_skips (subs);
}
static const expr_t * static const expr_t *
optimize_core (const expr_t *expr) optimize_core (const expr_t *expr)
{ {
@ -553,6 +574,7 @@ optimize_core (const expr_t *expr)
if (expr->expr.commutative) { if (expr->expr.commutative) {
optimize_adds (adds); optimize_adds (adds);
optimize_adds (subs); optimize_adds (subs);
cancel_terms (adds, subs);
} }
optimize_cross_products (adds, subs); optimize_cross_products (adds, subs);