[tint] Move builtin utilities to builtin namespace

These are useful in IR code too, so move them out of sem.

Bug: tint:1718
Change-Id: I7aace5a58eff7949e5cb1c23552052a88555bee2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/140891
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/builtin/function.cc b/src/tint/builtin/function.cc
index 332e9d1..378e922 100644
--- a/src/tint/builtin/function.cc
+++ b/src/tint/builtin/function.cc
@@ -611,4 +611,85 @@
     return out;
 }
 
+bool IsCoarseDerivativeBuiltin(Function f) {
+    return f == Function::kDpdxCoarse || f == Function::kDpdyCoarse || f == Function::kFwidthCoarse;
+}
+
+bool IsFineDerivativeBuiltin(Function f) {
+    return f == Function::kDpdxFine || f == Function::kDpdyFine || f == Function::kFwidthFine;
+}
+
+bool IsDerivativeBuiltin(Function f) {
+    return f == Function::kDpdx || f == Function::kDpdy || f == Function::kFwidth ||
+           IsCoarseDerivativeBuiltin(f) || IsFineDerivativeBuiltin(f);
+}
+
+bool IsTextureBuiltin(Function f) {
+    return IsImageQueryBuiltin(f) ||                        //
+           f == Function::kTextureGather ||                 //
+           f == Function::kTextureGatherCompare ||          //
+           f == Function::kTextureLoad ||                   //
+           f == Function::kTextureSample ||                 //
+           f == Function::kTextureSampleBaseClampToEdge ||  //
+           f == Function::kTextureSampleBias ||             //
+           f == Function::kTextureSampleCompare ||          //
+           f == Function::kTextureSampleCompareLevel ||     //
+           f == Function::kTextureSampleGrad ||             //
+           f == Function::kTextureSampleLevel ||            //
+           f == Function::kTextureStore;
+}
+
+bool IsImageQueryBuiltin(Function f) {
+    return f == Function::kTextureDimensions || f == Function::kTextureNumLayers ||
+           f == Function::kTextureNumLevels || f == Function::kTextureNumSamples;
+}
+
+bool IsDataPackingBuiltin(Function f) {
+    return f == Function::kPack4X8Snorm || f == Function::kPack4X8Unorm ||
+           f == Function::kPack2X16Snorm || f == Function::kPack2X16Unorm ||
+           f == Function::kPack2X16Float;
+}
+
+bool IsDataUnpackingBuiltin(Function f) {
+    return f == Function::kUnpack4X8Snorm || f == Function::kUnpack4X8Unorm ||
+           f == Function::kUnpack2X16Snorm || f == Function::kUnpack2X16Unorm ||
+           f == Function::kUnpack2X16Float;
+}
+
+bool IsBarrierBuiltin(Function f) {
+    return f == Function::kWorkgroupBarrier || f == Function::kStorageBarrier;
+}
+
+bool IsAtomicBuiltin(Function f) {
+    return f == Function::kAtomicLoad || f == Function::kAtomicStore || f == Function::kAtomicAdd ||
+           f == Function::kAtomicSub || f == Function::kAtomicMax || f == Function::kAtomicMin ||
+           f == Function::kAtomicAnd || f == Function::kAtomicOr || f == Function::kAtomicXor ||
+           f == Function::kAtomicExchange || f == Function::kAtomicCompareExchangeWeak;
+}
+
+bool IsDP4aBuiltin(Function f) {
+    return f == Function::kDot4I8Packed || f == Function::kDot4U8Packed;
+}
+
+bool HasSideEffects(Function f) {
+    switch (f) {
+        case Function::kAtomicAdd:
+        case Function::kAtomicAnd:
+        case Function::kAtomicCompareExchangeWeak:
+        case Function::kAtomicExchange:
+        case Function::kAtomicMax:
+        case Function::kAtomicMin:
+        case Function::kAtomicOr:
+        case Function::kAtomicStore:
+        case Function::kAtomicSub:
+        case Function::kAtomicXor:
+        case Function::kTextureStore:
+        case Function::kWorkgroupUniformLoad:
+            return true;
+        default:
+            break;
+    }
+    return false;
+}
+
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/function.cc.tmpl b/src/tint/builtin/function.cc.tmpl
index 7912482..a2788df 100644
--- a/src/tint/builtin/function.cc.tmpl
+++ b/src/tint/builtin/function.cc.tmpl
@@ -41,4 +41,91 @@
     return out;
 }
 
+bool IsCoarseDerivativeBuiltin(Function f) {
+    return f == Function::kDpdxCoarse || f == Function::kDpdyCoarse ||
+           f == Function::kFwidthCoarse;
+}
+
+bool IsFineDerivativeBuiltin(Function f) {
+    return f == Function::kDpdxFine || f == Function::kDpdyFine ||
+           f == Function::kFwidthFine;
+}
+
+bool IsDerivativeBuiltin(Function f) {
+    return f == Function::kDpdx || f == Function::kDpdy ||
+           f == Function::kFwidth || IsCoarseDerivativeBuiltin(f) ||
+           IsFineDerivativeBuiltin(f);
+}
+
+bool IsTextureBuiltin(Function f) {
+    return IsImageQueryBuiltin(f) ||                                 //
+           f == Function::kTextureGather ||                 //
+           f == Function::kTextureGatherCompare ||          //
+           f == Function::kTextureLoad ||                   //
+           f == Function::kTextureSample ||                 //
+           f == Function::kTextureSampleBaseClampToEdge ||  //
+           f == Function::kTextureSampleBias ||             //
+           f == Function::kTextureSampleCompare ||          //
+           f == Function::kTextureSampleCompareLevel ||     //
+           f == Function::kTextureSampleGrad ||             //
+           f == Function::kTextureSampleLevel ||            //
+           f == Function::kTextureStore;
+}
+
+bool IsImageQueryBuiltin(Function f) {
+    return f == Function::kTextureDimensions ||
+           f == Function::kTextureNumLayers || f == Function::kTextureNumLevels ||
+           f == Function::kTextureNumSamples;
+}
+
+bool IsDataPackingBuiltin(Function f) {
+    return f == Function::kPack4X8Snorm || f == Function::kPack4X8Unorm ||
+           f == Function::kPack2X16Snorm || f == Function::kPack2X16Unorm ||
+           f == Function::kPack2X16Float;
+}
+
+bool IsDataUnpackingBuiltin(Function f) {
+    return f == Function::kUnpack4X8Snorm || f == Function::kUnpack4X8Unorm ||
+           f == Function::kUnpack2X16Snorm || f == Function::kUnpack2X16Unorm ||
+           f == Function::kUnpack2X16Float;
+}
+
+bool IsBarrierBuiltin(Function f) {
+    return f == Function::kWorkgroupBarrier || f == Function::kStorageBarrier;
+}
+
+bool IsAtomicBuiltin(Function f) {
+    return f == Function::kAtomicLoad || f == Function::kAtomicStore ||
+           f == Function::kAtomicAdd || f == Function::kAtomicSub ||
+           f == Function::kAtomicMax || f == Function::kAtomicMin ||
+           f == Function::kAtomicAnd || f == Function::kAtomicOr ||
+           f == Function::kAtomicXor || f == Function::kAtomicExchange ||
+           f == Function::kAtomicCompareExchangeWeak;
+}
+
+bool IsDP4aBuiltin(Function f) {
+    return f == Function::kDot4I8Packed || f == Function::kDot4U8Packed;
+}
+
+bool HasSideEffects(Function f) {
+    switch (f) {
+        case Function::kAtomicAdd:
+        case Function::kAtomicAnd:
+        case Function::kAtomicCompareExchangeWeak:
+        case Function::kAtomicExchange:
+        case Function::kAtomicMax:
+        case Function::kAtomicMin:
+        case Function::kAtomicOr:
+        case Function::kAtomicStore:
+        case Function::kAtomicSub:
+        case Function::kAtomicXor:
+        case Function::kTextureStore:
+        case Function::kWorkgroupUniformLoad:
+            return true;
+        default:
+            break;
+    }
+    return false;
+}
+
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/function.h b/src/tint/builtin/function.h
index 046e87a..4643157 100644
--- a/src/tint/builtin/function.h
+++ b/src/tint/builtin/function.h
@@ -399,6 +399,60 @@
     "_tint_materialize",
 };
 
+/// Determines if the given `f` is a coarse derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is coarse.
+bool IsCoarseDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a fine derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is fine.
+bool IsFineDerivativeBuiltin(Function f);
+
+/// Determine if the given `f` is a derivative builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a derivative builtin
+bool IsDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a texture operation builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a texture operation builtin
+bool IsTextureBuiltin(Function f);
+
+/// Determines if the given `f` is an image query builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an image query builtin
+bool IsImageQueryBuiltin(Function f);
+
+/// Determines if the given `f` is a data packing builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data packing builtin
+bool IsDataPackingBuiltin(Function f);
+
+/// Determines if the given `f` is a data unpacking builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data unpacking builtin
+bool IsDataUnpackingBuiltin(Function f);
+
+/// Determines if the given `f` is a barrier builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a barrier builtin
+bool IsBarrierBuiltin(Function f);
+
+/// Determines if the given `f` is an atomic builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an atomic builtin
+bool IsAtomicBuiltin(Function f);
+
+/// Determines if the given `f` is a DP4a builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a DP4a builtin
+bool IsDP4aBuiltin(Function f);
+
+/// Determines if the given `f` may have side-effects (i.e. writes to at least one of its inputs)
+/// @returns true if intrinsic may have side-effects
+bool HasSideEffects(Function f);
+
 }  // namespace tint::builtin
 // \endcond
 
diff --git a/src/tint/builtin/function.h.tmpl b/src/tint/builtin/function.h.tmpl
index 02f9acb..2dc35d3 100644
--- a/src/tint/builtin/function.h.tmpl
+++ b/src/tint/builtin/function.h.tmpl
@@ -57,6 +57,60 @@
 {{- end }}
 };
 
+/// Determines if the given `f` is a coarse derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is coarse.
+bool IsCoarseDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a fine derivative.
+/// @param f the builtin type
+/// @returns true if the given derivative is fine.
+bool IsFineDerivativeBuiltin(Function f);
+
+/// Determine if the given `f` is a derivative builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a derivative builtin
+bool IsDerivativeBuiltin(Function f);
+
+/// Determines if the given `f` is a texture operation builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a texture operation builtin
+bool IsTextureBuiltin(Function f);
+
+/// Determines if the given `f` is an image query builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an image query builtin
+bool IsImageQueryBuiltin(Function f);
+
+/// Determines if the given `f` is a data packing builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data packing builtin
+bool IsDataPackingBuiltin(Function f);
+
+/// Determines if the given `f` is a data unpacking builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a data unpacking builtin
+bool IsDataUnpackingBuiltin(Function f);
+
+/// Determines if the given `f` is a barrier builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a barrier builtin
+bool IsBarrierBuiltin(Function f);
+
+/// Determines if the given `f` is an atomic builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is an atomic builtin
+bool IsAtomicBuiltin(Function f);
+
+/// Determines if the given `f` is a DP4a builtin.
+/// @param f the builtin type
+/// @returns true if the given `f` is a DP4a builtin
+bool IsDP4aBuiltin(Function f);
+
+/// Determines if the given `f` may have side-effects (i.e. writes to at least one of its inputs)
+/// @returns true if intrinsic may have side-effects
+bool HasSideEffects(Function f);
+
 }  // namespace tint::builtin
 // \endcond
 
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 93d51a2..4cc93c7 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -2393,7 +2393,7 @@
         return nullptr;
     }
 
-    if (sem::IsTextureBuiltin(builtin_type)) {
+    if (IsTextureBuiltin(builtin_type)) {
         if (!validator_.TextureBuiltinFunction(call)) {
             return nullptr;
         }
diff --git a/src/tint/sem/builtin.cc b/src/tint/sem/builtin.cc
index 4f33ebb..d5d214b 100644
--- a/src/tint/sem/builtin.cc
+++ b/src/tint/sem/builtin.cc
@@ -30,72 +30,6 @@
     return builtin::str(type_);
 }
 
-bool IsCoarseDerivativeBuiltin(builtin::Function i) {
-    return i == builtin::Function::kDpdxCoarse || i == builtin::Function::kDpdyCoarse ||
-           i == builtin::Function::kFwidthCoarse;
-}
-
-bool IsFineDerivativeBuiltin(builtin::Function i) {
-    return i == builtin::Function::kDpdxFine || i == builtin::Function::kDpdyFine ||
-           i == builtin::Function::kFwidthFine;
-}
-
-bool IsDerivativeBuiltin(builtin::Function i) {
-    return i == builtin::Function::kDpdx || i == builtin::Function::kDpdy ||
-           i == builtin::Function::kFwidth || IsCoarseDerivativeBuiltin(i) ||
-           IsFineDerivativeBuiltin(i);
-}
-
-bool IsTextureBuiltin(builtin::Function i) {
-    return IsImageQueryBuiltin(i) ||                                 //
-           i == builtin::Function::kTextureGather ||                 //
-           i == builtin::Function::kTextureGatherCompare ||          //
-           i == builtin::Function::kTextureLoad ||                   //
-           i == builtin::Function::kTextureSample ||                 //
-           i == builtin::Function::kTextureSampleBaseClampToEdge ||  //
-           i == builtin::Function::kTextureSampleBias ||             //
-           i == builtin::Function::kTextureSampleCompare ||          //
-           i == builtin::Function::kTextureSampleCompareLevel ||     //
-           i == builtin::Function::kTextureSampleGrad ||             //
-           i == builtin::Function::kTextureSampleLevel ||            //
-           i == builtin::Function::kTextureStore;
-}
-
-bool IsImageQueryBuiltin(builtin::Function i) {
-    return i == builtin::Function::kTextureDimensions ||
-           i == builtin::Function::kTextureNumLayers || i == builtin::Function::kTextureNumLevels ||
-           i == builtin::Function::kTextureNumSamples;
-}
-
-bool IsDataPackingBuiltin(builtin::Function i) {
-    return i == builtin::Function::kPack4X8Snorm || i == builtin::Function::kPack4X8Unorm ||
-           i == builtin::Function::kPack2X16Snorm || i == builtin::Function::kPack2X16Unorm ||
-           i == builtin::Function::kPack2X16Float;
-}
-
-bool IsDataUnpackingBuiltin(builtin::Function i) {
-    return i == builtin::Function::kUnpack4X8Snorm || i == builtin::Function::kUnpack4X8Unorm ||
-           i == builtin::Function::kUnpack2X16Snorm || i == builtin::Function::kUnpack2X16Unorm ||
-           i == builtin::Function::kUnpack2X16Float;
-}
-
-bool IsBarrierBuiltin(builtin::Function i) {
-    return i == builtin::Function::kWorkgroupBarrier || i == builtin::Function::kStorageBarrier;
-}
-
-bool IsAtomicBuiltin(builtin::Function i) {
-    return i == builtin::Function::kAtomicLoad || i == builtin::Function::kAtomicStore ||
-           i == builtin::Function::kAtomicAdd || i == builtin::Function::kAtomicSub ||
-           i == builtin::Function::kAtomicMax || i == builtin::Function::kAtomicMin ||
-           i == builtin::Function::kAtomicAnd || i == builtin::Function::kAtomicOr ||
-           i == builtin::Function::kAtomicXor || i == builtin::Function::kAtomicExchange ||
-           i == builtin::Function::kAtomicCompareExchangeWeak;
-}
-
-bool IsDP4aBuiltin(builtin::Function i) {
-    return i == builtin::Function::kDot4I8Packed || i == builtin::Function::kDot4U8Packed;
-}
-
 Builtin::Builtin(builtin::Function type,
                  const type::Type* return_type,
                  utils::VectorRef<Parameter*> parameters,
@@ -151,24 +85,7 @@
 }
 
 bool Builtin::HasSideEffects() const {
-    switch (type_) {
-        case builtin::Function::kAtomicAdd:
-        case builtin::Function::kAtomicAnd:
-        case builtin::Function::kAtomicCompareExchangeWeak:
-        case builtin::Function::kAtomicExchange:
-        case builtin::Function::kAtomicMax:
-        case builtin::Function::kAtomicMin:
-        case builtin::Function::kAtomicOr:
-        case builtin::Function::kAtomicStore:
-        case builtin::Function::kAtomicSub:
-        case builtin::Function::kAtomicXor:
-        case builtin::Function::kTextureStore:
-        case builtin::Function::kWorkgroupUniformLoad:
-            return true;
-        default:
-            break;
-    }
-    return false;
+    return builtin::HasSideEffects(type_);
 }
 
 builtin::Extension Builtin::RequiredExtension() const {
diff --git a/src/tint/sem/builtin.h b/src/tint/sem/builtin.h
index 07c3ad1..614afac 100644
--- a/src/tint/sem/builtin.h
+++ b/src/tint/sem/builtin.h
@@ -26,56 +26,6 @@
 
 namespace tint::sem {
 
-/// Determines if the given `i` is a coarse derivative
-/// @param i the builtin type
-/// @returns true if the given derivative is coarse.
-bool IsCoarseDerivativeBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a fine derivative
-/// @param i the builtin type
-/// @returns true if the given derivative is fine.
-bool IsFineDerivativeBuiltin(builtin::Function i);
-
-/// Determine if the given `i` is a derivative builtin
-/// @param i the builtin type
-/// @returns true if the given `i` is a derivative builtin
-bool IsDerivativeBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a texture operation builtin
-/// @param i the builtin type
-/// @returns true if the given `i` is a texture operation builtin
-bool IsTextureBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a image query builtin
-/// @param i the builtin type
-/// @returns true if the given `i` is a image query builtin
-bool IsImageQueryBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a data packing builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a data packing builtin
-bool IsDataPackingBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a data unpacking builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a data unpacking builtin
-bool IsDataUnpackingBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a barrier builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a barrier builtin
-bool IsBarrierBuiltin(builtin::Function i);
-
-/// Determines if the given `i` is a atomic builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a atomic builtin
-bool IsAtomicBuiltin(builtin::Function i);
-
-/// Determins if the given `i` is a DP4a builtin
-/// @param i the builtin
-/// @returns true if the given `i` is a DP4a builtin
-bool IsDP4aBuiltin(builtin::Function i);
-
 /// Builtin holds the semantic information for a builtin function.
 class Builtin final : public utils::Castable<Builtin, CallTarget> {
   public: