tint/resolver: Optimize constant evaluation methods

Materialize() was re-evaluating the constant values for the incoming
semantic expression, despite this already being evaluated. Just use the
sem::Expression::ConstantValue().

resolver.cc already has all the semantic pointers, so pass them in
instead of pointlessly hitting the ast -> sem map.

Change-Id: If2bc7cd10f79079fb811e9d83c5150dd3c0c244c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/95764
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 4f47096..42cd0bb 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -1306,11 +1306,11 @@
         if (!validator_.Materialize(target_ty, src_ty, decl->source)) {
             return nullptr;
         }
-        auto expr_val = EvaluateConstantValue(decl, expr->Type());
+        auto expr_val = expr->ConstantValue();
         if (!expr_val) {
             TINT_ICE(Resolver, builder_->Diagnostics())
-                << decl->source << "EvaluateConstantValue(" << decl->TypeInfo().name
-                << ") returned invalid value";
+                << decl->source << "Materialize(" << decl->TypeInfo().name
+                << ") called on expression with no constant value";
             return nullptr;
         }
         auto materialized_val = ConvertValue(expr_val, target_ty, decl->source);
@@ -1422,7 +1422,7 @@
         ty = builder_->create<sem::Reference>(ty, ref->StorageClass(), ref->Access());
     }
 
-    auto val = EvaluateConstantValue(expr, ty);
+    auto val = EvaluateIndexValue(obj, idx);
     bool has_side_effects = idx->HasSideEffects() || obj->HasSideEffects();
     auto* sem = builder_->create<sem::IndexAccessorExpression>(
         expr, ty, obj, idx, current_statement_, std::move(val), has_side_effects,
@@ -1441,7 +1441,7 @@
         return nullptr;
     }
 
-    auto val = EvaluateConstantValue(expr, ty);
+    auto val = EvaluateBitcastValue(inner, ty);
     auto* sem = builder_->create<sem::Expression>(expr, ty, current_statement_, std::move(val),
                                                   inner->HasSideEffects());
 
@@ -1489,9 +1489,9 @@
         if (!MaterializeArguments(args, call_target)) {
             return nullptr;
         }
-        auto val = EvaluateConstantValue(expr, call_target->ReturnType());
+        auto val = EvaluateCtorOrConvValue(args, call_target->ReturnType());
         return builder_->create<sem::Call>(expr, call_target, std::move(args), current_statement_,
-                                           std::move(val), has_side_effects);
+                                           val, has_side_effects);
     };
 
     // ct_ctor_or_conv is a helper for building either a sem::TypeConstructor or sem::TypeConversion
@@ -1528,10 +1528,9 @@
                 if (!MaterializeArguments(args, call_target)) {
                     return nullptr;
                 }
-                auto val = EvaluateConstantValue(expr, call_target->ReturnType());
+                auto val = EvaluateCtorOrConvValue(args, arr);
                 return builder_->create<sem::Call>(expr, call_target, std::move(args),
-                                                   current_statement_, std::move(val),
-                                                   has_side_effects);
+                                                   current_statement_, val, has_side_effects);
             },
             [&](const sem::Struct* str) -> sem::Call* {
                 auto* call_target = utils::GetOrCreate(
@@ -1551,7 +1550,7 @@
                 if (!MaterializeArguments(args, call_target)) {
                     return nullptr;
                 }
-                auto val = EvaluateConstantValue(expr, call_target->ReturnType());
+                auto val = EvaluateCtorOrConvValue(args, str);
                 return builder_->create<sem::Call>(expr, call_target, std::move(args),
                                                    current_statement_, std::move(val),
                                                    has_side_effects);
@@ -1857,7 +1856,7 @@
         return nullptr;
     }
 
-    auto val = EvaluateConstantValue(literal, ty);
+    auto val = EvaluateLiteralValue(literal, ty);
     return builder_->create<sem::Expression>(literal, ty, current_statement_, std::move(val),
                                              /* has_side_effects */ false);
 }
@@ -2077,10 +2076,10 @@
         }
     }
 
-    auto val = EvaluateConstantValue(expr, op.result);
+    auto* val = EvaluateBinaryValue(lhs, rhs, op);
     bool has_side_effects = lhs->HasSideEffects() || rhs->HasSideEffects();
-    auto* sem = builder_->create<sem::Expression>(expr, op.result, current_statement_,
-                                                  std::move(val), has_side_effects);
+    auto* sem = builder_->create<sem::Expression>(expr, op.result, current_statement_, val,
+                                                  has_side_effects);
     sem->Behaviors() = lhs->Behaviors() + rhs->Behaviors();
 
     return sem;
@@ -2095,6 +2094,7 @@
 
     const sem::Type* ty = nullptr;
     const sem::Variable* source_var = nullptr;
+    const sem::Constant* val = nullptr;
 
     switch (unary->op) {
         case ast::UnaryOp::kAddressOf:
@@ -2147,12 +2147,12 @@
                 }
             }
             ty = op.result;
+            val = EvaluateUnaryValue(expr, op);
             break;
         }
     }
 
-    auto val = EvaluateConstantValue(unary, ty);
-    auto* sem = builder_->create<sem::Expression>(unary, ty, current_statement_, std::move(val),
+    auto* sem = builder_->create<sem::Expression>(unary, ty, current_statement_, val,
                                                   expr->HasSideEffects(), source_var);
     sem->Behaviors() = expr->Behaviors();
     return sem;