diff --git a/src/tint/lang/core/address_space.cc b/src/tint/lang/core/address_space.cc
index a9a6406..8906b5b 100644
--- a/src/tint/lang/core/address_space.cc
+++ b/src/tint/lang/core/address_space.cc
@@ -42,12 +42,6 @@
 /// @param str the string to parse
 /// @returns the parsed enum, or AddressSpace::kUndefined if the string could not be parsed.
 AddressSpace ParseAddressSpace(std::string_view str) {
-    if (str == "__in") {
-        return AddressSpace::kIn;
-    }
-    if (str == "__out") {
-        return AddressSpace::kOut;
-    }
     if (str == "function") {
         return AddressSpace::kFunction;
     }
diff --git a/src/tint/lang/core/address_space.def b/src/tint/lang/core/address_space.def
index 0b8631d..37845f5 100644
--- a/src/tint/lang/core/address_space.def
+++ b/src/tint/lang/core/address_space.def
@@ -7,7 +7,7 @@
   storage
   push_constant
   pixel_local
-  __in
-  __out
+  @internal __in
+  @internal __out
   @internal handle
 }
diff --git a/src/tint/lang/core/address_space.h b/src/tint/lang/core/address_space.h
index 00f808b..b6fde43 100644
--- a/src/tint/lang/core/address_space.h
+++ b/src/tint/lang/core/address_space.h
@@ -46,8 +46,8 @@
 /// Address space of a given pointer.
 enum class AddressSpace : uint8_t {
     kUndefined,
-    kIn,
-    kOut,
+    kIn,   // Tint-internal enum entry - not parsed
+    kOut,  // Tint-internal enum entry - not parsed
     kFunction,
     kHandle,  // Tint-internal enum entry - not parsed
     kPixelLocal,
@@ -76,8 +76,7 @@
 AddressSpace ParseAddressSpace(std::string_view str);
 
 constexpr std::string_view kAddressSpaceStrings[] = {
-    "__in",          "__out",   "function", "pixel_local", "private",
-    "push_constant", "storage", "uniform",  "workgroup",
+    "function", "pixel_local", "private", "push_constant", "storage", "uniform", "workgroup",
 };
 
 /// @returns true if the AddressSpace is host-shareable
diff --git a/src/tint/lang/core/address_space_bench.cc b/src/tint/lang/core/address_space_bench.cc
index f95f956..bd55c1b 100644
--- a/src/tint/lang/core/address_space_bench.cc
+++ b/src/tint/lang/core/address_space_bench.cc
@@ -45,69 +45,16 @@
 
 void AddressSpaceParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "ccin",
-        "3",
-        "_Vin",
-        "__in",
-        "1_in",
-        "_qiJ",
-        "_lli77",
-        "__qHupp",
-        "vt",
-        "G_bt",
-        "__out",
-        "__viut",
-        "__8WWt",
-        "Mxxou",
-        "fuXggton",
-        "fuXtou",
-        "funct3on",
-        "function",
-        "funEtion",
-        "PPncTTion",
-        "xxuncddon",
-        "pixe44_local",
-        "SSVVxel_local",
-        "pixRR_local",
-        "pixel_local",
-        "pixel_lF9a",
-        "pixel_loca",
-        "pOOxVRl_locH",
-        "prvaye",
-        "llnrrrv77te",
-        "priv4t00",
-        "private",
-        "rvooe",
-        "zzvate",
-        "piiippa1",
-        "puXXh_constant",
-        "pusII9_nn55nstant",
-        "YusHH_coaastSSrnt",
-        "push_constant",
-        "pushonkkHan",
-        "jush_consgRt",
-        "puh_cobsant",
-        "storaje",
-        "torage",
-        "qrage",
-        "storage",
-        "stoNNge",
-        "torgvv",
-        "QQorage",
-        "unffor",
-        "unifojm",
-        "uNNwfor8",
-        "uniform",
-        "uniorm",
-        "urriform",
-        "Gniform",
-        "workgrFFup",
-        "Eokgru",
-        "worrgroup",
-        "workgroup",
-        "wokgrou",
-        "woJDkgoup",
-        "okroup",
+        "fccnctin",     "ucti3",          "functVon",        "function",      "1unction",
+        "unJtqqon",     "llun77tion",     "pixppHq_local",   "ciellovl",      "ibGl_local",
+        "pixel_local",  "pivel_liical",   "pixel_lWW8al",    "piel_xxoMal",   "pXvatgg",
+        "rvaXe",        "priv3te",        "private",         "Erivate",       "pPTTvate",
+        "privadxx",     "push_c44nstant", "push_SSonsVVant", "pRs2Rconstant", "push_constant",
+        "push_coFstn9", "psh_constant",   "Vush_cnRRtOOHt",  "straye",        "llntrrr77ge",
+        "stor4g00",     "storage",        "trooe",           "zzrage",        "siioppa1",
+        "unifoXXm",     "9II5nnnform",    "uniaSSrHHYm",     "uniform",       "unkkm",
+        "jnigRo",       "ubfor",          "workgrojp",       "wrkgroup",      "wrkgrqp",
+        "workgroup",    "wrkNNroup",      "wokgouvv",        "orkgrQQup",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
diff --git a/src/tint/lang/core/address_space_test.cc b/src/tint/lang/core/address_space_test.cc
index 0f63446..ff9e90c 100644
--- a/src/tint/lang/core/address_space_test.cc
+++ b/src/tint/lang/core/address_space_test.cc
@@ -57,32 +57,24 @@
 }
 
 static constexpr Case kValidCases[] = {
-    {"__in", AddressSpace::kIn},
-    {"__out", AddressSpace::kOut},
-    {"function", AddressSpace::kFunction},
-    {"pixel_local", AddressSpace::kPixelLocal},
-    {"private", AddressSpace::kPrivate},
-    {"push_constant", AddressSpace::kPushConstant},
-    {"storage", AddressSpace::kStorage},
-    {"uniform", AddressSpace::kUniform},
+    {"function", AddressSpace::kFunction},   {"pixel_local", AddressSpace::kPixelLocal},
+    {"private", AddressSpace::kPrivate},     {"push_constant", AddressSpace::kPushConstant},
+    {"storage", AddressSpace::kStorage},     {"uniform", AddressSpace::kUniform},
     {"workgroup", AddressSpace::kWorkgroup},
 };
 
 static constexpr Case kInvalidCases[] = {
-    {"ccin", AddressSpace::kUndefined},           {"3", AddressSpace::kUndefined},
-    {"_Vin", AddressSpace::kUndefined},           {"__ou1", AddressSpace::kUndefined},
-    {"qq_Jt", AddressSpace::kUndefined},          {"__oll7t", AddressSpace::kUndefined},
-    {"qquntppHon", AddressSpace::kUndefined},     {"cnciv", AddressSpace::kUndefined},
-    {"funGion", AddressSpace::kUndefined},        {"pivel_liical", AddressSpace::kUndefined},
-    {"pixel_lWW8al", AddressSpace::kUndefined},   {"piel_xxoMal", AddressSpace::kUndefined},
-    {"pXvatgg", AddressSpace::kUndefined},        {"rvaXe", AddressSpace::kUndefined},
-    {"priv3te", AddressSpace::kUndefined},        {"push_constanE", AddressSpace::kUndefined},
-    {"push_TTPnstant", AddressSpace::kUndefined}, {"puxxdh_constan", AddressSpace::kUndefined},
-    {"s44orage", AddressSpace::kUndefined},       {"stSSraVVe", AddressSpace::kUndefined},
-    {"RtoR22e", AddressSpace::kUndefined},        {"uFfo9m", AddressSpace::kUndefined},
-    {"uniorm", AddressSpace::kUndefined},         {"VOORRHrm", AddressSpace::kUndefined},
-    {"woykgoup", AddressSpace::kUndefined},       {"l77nnrrkgroGp", AddressSpace::kUndefined},
-    {"wo4kgr00up", AddressSpace::kUndefined},
+    {"fccnctin", AddressSpace::kUndefined},       {"ucti3", AddressSpace::kUndefined},
+    {"functVon", AddressSpace::kUndefined},       {"pixel_loc1l", AddressSpace::kUndefined},
+    {"pqqxel_lJal", AddressSpace::kUndefined},    {"pixll77_local", AddressSpace::kUndefined},
+    {"ppqqivtHH", AddressSpace::kUndefined},      {"prcv", AddressSpace::kUndefined},
+    {"bivaGe", AddressSpace::kUndefined},         {"puvh_ciinstant", AddressSpace::kUndefined},
+    {"push8WWonstant", AddressSpace::kUndefined}, {"pxxsh_cMnstnt", AddressSpace::kUndefined},
+    {"sXraggg", AddressSpace::kUndefined},        {"traXe", AddressSpace::kUndefined},
+    {"stor3ge", AddressSpace::kUndefined},        {"Eniform", AddressSpace::kUndefined},
+    {"uPTTform", AddressSpace::kUndefined},       {"unifodxx", AddressSpace::kUndefined},
+    {"44orkgroup", AddressSpace::kUndefined},     {"VVorkSSroup", AddressSpace::kUndefined},
+    {"wrkgro2Rp", AddressSpace::kUndefined},
 };
 
 using AddressSpaceParseTest = testing::TestWithParam<Case>;
diff --git a/src/tint/lang/core/builtin_value.cc b/src/tint/lang/core/builtin_value.cc
index 11003a9..412bc6e 100644
--- a/src/tint/lang/core/builtin_value.cc
+++ b/src/tint/lang/core/builtin_value.cc
@@ -42,9 +42,6 @@
 /// @param str the string to parse
 /// @returns the parsed enum, or BuiltinValue::kUndefined if the string could not be parsed.
 BuiltinValue ParseBuiltinValue(std::string_view str) {
-    if (str == "__point_size") {
-        return BuiltinValue::kPointSize;
-    }
     if (str == "clip_distances") {
         return BuiltinValue::kClipDistances;
     }
diff --git a/src/tint/lang/core/builtin_value.h b/src/tint/lang/core/builtin_value.h
index 8c5d0d9..e4cc710 100644
--- a/src/tint/lang/core/builtin_value.h
+++ b/src/tint/lang/core/builtin_value.h
@@ -46,7 +46,7 @@
 /// Builtin value defined with `@builtin(<name>)`.
 enum class BuiltinValue : uint8_t {
     kUndefined,
-    kPointSize,
+    kPointSize,  // Tint-internal enum entry - not parsed
     kClipDistances,
     kFragDepth,
     kFrontFacing,
@@ -82,10 +82,11 @@
 BuiltinValue ParseBuiltinValue(std::string_view str);
 
 constexpr std::string_view kBuiltinValueStrings[] = {
-    "__point_size",           "clip_distances", "frag_depth",          "front_facing",
-    "global_invocation_id",   "instance_index", "local_invocation_id", "local_invocation_index",
-    "num_workgroups",         "position",       "sample_index",        "sample_mask",
-    "subgroup_invocation_id", "subgroup_size",  "vertex_index",        "workgroup_id",
+    "clip_distances",         "frag_depth",     "front_facing",
+    "global_invocation_id",   "instance_index", "local_invocation_id",
+    "local_invocation_index", "num_workgroups", "position",
+    "sample_index",           "sample_mask",    "subgroup_invocation_id",
+    "subgroup_size",          "vertex_index",   "workgroup_id",
 };
 
 }  // namespace tint::core
diff --git a/src/tint/lang/core/builtin_value_bench.cc b/src/tint/lang/core/builtin_value_bench.cc
index 07fbc2e..e8dbcad 100644
--- a/src/tint/lang/core/builtin_value_bench.cc
+++ b/src/tint/lang/core/builtin_value_bench.cc
@@ -45,118 +45,111 @@
 
 void BuiltinValueParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "_ccpoint_siz",
-        "_3poi_ile",
-        "__poiVt_size",
-        "__point_size",
-        "1_point_size",
-        "__pointJsqze",
-        "__lloint_siz77",
-        "clppp_disqHHancs",
-        "cli_dvsnces",
-        "cip_diGtances",
+        "clip_distacecc",
+        "c_disla3ces",
+        "cliV_distances",
         "clip_distances",
-        "clvp_distaniies",
-        "8lip_disWWances",
-        "clixx_disances",
-        "fXag_detgg",
-        "fag_XuVh",
-        "frag_dept3",
+        "clip1distances",
+        "cqqiJ_distanes",
+        "clip_dllstance77",
+        "frqqgppepHHh",
+        "fv_dcpt",
+        "frabGdeth",
         "frag_depth",
-        "frag_deptE",
-        "TTrag_dePPt",
-        "fragddxxpth",
-        "44ront_facing",
-        "fSSont_facinVV",
-        "fronR_Racing",
+        "frag_veiith",
+        "fr8g_depWWh",
+        "Mragxxepth",
+        "ggroXtfacing",
+        "Vot_fuciXg",
+        "front_fac3ng",
         "front_facing",
-        "ron9_faciFg",
-        "front_facin",
-        "fVonRR_HaOing",
-        "global_iyvocatin_id",
-        "globrrlln_invocation_G77",
-        "glob00l_invocati4n_id",
+        "front_fEcing",
+        "fronPPfaTTing",
+        "ddroxxtfacing",
+        "global_invocatio44_id",
+        "global_invocaSSioVV_id",
+        "22loRal_invoRtion_id",
         "global_invocation_id",
-        "gloa_invocatinooid",
-        "globl_nvocationzzid",
-        "loal_piinvocat11on_id",
-        "instance_indXXx",
-        "55nstan99enIIindex",
-        "iHHstancSS_aanrrYx",
+        "globalFinvoction_id",
+        "gloal_invocation_id",
+        "RRlHOOaV_invoction_id",
+        "instance_ydex",
+        "instGlr77cnn_index",
+        "instan04e_index",
         "instance_index",
-        "inskkaHce_dx",
-        "insRRanceijge",
-        "instance_inb",
-        "ljcal_invocation_id",
-        "local_invocaton_id",
-        "local_inqocain_id",
+        "insacoo_inex",
+        "izstane_index",
+        "nippance_in11ex",
+        "local_invXXcation_id",
+        "lIIcal_i5599ocation_inn",
+        "HHrrcal_inSSocation_Yaa",
         "local_invocation_id",
-        "local_invNNation_id",
-        "loalvvinvoction_id",
-        "ocal_invocatioQQ_id",
-        "rcal_invffcaton_index",
-        "lojal_invocation_index",
-        "lcNNwl_in2ocat8on_index",
+        "lokkal_invocatini",
+        "jocal_invocRRongid",
+        "local_inocatbon_i",
+        "local_injocation_index",
+        "local_invocatio_index",
+        "locl_invocqtion_ndex",
         "local_invocation_index",
-        "local_invcation_index",
-        "local_rrnvocation_index",
-        "local_invocatGon_index",
-        "num_workgroupFF",
-        "nEm_ogroups",
-        "numwrrrkgroups",
+        "localNNinvocaton_index",
+        "local_invocatin_ivvdx",
+        "locl_invocatioQQ_index",
+        "num_workgffus",
+        "num_workgroujs",
+        "num_wrkgNNwoup8",
         "num_workgroups",
-        "um_workgrops",
-        "DX_worJJgroups",
-        "nu8_orkgrop",
-        "ps11tk",
-        "positio",
-        "poitJon",
+        "numworkgroups",
+        "num_workrrroups",
+        "num_worGgroups",
+        "pFFsition",
+        "pEiio",
+        "prrsitio",
         "position",
-        "posicion",
-        "positiOn",
-        "positiKK_vtt",
-        "smple5inxxe8",
-        "s__mle_qFdex",
-        "saqqple_idex",
+        "sition",
+        "poJJDtin",
+        "poi8i",
+        "smpke11nde",
+        "samle_index",
+        "saple_Jndex",
         "sample_index",
-        "saOpe_33nde66",
-        "s6oople_indttQx",
-        "sam66le_inex",
-        "samxe66masOz",
-        "yyample_mask",
-        "amplZZHask",
+        "cample_index",
+        "sample_indOx",
+        "savvKKl___inttex",
+        "sam8le_xx5k",
+        "sampqq__msk",
+        "sampleqmask",
         "sample_mask",
-        "WWaple_maq4k",
-        "samplOO_ask",
-        "sYohpe_msk",
-        "subgroup_vocaton_id",
-        "subgroup_invocatoF_id",
-        "subgroup_invocwtion_i",
+        "33amOe_mas66",
+        "samoott6QQmask",
+        "66mple_mask",
+        "subroup_invoOaxion_i6zz",
+        "subgroup_inyyocation_id",
+        "subgrup_invcatiZHH_id",
         "subgroup_invocation_id",
-        "suKrffupGinvocation_d",
-        "subgroup_KKnvqcation_id",
-        "subgroup_inmmo3ation_iF",
-        "subgroup_ize",
-        "subgroup_izq",
-        "sbgroup_bbize",
+        "subgroqp_inWWoat44on_id",
+        "subgrou_inOOocation_id",
+        "suhgrup_invoYation_id",
+        "subroup_si",
+        "suFgoup_size",
+        "subgowp_size",
         "subgroup_size",
-        "sbiiroup_siz",
-        "sbgroqOp_size",
-        "TTubgroup_sivve",
-        "vertFFx_index",
-        "vertePfnQ00x",
-        "vePtex_index",
+        "suffgKup_sie",
+        "KKubgroqp_size",
+        "subFroup3mmize",
+        "ertex_index",
+        "verteq_inex",
+        "verbx_indbbx",
         "vertex_index",
-        "vesstexinde77",
-        "vertex_indbbRC",
-        "vertex_indeXX",
-        "workgOOup_qOCC",
-        "wrkgrous_iL",
-        "workgroup_iX",
+        "iertex_indx",
+        "veOOtexqidex",
+        "vertexvvindTTx",
+        "workFFroup_id",
+        "workgPfpQ00d",
+        "woPkgroup_id",
         "workgroup_id",
-        "workgoup_id",
-        "orgrqqO_id",
-        "workg22oup_id",
+        "wosskgrup_i77",
+        "workgroup_bbRC",
+        "workgroup_iXX",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
diff --git a/src/tint/lang/core/builtin_value_test.cc b/src/tint/lang/core/builtin_value_test.cc
index 184d68a..c5d87fd 100644
--- a/src/tint/lang/core/builtin_value_test.cc
+++ b/src/tint/lang/core/builtin_value_test.cc
@@ -57,7 +57,6 @@
 }
 
 static constexpr Case kValidCases[] = {
-    {"__point_size", BuiltinValue::kPointSize},
     {"clip_distances", BuiltinValue::kClipDistances},
     {"frag_depth", BuiltinValue::kFragDepth},
     {"front_facing", BuiltinValue::kFrontFacing},
@@ -76,54 +75,51 @@
 };
 
 static constexpr Case kInvalidCases[] = {
-    {"_ccpoint_siz", BuiltinValue::kUndefined},
-    {"_3poi_ile", BuiltinValue::kUndefined},
-    {"__poiVt_size", BuiltinValue::kUndefined},
-    {"clip1distances", BuiltinValue::kUndefined},
-    {"cqqiJ_distanes", BuiltinValue::kUndefined},
-    {"clip_dllstance77", BuiltinValue::kUndefined},
-    {"frqqgppepHHh", BuiltinValue::kUndefined},
-    {"fv_dcpt", BuiltinValue::kUndefined},
-    {"frabGdeth", BuiltinValue::kUndefined},
-    {"front_facvnii", BuiltinValue::kUndefined},
-    {"frWWnt_faci8g", BuiltinValue::kUndefined},
-    {"fxxonM_facig", BuiltinValue::kUndefined},
-    {"gXobalgginvocationid", BuiltinValue::kUndefined},
-    {"goVal_uvocatioX_id", BuiltinValue::kUndefined},
-    {"global_in3ocation_id", BuiltinValue::kUndefined},
-    {"instancE_index", BuiltinValue::kUndefined},
-    {"nsTTance_PPndex", BuiltinValue::kUndefined},
-    {"nstancxx_indddx", BuiltinValue::kUndefined},
-    {"local_invocation_i44", BuiltinValue::kUndefined},
-    {"local_invoVVatSSon_id", BuiltinValue::kUndefined},
-    {"local_inRoctionR2id", BuiltinValue::kUndefined},
-    {"local_in9oation_iFdex", BuiltinValue::kUndefined},
-    {"local_invocation_inde", BuiltinValue::kUndefined},
-    {"local_OOnvoVtiRRn_index", BuiltinValue::kUndefined},
-    {"num_workgyups", BuiltinValue::kUndefined},
-    {"num_Glr77rnngroups", BuiltinValue::kUndefined},
-    {"num_wo04kgroups", BuiltinValue::kUndefined},
-    {"osooon", BuiltinValue::kUndefined},
-    {"posizzn", BuiltinValue::kUndefined},
-    {"poiippt1o", BuiltinValue::kUndefined},
-    {"sample_iXXdex", BuiltinValue::kUndefined},
-    {"5nnample_99IIdex", BuiltinValue::kUndefined},
-    {"samYlaaHHrrndeSS", BuiltinValue::kUndefined},
-    {"aHkk_mask", BuiltinValue::kUndefined},
-    {"jRRmpl_gsk", BuiltinValue::kUndefined},
-    {"smple_mbk", BuiltinValue::kUndefined},
-    {"subgroupjinvocation_id", BuiltinValue::kUndefined},
-    {"subgroup_invocaion_id", BuiltinValue::kUndefined},
-    {"subroup_inqocatin_id", BuiltinValue::kUndefined},
-    {"subNNoup_size", BuiltinValue::kUndefined},
-    {"subgrupsizvv", BuiltinValue::kUndefined},
-    {"sugroup_sizQQ", BuiltinValue::kUndefined},
-    {"vrtexinderf", BuiltinValue::kUndefined},
-    {"vertex_indjx", BuiltinValue::kUndefined},
-    {"v82wNNex_idex", BuiltinValue::kUndefined},
-    {"wrkgroup_id", BuiltinValue::kUndefined},
-    {"workgrrrup_id", BuiltinValue::kUndefined},
-    {"wGrkgroup_id", BuiltinValue::kUndefined},
+    {"clip_distacecc", BuiltinValue::kUndefined},
+    {"c_disla3ces", BuiltinValue::kUndefined},
+    {"cliV_distances", BuiltinValue::kUndefined},
+    {"frag1depth", BuiltinValue::kUndefined},
+    {"fraJqqepth", BuiltinValue::kUndefined},
+    {"fra7ll_depth", BuiltinValue::kUndefined},
+    {"fonHHpp_facing", BuiltinValue::kUndefined},
+    {"fron_facg", BuiltinValue::kUndefined},
+    {"frGnt_fbcin", BuiltinValue::kUndefined},
+    {"glvbal_iinvocation_id", BuiltinValue::kUndefined},
+    {"gl8bal_invocation_WWd", BuiltinValue::kUndefined},
+    {"Mlobal_invocaton_xxd", BuiltinValue::kUndefined},
+    {"isXance_indegg", BuiltinValue::kUndefined},
+    {"insanc_iXVex", BuiltinValue::kUndefined},
+    {"instance_in3ex", BuiltinValue::kUndefined},
+    {"local_Envocation_id", BuiltinValue::kUndefined},
+    {"localiPPvocatioTT_id", BuiltinValue::kUndefined},
+    {"localxxnvocationddid", BuiltinValue::kUndefined},
+    {"loca44_invocation_index", BuiltinValue::kUndefined},
+    {"local_invocSStionVVindex", BuiltinValue::kUndefined},
+    {"locRR_invocat22n_index", BuiltinValue::kUndefined},
+    {"nuF_workrou9s", BuiltinValue::kUndefined},
+    {"numworkgroups", BuiltinValue::kUndefined},
+    {"nuRRworVgOOHups", BuiltinValue::kUndefined},
+    {"posytio", BuiltinValue::kUndefined},
+    {"77orritllnon", BuiltinValue::kUndefined},
+    {"04osition", BuiltinValue::kUndefined},
+    {"smpe_oonde", BuiltinValue::kUndefined},
+    {"smpl_inzzex", BuiltinValue::kUndefined},
+    {"saiip11eindep", BuiltinValue::kUndefined},
+    {"sample_XXask", BuiltinValue::kUndefined},
+    {"samII99l55_mask", BuiltinValue::kUndefined},
+    {"samaale_SSrHHYk", BuiltinValue::kUndefined},
+    {"skkgroup_Hnvocatio_d", BuiltinValue::kUndefined},
+    {"gRbgroup_invocajionid", BuiltinValue::kUndefined},
+    {"sbgroup_nbocation_id", BuiltinValue::kUndefined},
+    {"subgroupjsize", BuiltinValue::kUndefined},
+    {"subgroup_sie", BuiltinValue::kUndefined},
+    {"sgroupqsize", BuiltinValue::kUndefined},
+    {"vertx_NNndex", BuiltinValue::kUndefined},
+    {"vvertex_dex", BuiltinValue::kUndefined},
+    {"ertex_inQQex", BuiltinValue::kUndefined},
+    {"wrkgrup_irf", BuiltinValue::kUndefined},
+    {"workgroup_jd", BuiltinValue::kUndefined},
+    {"w82wNNgrou_id", BuiltinValue::kUndefined},
 };
 
 using BuiltinValueParseTest = testing::TestWithParam<Case>;
diff --git a/src/tint/lang/core/core.def b/src/tint/lang/core/core.def
index af75950..3ec4dff 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -64,7 +64,7 @@
   clip_distances
   subgroup_invocation_id
   subgroup_size
-  __point_size
+  @internal __point_size
 }
 
 // https://www.w3.org/TR/WGSL/#interpolation
diff --git a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io_test.cc b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io_test.cc
index 90a3bc1..4f48b45 100644
--- a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io_test.cc
@@ -68,47 +68,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, Parameters_Spirv) {
-    auto* src = R"(
-enable chromium_experimental_framebuffer_fetch;
-
-@fragment
-fn frag_main(@location(1) loc1 : f32,
-             @location(2) @interpolate(flat) loc2 : vec4<u32>,
-             @builtin(position) coord : vec4<f32>,
-             @color(3) color : vec4<f32>) {
-  var col : f32 = (coord.x * loc1) + color.g;
-}
-)";
-
-    auto* expect = R"(
-enable chromium_experimental_framebuffer_fetch;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> loc1_1 : f32;
-
-@location(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> loc2_1 : vec4<u32>;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__in> coord_1 : vec4<f32>;
-
-@color(3) @internal(disable_validation__ignore_address_space) var<__in> color_1 : vec4<f32>;
-
-fn frag_main_inner(loc1 : f32, loc2 : vec4<u32>, coord : vec4<f32>, color : vec4<f32>) {
-  var col : f32 = ((coord.x * loc1) + color.g);
-}
-
-@fragment
-fn frag_main() {
-  frag_main_inner(loc1_1, loc2_1, coord_1, color_1);
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, Parameters_Msl) {
     auto* src = R"(
 enable chromium_experimental_framebuffer_fetch;
@@ -265,156 +224,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, StructParameters_Spirv) {
-    auto* src = R"(
-enable chromium_experimental_framebuffer_fetch;
-
-struct FragBuiltins {
-  @builtin(position) coord : vec4<f32>,
-};
-struct FragLocations {
-  @location(1) loc1 : f32,
-  @location(2) @interpolate(flat) loc2 : vec4<u32>,
-};
-struct FragColors {
-  @color(3) col3 : vec4<f32>,
-  @color(1) col1 : vec4<u32>,
-  @color(2) col2 : vec4<i32>,
-};
-
-@fragment
-fn frag_main(@location(0) loc0 : f32,
-             locations : FragLocations,
-             builtins : FragBuiltins,
-             colors : FragColors) {
-  var col : f32 = (((builtins.coord.x * locations.loc1) + loc0) + colors.col3.g);
-}
-)";
-
-    auto* expect = R"(
-enable chromium_experimental_framebuffer_fetch;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> loc0_1 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> loc1_1 : f32;
-
-@location(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> loc2_1 : vec4<u32>;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__in> coord_1 : vec4<f32>;
-
-@color(3) @internal(disable_validation__ignore_address_space) var<__in> col3_1 : vec4<f32>;
-
-@color(1) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> col1_1 : vec4<u32>;
-
-@color(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> col2_1 : vec4<i32>;
-
-struct FragBuiltins {
-  coord : vec4<f32>,
-}
-
-struct FragLocations {
-  loc1 : f32,
-  loc2 : vec4<u32>,
-}
-
-struct FragColors {
-  col3 : vec4<f32>,
-  col1 : vec4<u32>,
-  col2 : vec4<i32>,
-}
-
-fn frag_main_inner(loc0 : f32, locations : FragLocations, builtins : FragBuiltins, colors : FragColors) {
-  var col : f32 = (((builtins.coord.x * locations.loc1) + loc0) + colors.col3.g);
-}
-
-@fragment
-fn frag_main() {
-  frag_main_inner(loc0_1, FragLocations(loc1_1, loc2_1), FragBuiltins(coord_1), FragColors(col3_1, col1_1, col2_1));
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, StructParameters_Spirv_OutOfOrder) {
-    auto* src = R"(
-enable chromium_experimental_framebuffer_fetch;
-
-@fragment
-fn frag_main(@location(0) loc0 : f32,
-             locations : FragLocations,
-             builtins : FragBuiltins,
-             colors : FragColors) {
-  var col : f32 = (((builtins.coord.x * locations.loc1) + loc0) + colors.col3.g);
-}
-
-struct FragBuiltins {
-  @builtin(position) coord : vec4<f32>,
-};
-struct FragLocations {
-  @location(1) loc1 : f32,
-  @location(2) @interpolate(flat) loc2 : vec4<u32>,
-};
-struct FragColors {
-  @color(3) col3 : vec4<f32>,
-  @color(1) col1 : vec4<u32>,
-  @color(2) col2 : vec4<i32>,
-};
-)";
-
-    auto* expect = R"(
-enable chromium_experimental_framebuffer_fetch;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> loc0_1 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> loc1_1 : f32;
-
-@location(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> loc2_1 : vec4<u32>;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__in> coord_1 : vec4<f32>;
-
-@color(3) @internal(disable_validation__ignore_address_space) var<__in> col3_1 : vec4<f32>;
-
-@color(1) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> col1_1 : vec4<u32>;
-
-@color(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> col2_1 : vec4<i32>;
-
-fn frag_main_inner(loc0 : f32, locations : FragLocations, builtins : FragBuiltins, colors : FragColors) {
-  var col : f32 = (((builtins.coord.x * locations.loc1) + loc0) + colors.col3.g);
-}
-
-@fragment
-fn frag_main() {
-  frag_main_inner(loc0_1, FragLocations(loc1_1, loc2_1), FragBuiltins(coord_1), FragColors(col3_1, col1_1, col2_1));
-}
-
-struct FragBuiltins {
-  coord : vec4<f32>,
-}
-
-struct FragLocations {
-  loc1 : f32,
-  loc2 : vec4<u32>,
-}
-
-struct FragColors {
-  col3 : vec4<f32>,
-  col1 : vec4<u32>,
-  col2 : vec4<i32>,
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, StructParameters_kMsl) {
     auto* src = R"(
 enable chromium_experimental_framebuffer_fetch;
@@ -723,35 +532,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, Return_NonStruct_Spirv) {
-    auto* src = R"(
-@fragment
-fn frag_main() -> @builtin(frag_depth) f32 {
-  return 1.0;
-}
-)";
-
-    auto* expect = R"(
-@builtin(frag_depth) @internal(disable_validation__ignore_address_space) var<__out> value : f32;
-
-fn frag_main_inner() -> f32 {
-  return 1.0;
-}
-
-@fragment
-fn frag_main() {
-  let inner_result = frag_main_inner();
-  value = inner_result;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, Return_NonStruct_Msl) {
     auto* src = R"(
 @fragment
@@ -820,116 +600,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Spirv) {
-    auto* src = R"(
-struct FragOutput {
-  @location(0) color : vec4<f32>,
-  @builtin(frag_depth) depth : f32,
-  @builtin(sample_mask) mask : u32,
-};
-
-@fragment
-fn frag_main() -> FragOutput {
-  var output : FragOutput;
-  output.depth = 1.0;
-  output.mask = 7u;
-  output.color = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  return output;
-}
-)";
-
-    auto* expect = R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__out> color_1 : vec4<f32>;
-
-@builtin(frag_depth) @internal(disable_validation__ignore_address_space) var<__out> depth_1 : f32;
-
-@builtin(sample_mask) @internal(disable_validation__ignore_address_space) var<__out> mask_1 : array<u32, 1u>;
-
-struct FragOutput {
-  color : vec4<f32>,
-  depth : f32,
-  mask : u32,
-}
-
-fn frag_main_inner() -> FragOutput {
-  var output : FragOutput;
-  output.depth = 1.0;
-  output.mask = 7u;
-  output.color = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  return output;
-}
-
-@fragment
-fn frag_main() {
-  let inner_result = frag_main_inner();
-  color_1 = inner_result.color;
-  depth_1 = inner_result.depth;
-  mask_1[0i] = inner_result.mask;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Spirv_OutOfOrder) {
-    auto* src = R"(
-@fragment
-fn frag_main() -> FragOutput {
-  var output : FragOutput;
-  output.depth = 1.0;
-  output.mask = 7u;
-  output.color = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  return output;
-}
-
-struct FragOutput {
-  @location(0) color : vec4<f32>,
-  @builtin(frag_depth) depth : f32,
-  @builtin(sample_mask) mask : u32,
-};
-)";
-
-    auto* expect = R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__out> color_1 : vec4<f32>;
-
-@builtin(frag_depth) @internal(disable_validation__ignore_address_space) var<__out> depth_1 : f32;
-
-@builtin(sample_mask) @internal(disable_validation__ignore_address_space) var<__out> mask_1 : array<u32, 1u>;
-
-fn frag_main_inner() -> FragOutput {
-  var output : FragOutput;
-  output.depth = 1.0;
-  output.mask = 7u;
-  output.color = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  return output;
-}
-
-@fragment
-fn frag_main() {
-  let inner_result = frag_main_inner();
-  color_1 = inner_result.color;
-  depth_1 = inner_result.depth;
-  mask_1[0i] = inner_result.mask;
-}
-
-struct FragOutput {
-  color : vec4<f32>,
-  depth : f32,
-  mask : u32,
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Msl) {
     auto* src = R"(
 struct FragOutput {
@@ -1170,138 +840,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, StructParameters_SharedDeviceFunction_Spirv) {
-    auto* src = R"(
-struct FragmentInput {
-  @location(0) value : f32,
-  @location(1) mul : f32,
-};
-
-fn foo(x : FragmentInput) -> f32 {
-  return x.value * x.mul;
-}
-
-@fragment
-fn frag_main1(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-
-@fragment
-fn frag_main2(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-)";
-
-    auto* expect = R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> value_1 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> mul_1 : f32;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> value_2 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> mul_2 : f32;
-
-struct FragmentInput {
-  value : f32,
-  mul : f32,
-}
-
-fn foo(x : FragmentInput) -> f32 {
-  return (x.value * x.mul);
-}
-
-fn frag_main1_inner(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-
-@fragment
-fn frag_main1() {
-  frag_main1_inner(FragmentInput(value_1, mul_1));
-}
-
-fn frag_main2_inner(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-
-@fragment
-fn frag_main2() {
-  frag_main2_inner(FragmentInput(value_2, mul_2));
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, StructParameters_SharedDeviceFunction_Spirv_OutOfOrder) {
-    auto* src = R"(
-@fragment
-fn frag_main1(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-
-@fragment
-fn frag_main2(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-
-fn foo(x : FragmentInput) -> f32 {
-  return x.value * x.mul;
-}
-
-struct FragmentInput {
-  @location(0) value : f32,
-  @location(1) mul : f32,
-};
-)";
-
-    auto* expect = R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> value_1 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> mul_1 : f32;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> value_2 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> mul_2 : f32;
-
-fn frag_main1_inner(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-
-@fragment
-fn frag_main1() {
-  frag_main1_inner(FragmentInput(value_1, mul_1));
-}
-
-fn frag_main2_inner(inputs : FragmentInput) {
-  var x : f32 = foo(inputs);
-}
-
-@fragment
-fn frag_main2() {
-  frag_main2_inner(FragmentInput(value_2, mul_2));
-}
-
-fn foo(x : FragmentInput) -> f32 {
-  return (x.value * x.mul);
-}
-
-struct FragmentInput {
-  value : f32,
-  mul : f32,
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, StructParameters_SharedDeviceFunction_Msl) {
     auto* src = R"(
 struct FragmentInput {
@@ -2078,266 +1616,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, InterpolateAttributes_Integers_Spirv) {
-    // Test that we add a Flat attribute to integers that are vertex outputs and
-    // fragment inputs, but not vertex inputs or fragment outputs.
-    auto* src = R"(
-struct VertexIn {
-  @location(0) i : i32,
-  @location(1) u : u32,
-  @location(2) vi : vec4<i32>,
-  @location(3) vu : vec4<u32>,
-};
-
-struct VertexOut {
-  @location(0) @interpolate(flat) i : i32,
-  @location(1) @interpolate(flat) u : u32,
-  @location(2) @interpolate(flat) vi : vec4<i32>,
-  @location(3) @interpolate(flat) vu : vec4<u32>,
-  @builtin(position) pos : vec4<f32>,
-};
-
-struct FragmentInterface {
-  @location(0) @interpolate(flat) i : i32,
-  @location(1) @interpolate(flat) u : u32,
-  @location(2) @interpolate(flat) vi : vec4<i32>,
-  @location(3) @interpolate(flat) vu : vec4<u32>,
-};
-
-@vertex
-fn vert_main(in : VertexIn) -> VertexOut {
-  return VertexOut(in.i, in.u, in.vi, in.vu, vec4<f32>());
-}
-
-@fragment
-fn frag_main(inputs : FragmentInterface) -> FragmentInterface {
-  return inputs;
-}
-)";
-
-    auto* expect =
-        R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> i_1 : i32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> u_1 : u32;
-
-@location(2) @internal(disable_validation__ignore_address_space) var<__in> vi_1 : vec4<i32>;
-
-@location(3) @internal(disable_validation__ignore_address_space) var<__in> vu_1 : vec4<u32>;
-
-@location(0) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> i_2 : i32;
-
-@location(1) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> u_2 : u32;
-
-@location(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> vi_2 : vec4<i32>;
-
-@location(3) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> vu_2 : vec4<u32>;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> pos_1 : vec4<f32>;
-
-@location(0) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> i_3 : i32;
-
-@location(1) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> u_3 : u32;
-
-@location(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> vi_3 : vec4<i32>;
-
-@location(3) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> vu_3 : vec4<u32>;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__out> i_4 : i32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__out> u_4 : u32;
-
-@location(2) @internal(disable_validation__ignore_address_space) var<__out> vi_4 : vec4<i32>;
-
-@location(3) @internal(disable_validation__ignore_address_space) var<__out> vu_4 : vec4<u32>;
-
-struct VertexIn {
-  i : i32,
-  u : u32,
-  vi : vec4<i32>,
-  vu : vec4<u32>,
-}
-
-struct VertexOut {
-  i : i32,
-  u : u32,
-  vi : vec4<i32>,
-  vu : vec4<u32>,
-  pos : vec4<f32>,
-}
-
-struct FragmentInterface {
-  i : i32,
-  u : u32,
-  vi : vec4<i32>,
-  vu : vec4<u32>,
-}
-
-fn vert_main_inner(in : VertexIn) -> VertexOut {
-  return VertexOut(in.i, in.u, in.vi, in.vu, vec4<f32>());
-}
-
-@vertex
-fn vert_main() {
-  let inner_result = vert_main_inner(VertexIn(i_1, u_1, vi_1, vu_1));
-  i_2 = inner_result.i;
-  u_2 = inner_result.u;
-  vi_2 = inner_result.vi;
-  vu_2 = inner_result.vu;
-  pos_1 = inner_result.pos;
-}
-
-fn frag_main_inner(inputs : FragmentInterface) -> FragmentInterface {
-  return inputs;
-}
-
-@fragment
-fn frag_main() {
-  let inner_result_1 = frag_main_inner(FragmentInterface(i_3, u_3, vi_3, vu_3));
-  i_4 = inner_result_1.i;
-  u_4 = inner_result_1.u;
-  vi_4 = inner_result_1.vi;
-  vu_4 = inner_result_1.vu;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, InterpolateAttributes_Integers_Spirv_OutOfOrder) {
-    // Test that we add a Flat attribute to integers that are vertex outputs and
-    // fragment inputs, but not vertex inputs or fragment outputs.
-    auto* src = R"(
-@vertex
-fn vert_main(in : VertexIn) -> VertexOut {
-  return VertexOut(in.i, in.u, in.vi, in.vu, vec4<f32>());
-}
-
-@fragment
-fn frag_main(inputs : FragmentInterface) -> FragmentInterface {
-  return inputs;
-}
-
-struct VertexIn {
-  @location(0) i : i32,
-  @location(1) u : u32,
-  @location(2) vi : vec4<i32>,
-  @location(3) vu : vec4<u32>,
-};
-
-struct VertexOut {
-  @location(0) @interpolate(flat) i : i32,
-  @location(1) @interpolate(flat) u : u32,
-  @location(2) @interpolate(flat) vi : vec4<i32>,
-  @location(3) @interpolate(flat) vu : vec4<u32>,
-  @builtin(position) pos : vec4<f32>,
-};
-
-struct FragmentInterface {
-  @location(0) @interpolate(flat) i : i32,
-  @location(1) @interpolate(flat) u : u32,
-  @location(2) @interpolate(flat) vi : vec4<i32>,
-  @location(3) @interpolate(flat) vu : vec4<u32>,
-};
-)";
-
-    auto* expect =
-        R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> i_1 : i32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> u_1 : u32;
-
-@location(2) @internal(disable_validation__ignore_address_space) var<__in> vi_1 : vec4<i32>;
-
-@location(3) @internal(disable_validation__ignore_address_space) var<__in> vu_1 : vec4<u32>;
-
-@location(0) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> i_2 : i32;
-
-@location(1) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> u_2 : u32;
-
-@location(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> vi_2 : vec4<i32>;
-
-@location(3) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__out> vu_2 : vec4<u32>;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> pos_1 : vec4<f32>;
-
-@location(0) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> i_3 : i32;
-
-@location(1) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> u_3 : u32;
-
-@location(2) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> vi_3 : vec4<i32>;
-
-@location(3) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> vu_3 : vec4<u32>;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__out> i_4 : i32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__out> u_4 : u32;
-
-@location(2) @internal(disable_validation__ignore_address_space) var<__out> vi_4 : vec4<i32>;
-
-@location(3) @internal(disable_validation__ignore_address_space) var<__out> vu_4 : vec4<u32>;
-
-fn vert_main_inner(in : VertexIn) -> VertexOut {
-  return VertexOut(in.i, in.u, in.vi, in.vu, vec4<f32>());
-}
-
-@vertex
-fn vert_main() {
-  let inner_result = vert_main_inner(VertexIn(i_1, u_1, vi_1, vu_1));
-  i_2 = inner_result.i;
-  u_2 = inner_result.u;
-  vi_2 = inner_result.vi;
-  vu_2 = inner_result.vu;
-  pos_1 = inner_result.pos;
-}
-
-fn frag_main_inner(inputs : FragmentInterface) -> FragmentInterface {
-  return inputs;
-}
-
-@fragment
-fn frag_main() {
-  let inner_result_1 = frag_main_inner(FragmentInterface(i_3, u_3, vi_3, vu_3));
-  i_4 = inner_result_1.i;
-  u_4 = inner_result_1.u;
-  vi_4 = inner_result_1.vi;
-  vu_4 = inner_result_1.vu;
-}
-
-struct VertexIn {
-  i : i32,
-  u : u32,
-  vi : vec4<i32>,
-  vu : vec4<u32>,
-}
-
-struct VertexOut {
-  i : i32,
-  u : u32,
-  vi : vec4<i32>,
-  vu : vec4<u32>,
-  pos : vec4<f32>,
-}
-
-struct FragmentInterface {
-  i : i32,
-  u : u32,
-  vi : vec4<i32>,
-  vu : vec4<u32>,
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, InvariantAttributes) {
     auto* src = R"(
 struct VertexOut {
@@ -3317,39 +2595,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnNonStruct_Spirv) {
-    auto* src = R"(
-@vertex
-fn vert_main() -> @builtin(position) vec4<f32> {
-  return vec4<f32>();
-}
-)";
-
-    auto* expect = R"(
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> value : vec4<f32>;
-
-@builtin(__point_size) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size : f32;
-
-fn vert_main_inner() -> vec4<f32> {
-  return vec4<f32>();
-}
-
-@vertex
-fn vert_main() {
-  let inner_result = vert_main_inner();
-  value = inner_result;
-  vertex_point_size = 1.0f;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv,
-                                               0xFFFFFFFF, true);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnNonStruct_Msl) {
     auto* src = R"(
 @vertex
@@ -3388,88 +2633,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnStruct_Spirv) {
-    auto* src = R"(
-struct VertOut {
-  @builtin(position) pos : vec4<f32>,
-};
-
-@vertex
-fn vert_main() -> VertOut {
-  return VertOut();
-}
-)";
-
-    auto* expect = R"(
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> pos_1 : vec4<f32>;
-
-@builtin(__point_size) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size : f32;
-
-struct VertOut {
-  pos : vec4<f32>,
-}
-
-fn vert_main_inner() -> VertOut {
-  return VertOut();
-}
-
-@vertex
-fn vert_main() {
-  let inner_result = vert_main_inner();
-  pos_1 = inner_result.pos;
-  vertex_point_size = 1.0f;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv,
-                                               0xFFFFFFFF, true);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnStruct_Spirv_OutOfOrder) {
-    auto* src = R"(
-@vertex
-fn vert_main() -> VertOut {
-  return VertOut();
-}
-
-struct VertOut {
-  @builtin(position) pos : vec4<f32>,
-};
-)";
-
-    auto* expect = R"(
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> pos_1 : vec4<f32>;
-
-@builtin(__point_size) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size : f32;
-
-fn vert_main_inner() -> VertOut {
-  return VertOut();
-}
-
-@vertex
-fn vert_main() {
-  let inner_result = vert_main_inner();
-  pos_1 = inner_result.pos;
-  vertex_point_size = 1.0f;
-}
-
-struct VertOut {
-  pos : vec4<f32>,
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv,
-                                               0xFFFFFFFF, true);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnStruct_Msl) {
     auto* src = R"(
 struct VertOut {
@@ -3562,162 +2725,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_AvoidNameClash_Spirv) {
-    auto* src = R"(
-var<private> vertex_point_size : f32;
-var<private> vertex_point_size_1 : f32;
-var<private> vertex_point_size_2 : f32;
-
-struct VertIn1 {
-  @location(0) collide : f32,
-};
-
-struct VertIn2 {
-  @location(1) collide : f32,
-};
-
-struct VertOut {
-  @location(0) vertex_point_size : f32,
-  @builtin(position) vertex_point_size_1 : vec4<f32>,
-};
-
-@vertex
-fn vert_main(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
-  let x = collide.collide + collide_1.collide;
-  return VertOut();
-}
-)";
-
-    auto* expect = R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> collide_2 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> collide_3 : f32;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size_3 : f32;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size_1_1 : vec4<f32>;
-
-@builtin(__point_size) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size_4 : f32;
-
-var<private> vertex_point_size : f32;
-
-var<private> vertex_point_size_1 : f32;
-
-var<private> vertex_point_size_2 : f32;
-
-struct VertIn1 {
-  collide : f32,
-}
-
-struct VertIn2 {
-  collide : f32,
-}
-
-struct VertOut {
-  vertex_point_size : f32,
-  vertex_point_size_1 : vec4<f32>,
-}
-
-fn vert_main_inner(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
-  let x = (collide.collide + collide_1.collide);
-  return VertOut();
-}
-
-@vertex
-fn vert_main() {
-  let inner_result = vert_main_inner(VertIn1(collide_2), VertIn2(collide_3));
-  vertex_point_size_3 = inner_result.vertex_point_size;
-  vertex_point_size_1_1 = inner_result.vertex_point_size_1;
-  vertex_point_size_4 = 1.0f;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv,
-                                               0xFFFFFFFF, true);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_AvoidNameClash_Spirv_OutOfOrder) {
-    auto* src = R"(
-@vertex
-fn vert_main(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
-  let x = collide.collide + collide_1.collide;
-  return VertOut();
-}
-
-struct VertIn1 {
-  @location(0) collide : f32,
-};
-
-struct VertIn2 {
-  @location(1) collide : f32,
-};
-
-var<private> vertex_point_size : f32;
-var<private> vertex_point_size_1 : f32;
-var<private> vertex_point_size_2 : f32;
-
-struct VertOut {
-  @location(0) vertex_point_size : f32,
-  @builtin(position) vertex_point_size_1 : vec4<f32>,
-};
-)";
-
-    auto* expect = R"(
-@location(0) @internal(disable_validation__ignore_address_space) var<__in> collide_2 : f32;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> collide_3 : f32;
-
-@location(0) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size_3 : f32;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size_1_1 : vec4<f32>;
-
-@builtin(__point_size) @internal(disable_validation__ignore_address_space) var<__out> vertex_point_size_4 : f32;
-
-fn vert_main_inner(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
-  let x = (collide.collide + collide_1.collide);
-  return VertOut();
-}
-
-@vertex
-fn vert_main() {
-  let inner_result = vert_main_inner(VertIn1(collide_2), VertIn2(collide_3));
-  vertex_point_size_3 = inner_result.vertex_point_size;
-  vertex_point_size_1_1 = inner_result.vertex_point_size_1;
-  vertex_point_size_4 = 1.0f;
-}
-
-struct VertIn1 {
-  collide : f32,
-}
-
-struct VertIn2 {
-  collide : f32,
-}
-
-var<private> vertex_point_size : f32;
-
-var<private> vertex_point_size_1 : f32;
-
-var<private> vertex_point_size_2 : f32;
-
-struct VertOut {
-  vertex_point_size : f32,
-  vertex_point_size_1 : vec4<f32>,
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv,
-                                               0xFFFFFFFF, true);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_AvoidNameClash_Msl) {
     auto* src = R"(
 struct VertIn1 {
@@ -4022,179 +3029,6 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, SpirvSampleMaskBuiltins) {
-    auto* src = R"(
-@fragment
-fn main(@builtin(sample_index) sample_index : u32,
-        @builtin(sample_mask) mask_in : u32
-        ) -> @builtin(sample_mask) u32 {
-  return mask_in;
-}
-)";
-
-    auto* expect = R"(
-@builtin(sample_index) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> sample_index_1 : u32;
-
-@builtin(sample_mask) @interpolate(flat) @internal(disable_validation__ignore_address_space) var<__in> mask_in_1 : array<u32, 1u>;
-
-@builtin(sample_mask) @internal(disable_validation__ignore_address_space) var<__out> value : array<u32, 1u>;
-
-fn main_inner(sample_index : u32, mask_in : u32) -> u32 {
-  return mask_in;
-}
-
-@fragment
-fn main() {
-  let inner_result = main_inner(sample_index_1, mask_in_1[0i]);
-  value[0i] = inner_result;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, GLSLSampleMaskBuiltins) {
-    auto* src = R"(
-@fragment
-fn fragment_main(@builtin(sample_index) sample_index : u32,
-                 @builtin(sample_mask) mask_in : u32
-                 ) -> @builtin(sample_mask) u32 {
-  return mask_in;
-}
-)";
-
-    auto* expect = R"(
-@builtin(sample_index) @internal(disable_validation__ignore_address_space) var<__in> gl_SampleID : i32;
-
-@builtin(sample_mask) @internal(disable_validation__ignore_address_space) var<__in> gl_SampleMaskIn : array<i32, 1u>;
-
-@builtin(sample_mask) @internal(disable_validation__ignore_address_space) var<__out> gl_SampleMask : array<i32, 1u>;
-
-fn fragment_main(sample_index : u32, mask_in : u32) -> u32 {
-  return mask_in;
-}
-
-@fragment
-fn main() {
-  let inner_result = fragment_main(bitcast<u32>(gl_SampleID), bitcast<u32>(gl_SampleMaskIn[0i]));
-  gl_SampleMask[0i] = bitcast<i32>(inner_result);
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kGlsl);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, GLSLVertexInstanceIndexBuiltins) {
-    auto* src = R"(
-@vertex
-fn vertex_main(@builtin(vertex_index) vertexID : u32,
-               @builtin(instance_index) instanceID : u32
-               ) -> @builtin(position) vec4<f32> {
-  return vec4<f32>(f32(vertexID) + f32(instanceID));
-}
-)";
-
-    auto* expect = R"(
-@builtin(vertex_index) @internal(disable_validation__ignore_address_space) var<__in> gl_VertexID : i32;
-
-@builtin(instance_index) @internal(disable_validation__ignore_address_space) var<__in> gl_InstanceID : i32;
-
-@builtin(position) @internal(disable_validation__ignore_address_space) var<__out> gl_Position : vec4<f32>;
-
-fn vertex_main(vertexID : u32, instanceID : u32) -> vec4<f32> {
-  return vec4<f32>((f32(vertexID) + f32(instanceID)));
-}
-
-@vertex
-fn main() {
-  let inner_result = vertex_main(bitcast<u32>(gl_VertexID), bitcast<u32>(gl_InstanceID));
-  gl_Position = inner_result;
-  gl_Position.y = -(gl_Position.y);
-  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kGlsl);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Index_Attribute_Spirv) {
-    auto* src = R"(
-enable dual_source_blending;
-
-struct FragOutput {
-  @location(0) @blend_src(0) color : vec4<f32>,
-  @location(0) @blend_src(1) blend : vec4<f32>,
-  @builtin(frag_depth) depth : f32,
-  @builtin(sample_mask) mask : u32,
-};
-
-@fragment
-fn frag_main() -> FragOutput {
-  var output : FragOutput;
-  output.depth = 1.0;
-  output.mask = 7u;
-  output.color = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  output.blend = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  return output;
-}
-)";
-
-    auto* expect = R"(
-enable dual_source_blending;
-
-@location(0) @blend_src(0) @internal(disable_validation__ignore_address_space) var<__out> color_1 : vec4<f32>;
-
-@location(0) @blend_src(1) @internal(disable_validation__ignore_address_space) var<__out> blend_1 : vec4<f32>;
-
-@builtin(frag_depth) @internal(disable_validation__ignore_address_space) var<__out> depth_1 : f32;
-
-@builtin(sample_mask) @internal(disable_validation__ignore_address_space) var<__out> mask_1 : array<u32, 1u>;
-
-struct FragOutput {
-  color : vec4<f32>,
-  blend : vec4<f32>,
-  depth : f32,
-  mask : u32,
-}
-
-fn frag_main_inner() -> FragOutput {
-  var output : FragOutput;
-  output.depth = 1.0;
-  output.mask = 7u;
-  output.color = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  output.blend = vec4<f32>(0.5, 0.5, 0.5, 1.0);
-  return output;
-}
-
-@fragment
-fn frag_main() {
-  let inner_result = frag_main_inner();
-  color_1 = inner_result.color;
-  blend_1 = inner_result.blend;
-  depth_1 = inner_result.depth;
-  mask_1[0i] = inner_result.mask;
-}
-)";
-
-    DataMap data;
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Index_Attribute_Msl) {
     auto* src = R"(
 enable dual_source_blending;
@@ -4420,60 +3254,5 @@
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(CanonicalizeEntryPointIOTest, F16_Polyfill_Spirv) {
-    auto* src = R"(
-enable f16;
-
-struct Outputs {
-  @location(1) a : f16,
-  @location(2) b : vec4<f16>,
-}
-
-@fragment
-fn frag_main(@location(1) loc1 : f16,
-             @location(2) loc2 : vec4<f16>) -> Outputs {
-  return Outputs(loc1 * 2, loc2 * 3);
-}
-)";
-
-    auto* expect = R"(
-enable f16;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__in> loc1_1 : f32;
-
-@location(2) @internal(disable_validation__ignore_address_space) var<__in> loc2_1 : vec4<f32>;
-
-@location(1) @internal(disable_validation__ignore_address_space) var<__out> a_1 : f32;
-
-@location(2) @internal(disable_validation__ignore_address_space) var<__out> b_1 : vec4<f32>;
-
-struct Outputs {
-  a : f16,
-  b : vec4<f16>,
-}
-
-fn frag_main_inner(loc1 : f16, loc2 : vec4<f16>) -> Outputs {
-  return Outputs((loc1 * 2), (loc2 * 3));
-}
-
-@fragment
-fn frag_main() {
-  let inner_result = frag_main_inner(f16(loc1_1), vec4<f16>(loc2_1));
-  a_1 = f32(inner_result.a);
-  b_1 = vec4<f32>(inner_result.b);
-}
-)";
-
-    DataMap data;
-
-    data.Add<CanonicalizeEntryPointIO::Config>(CanonicalizeEntryPointIO::ShaderStyle::kSpirv,
-                                               /* fixed_sample_mask */ 0xFFFFFFFF,
-                                               /* emit_vertex_point_size */ false,
-                                               /* polyfill_f16_io */ true);
-    auto got = Run<Unshadow, CanonicalizeEntryPointIO>(src, data);
-
-    EXPECT_EQ(expect, str(got));
-}
-
 }  // namespace
 }  // namespace tint::ast::transform
diff --git a/src/tint/lang/wgsl/reader/parser/variable_attribute_test.cc b/src/tint/lang/wgsl/reader/parser/variable_attribute_test.cc
index 5e31e3e..7096342 100644
--- a/src/tint/lang/wgsl/reader/parser/variable_attribute_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/variable_attribute_test.cc
@@ -307,7 +307,7 @@
     EXPECT_EQ(attr.value, nullptr);
     EXPECT_TRUE(p->has_error());
     EXPECT_EQ(p->error(), R"(1:9: expected builtin value name
-Possible values: '__point_size', 'clip_distances', 'frag_depth', 'front_facing', 'global_invocation_id', 'instance_index', 'local_invocation_id', 'local_invocation_index', 'num_workgroups', 'position', 'sample_index', 'sample_mask', 'subgroup_invocation_id', 'subgroup_size', 'vertex_index', 'workgroup_id')");
+Possible values: 'clip_distances', 'frag_depth', 'front_facing', 'global_invocation_id', 'instance_index', 'local_invocation_id', 'local_invocation_index', 'num_workgroups', 'position', 'sample_index', 'sample_mask', 'subgroup_invocation_id', 'subgroup_size', 'vertex_index', 'workgroup_id')");
 }
 
 TEST_F(WGSLParserTest, Attribute_Builtin_MisspelledValue) {
@@ -319,7 +319,7 @@
     EXPECT_TRUE(p->has_error());
     EXPECT_EQ(p->error(), R"(1:9: expected builtin value name
 Did you mean 'position'?
-Possible values: '__point_size', 'clip_distances', 'frag_depth', 'front_facing', 'global_invocation_id', 'instance_index', 'local_invocation_id', 'local_invocation_index', 'num_workgroups', 'position', 'sample_index', 'sample_mask', 'subgroup_invocation_id', 'subgroup_size', 'vertex_index', 'workgroup_id')");
+Possible values: 'clip_distances', 'frag_depth', 'front_facing', 'global_invocation_id', 'instance_index', 'local_invocation_id', 'local_invocation_index', 'num_workgroups', 'position', 'sample_index', 'sample_mask', 'subgroup_invocation_id', 'subgroup_size', 'vertex_index', 'workgroup_id')");
 }
 
 TEST_F(WGSLParserTest, Attribute_Interpolate_Flat) {
diff --git a/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc b/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc
index 4cd34c3..4079ad5 100644
--- a/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc
+++ b/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc
@@ -147,19 +147,6 @@
     EXPECT_EQ(r()->error(), "12:34 error: '@blend_src(0)' is missing when '@blend_src' is used");
 }
 
-// Using a @blend_src attribute on a global variable should pass. This is needed internally when
-// using @blend_src with the canonicalize_entry_point transform. This test uses an internal
-// attribute to ignore address space, which is how it is used with the canonicalize_entry_point
-// transform.
-TEST_F(DualSourceBlendingExtensionTests, GlobalVariableBlendSrcAttributeAfterInternalTransform) {
-    GlobalVar(
-        "var", ty.vec4<f32>(),
-        Vector{Location(0_a), BlendSrc(0_a), Disable(ast::DisabledValidation::kIgnoreAddressSpace)},
-        core::AddressSpace::kOut);
-
-    EXPECT_TRUE(r()->Resolve()) << r()->error();
-}
-
 // Using the a @blend_src attribute with a non-zero location should fail.
 TEST_F(DualSourceBlendingExtensionTests, BlendSrcWithNonZeroLocation_Struct) {
     Structure("Output", Vector{
diff --git a/src/tint/lang/wgsl/resolver/function_validation_test.cc b/src/tint/lang/wgsl/resolver/function_validation_test.cc
index 1a3c347..bb15f2b 100644
--- a/src/tint/lang/wgsl/resolver/function_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/function_validation_test.cc
@@ -1140,8 +1140,8 @@
     ResolverTest,
     ResolverFunctionParameterValidationTest,
     testing::Values(TestParams{core::AddressSpace::kUndefined, Expectation::kInvalid},
-                    TestParams{core::AddressSpace::kIn, Expectation::kAlwaysFail},
-                    TestParams{core::AddressSpace::kOut, Expectation::kAlwaysFail},
+                    TestParams{core::AddressSpace::kIn, Expectation::kInvalid},
+                    TestParams{core::AddressSpace::kOut, Expectation::kInvalid},
                     TestParams{core::AddressSpace::kUniform,
                                Expectation::kPassWithUnrestrictedPointerParameters},
                     TestParams{core::AddressSpace::kWorkgroup,
diff --git a/src/tint/lang/wgsl/resolver/resolver_test.cc b/src/tint/lang/wgsl/resolver/resolver_test.cc
index bbf3a58..780d6fa 100644
--- a/src/tint/lang/wgsl/resolver/resolver_test.cc
+++ b/src/tint/lang/wgsl/resolver/resolver_test.cc
@@ -900,18 +900,6 @@
     EXPECT_EQ(1u, func_sem->Parameters()[2]->Attributes().location);
 }
 
-TEST_F(ResolverTest, Function_GlobalVariable_Location) {
-    auto* var =
-        GlobalVar("my_vec", ty.vec4<f32>(), core::AddressSpace::kIn,
-                  Vector{Location(3_a), Disable(ast::DisabledValidation::kIgnoreAddressSpace)});
-
-    EXPECT_TRUE(r()->Resolve()) << r()->error();
-
-    auto* sem = Sem().Get<sem::GlobalVariable>(var);
-    ASSERT_NE(sem, nullptr);
-    EXPECT_EQ(3u, sem->Attributes().location);
-}
-
 TEST_F(ResolverTest, Function_RegisterInputOutputVariables) {
     auto* s = Structure("S", Vector{Member("m", ty.u32())});
 
