Rename semantic to sem

* Rename namespace semantic to sem
* Rename directory src/semantic/ to src/sem/

Bug: tint:724
Change-Id: I76383b821fbca7f1037a803c497b595a706dcb06
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/48120
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/docs/arch.md b/docs/arch.md
index de7fca7..d4af10b 100644
--- a/docs/arch.md
+++ b/docs/arch.md
@@ -115,7 +115,7 @@
 
 ## Semantic information
 
-Semantic information is held by `semantic::Node`s which describe the program at
+Semantic information is held by `sem::Node`s which describe the program at
 a higher / more abstract level than the AST. This includes information such as
 the resolved type of each expression, the resolved overload of an intrinsic
 function call, and the module scoped variables used by each function.
@@ -123,11 +123,11 @@
 Semantic information is generated by the `Resolver` when the `Program`
 is built from a `ProgramBuilder`.
 
-The `semantic::Info` class holds a map of `ast::Node`s to `semantic::Node`s.
+The `sem::Info` class holds a map of `ast::Node`s to `sem::Node`s.
 This map is **many-to-one** - i.e. while a AST node might have a single
 corresponding semantic node, the reverse may not be true. For example:
-many `ast::IdentifierExpression` nodes may map to a single `semantic::Variable`,
-and so the `semantic::Variable` does not have a single corresponding
+many `ast::IdentifierExpression` nodes may map to a single `sem::Variable`,
+and so the `sem::Variable` does not have a single corresponding
 `ast::Node`.
 
 Unlike `ast::Node`s, semantic nodes may not necessarily form a directed acyclic
diff --git a/src/BUILD.gn b/src/BUILD.gn
index 53f32c5..863faa4 100644
--- a/src/BUILD.gn
+++ b/src/BUILD.gn
@@ -362,37 +362,37 @@
     "inspector/scalar.h",
     "intrinsic_table.cc",
     "intrinsic_table.h",
-    "program_id.cc",
-    "program_id.h",
     "program.cc",
     "program.h",
     "program_builder.cc",
     "program_builder.h",
+    "program_id.cc",
+    "program_id.h",
     "reader/reader.cc",
     "reader/reader.h",
     "resolver/resolver.cc",
     "resolver/resolver.h",
     "scope_stack.h",
-    "semantic/array.h",
-    "semantic/call.h",
-    "semantic/call_target.h",
-    "semantic/expression.h",
-    "semantic/info.h",
-    "semantic/intrinsic.h",
-    "semantic/node.h",
-    "semantic/sem_array.cc",
-    "semantic/sem_call.cc",
-    "semantic/sem_call_target.cc",
-    "semantic/sem_expression.cc",
-    "semantic/sem_function.cc",
-    "semantic/sem_info.cc",
-    "semantic/sem_intrinsic.cc",
-    "semantic/sem_member_accessor_expression.cc",
-    "semantic/sem_node.cc",
-    "semantic/sem_statement.cc",
-    "semantic/sem_struct.cc",
-    "semantic/sem_variable.cc",
-    "semantic/type_mappings.h",
+    "sem/array.h",
+    "sem/call.h",
+    "sem/call_target.h",
+    "sem/expression.h",
+    "sem/info.h",
+    "sem/intrinsic.h",
+    "sem/node.h",
+    "sem/sem_array.cc",
+    "sem/sem_call.cc",
+    "sem/sem_call_target.cc",
+    "sem/sem_expression.cc",
+    "sem/sem_function.cc",
+    "sem/sem_info.cc",
+    "sem/sem_intrinsic.cc",
+    "sem/sem_member_accessor_expression.cc",
+    "sem/sem_node.cc",
+    "sem/sem_statement.cc",
+    "sem/sem_struct.cc",
+    "sem/sem_variable.cc",
+    "sem/type_mappings.h",
     "source.cc",
     "source.h",
     "symbol.cc",
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index bc028a1..b6767a8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -188,26 +188,26 @@
   resolver/resolver.cc
   resolver/resolver.h
   scope_stack.h
-  semantic/array.h
-  semantic/call.h
-  semantic/call_target.h
-  semantic/expression.h
-  semantic/info.h
-  semantic/intrinsic.h
-  semantic/node.h
-  semantic/sem_array.cc
-  semantic/sem_call.cc
-  semantic/sem_call_target.cc
-  semantic/sem_expression.cc
-  semantic/sem_member_accessor_expression.cc
-  semantic/sem_function.cc
-  semantic/sem_info.cc
-  semantic/sem_intrinsic.cc
-  semantic/sem_node.cc
-  semantic/sem_statement.cc
-  semantic/sem_struct.cc
-  semantic/sem_variable.cc
-  semantic/type_mappings.h
+  sem/array.h
+  sem/call.h
+  sem/call_target.h
+  sem/expression.h
+  sem/info.h
+  sem/intrinsic.h
+  sem/node.h
+  sem/sem_array.cc
+  sem/sem_call.cc
+  sem/sem_call_target.cc
+  sem/sem_expression.cc
+  sem/sem_member_accessor_expression.cc
+  sem/sem_function.cc
+  sem/sem_info.cc
+  sem/sem_intrinsic.cc
+  sem/sem_node.cc
+  sem/sem_statement.cc
+  sem/sem_struct.cc
+  sem/sem_variable.cc
+  sem/type_mappings.h
   source.cc
   source.h
   symbol.cc
@@ -496,7 +496,7 @@
     resolver/type_validation_test.cc
     resolver/validation_test.cc
     scope_stack_test.cc
-    semantic/sem_intrinsic_test.cc
+    sem/sem_intrinsic_test.cc
     symbol_table_test.cc
     symbol_test.cc
     traits_test.cc
diff --git a/src/ast/access_decoration.cc b/src/ast/access_decoration.cc
index 726a93e..ad5be5b 100644
--- a/src/ast/access_decoration.cc
+++ b/src/ast/access_decoration.cc
@@ -28,7 +28,7 @@
 
 AccessDecoration::~AccessDecoration() = default;
 
-void AccessDecoration::to_str(const semantic::Info&,
+void AccessDecoration::to_str(const sem::Info&,
                               std::ostream& out,
                               size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/access_decoration.h b/src/ast/access_decoration.h
index ce7183c..0ad41bf 100644
--- a/src/ast/access_decoration.h
+++ b/src/ast/access_decoration.h
@@ -40,7 +40,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/array_accessor_expression.cc b/src/ast/array_accessor_expression.cc
index c8d64d8..bb358b6 100644
--- a/src/ast/array_accessor_expression.cc
+++ b/src/ast/array_accessor_expression.cc
@@ -46,7 +46,7 @@
   return ctx->dst->create<ArrayAccessorExpression>(src, arr, idx);
 }
 
-void ArrayAccessorExpression::to_str(const semantic::Info& sem,
+void ArrayAccessorExpression::to_str(const sem::Info& sem,
                                      std::ostream& out,
                                      size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/array_accessor_expression.h b/src/ast/array_accessor_expression.h
index 5e83b76..2656a0f 100644
--- a/src/ast/array_accessor_expression.h
+++ b/src/ast/array_accessor_expression.h
@@ -53,7 +53,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/assignment_statement.cc b/src/ast/assignment_statement.cc
index a83b3a3..9f672a2 100644
--- a/src/ast/assignment_statement.cc
+++ b/src/ast/assignment_statement.cc
@@ -44,7 +44,7 @@
   return ctx->dst->create<AssignmentStatement>(src, l, r);
 }
 
-void AssignmentStatement::to_str(const semantic::Info& sem,
+void AssignmentStatement::to_str(const sem::Info& sem,
                                  std::ostream& out,
                                  size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/assignment_statement.h b/src/ast/assignment_statement.h
index dc2ab47..f73ca0c 100644
--- a/src/ast/assignment_statement.h
+++ b/src/ast/assignment_statement.h
@@ -52,7 +52,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/binary_expression.cc b/src/ast/binary_expression.cc
index 967fc62..8a6a1c2 100644
--- a/src/ast/binary_expression.cc
+++ b/src/ast/binary_expression.cc
@@ -46,7 +46,7 @@
   return ctx->dst->create<BinaryExpression>(src, op_, l, r);
 }
 
-void BinaryExpression::to_str(const semantic::Info& sem,
+void BinaryExpression::to_str(const sem::Info& sem,
                               std::ostream& out,
                               size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/binary_expression.h b/src/ast/binary_expression.h
index f7a2ddf..1fa9f61 100644
--- a/src/ast/binary_expression.h
+++ b/src/ast/binary_expression.h
@@ -124,7 +124,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/binding_decoration.cc b/src/ast/binding_decoration.cc
index 4003189..4812635 100644
--- a/src/ast/binding_decoration.cc
+++ b/src/ast/binding_decoration.cc
@@ -28,7 +28,7 @@
 
 BindingDecoration::~BindingDecoration() = default;
 
-void BindingDecoration::to_str(const semantic::Info&,
+void BindingDecoration::to_str(const sem::Info&,
                                std::ostream& out,
                                size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/binding_decoration.h b/src/ast/binding_decoration.h
index 197cc2a..627e3e7 100644
--- a/src/ast/binding_decoration.h
+++ b/src/ast/binding_decoration.h
@@ -37,7 +37,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/bitcast_expression.cc b/src/ast/bitcast_expression.cc
index 3cfde4d..6b78366 100644
--- a/src/ast/bitcast_expression.cc
+++ b/src/ast/bitcast_expression.cc
@@ -42,7 +42,7 @@
   return ctx->dst->create<BitcastExpression>(src, ty, e);
 }
 
-void BitcastExpression::to_str(const semantic::Info& sem,
+void BitcastExpression::to_str(const sem::Info& sem,
                                std::ostream& out,
                                size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/bitcast_expression.h b/src/ast/bitcast_expression.h
index 87c1018..9c87ba5 100644
--- a/src/ast/bitcast_expression.h
+++ b/src/ast/bitcast_expression.h
@@ -51,7 +51,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/block_statement.cc b/src/ast/block_statement.cc
index cae5e03..9a4cbf0 100644
--- a/src/ast/block_statement.cc
+++ b/src/ast/block_statement.cc
@@ -42,7 +42,7 @@
   return ctx->dst->create<BlockStatement>(src, stmts);
 }
 
-void BlockStatement::to_str(const semantic::Info& sem,
+void BlockStatement::to_str(const sem::Info& sem,
                             std::ostream& out,
                             size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/block_statement.h b/src/ast/block_statement.h
index 7bf35af..6bff1c5 100644
--- a/src/ast/block_statement.h
+++ b/src/ast/block_statement.h
@@ -81,7 +81,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/bool_literal.cc b/src/ast/bool_literal.cc
index 4944bec..5e4cf86 100644
--- a/src/ast/bool_literal.cc
+++ b/src/ast/bool_literal.cc
@@ -29,7 +29,7 @@
 
 BoolLiteral::~BoolLiteral() = default;
 
-std::string BoolLiteral::to_str(const semantic::Info&) const {
+std::string BoolLiteral::to_str(const sem::Info&) const {
   return value_ ? "true" : "false";
 }
 
diff --git a/src/ast/bool_literal.h b/src/ast/bool_literal.h
index 37d88ce..b95adc0 100644
--- a/src/ast/bool_literal.h
+++ b/src/ast/bool_literal.h
@@ -46,7 +46,7 @@
 
   /// @param sem the semantic info for the program
   /// @returns the literal as a string
-  std::string to_str(const semantic::Info& sem) const override;
+  std::string to_str(const sem::Info& sem) const override;
 
   /// Clones this node and all transitive child nodes using the `CloneContext`
   /// `ctx`.
diff --git a/src/ast/break_statement.cc b/src/ast/break_statement.cc
index 08f96a1..cb38990 100644
--- a/src/ast/break_statement.cc
+++ b/src/ast/break_statement.cc
@@ -34,7 +34,7 @@
   return ctx->dst->create<BreakStatement>(src);
 }
 
-void BreakStatement::to_str(const semantic::Info&,
+void BreakStatement::to_str(const sem::Info&,
                             std::ostream& out,
                             size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/break_statement.h b/src/ast/break_statement.h
index ce61b52..1373ece 100644
--- a/src/ast/break_statement.h
+++ b/src/ast/break_statement.h
@@ -41,7 +41,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/builtin_decoration.cc b/src/ast/builtin_decoration.cc
index 92abc97..d4b0f83 100644
--- a/src/ast/builtin_decoration.cc
+++ b/src/ast/builtin_decoration.cc
@@ -28,7 +28,7 @@
 
 BuiltinDecoration::~BuiltinDecoration() = default;
 
-void BuiltinDecoration::to_str(const semantic::Info&,
+void BuiltinDecoration::to_str(const sem::Info&,
                                std::ostream& out,
                                size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/builtin_decoration.h b/src/ast/builtin_decoration.h
index 60f1d09..1ce952d 100644
--- a/src/ast/builtin_decoration.h
+++ b/src/ast/builtin_decoration.h
@@ -40,7 +40,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/call_expression.cc b/src/ast/call_expression.cc
index 47cb1f5..0ac44bf 100644
--- a/src/ast/call_expression.cc
+++ b/src/ast/call_expression.cc
@@ -46,7 +46,7 @@
   return ctx->dst->create<CallExpression>(src, fn, p);
 }
 
-void CallExpression::to_str(const semantic::Info& sem,
+void CallExpression::to_str(const sem::Info& sem,
                             std::ostream& out,
                             size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/call_expression.h b/src/ast/call_expression.h
index 3097074..c366d91 100644
--- a/src/ast/call_expression.h
+++ b/src/ast/call_expression.h
@@ -51,7 +51,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/call_statement.cc b/src/ast/call_statement.cc
index a6a838d..c771a81 100644
--- a/src/ast/call_statement.cc
+++ b/src/ast/call_statement.cc
@@ -40,7 +40,7 @@
   return ctx->dst->create<CallStatement>(src, call);
 }
 
-void CallStatement::to_str(const semantic::Info& sem,
+void CallStatement::to_str(const sem::Info& sem,
                            std::ostream& out,
                            size_t indent) const {
   call_->to_str(sem, out, indent);
diff --git a/src/ast/call_statement.h b/src/ast/call_statement.h
index 64a248f..ca52454 100644
--- a/src/ast/call_statement.h
+++ b/src/ast/call_statement.h
@@ -48,7 +48,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/case_statement.cc b/src/ast/case_statement.cc
index 23e1564..90c8309 100644
--- a/src/ast/case_statement.cc
+++ b/src/ast/case_statement.cc
@@ -46,7 +46,7 @@
   return ctx->dst->create<CaseStatement>(src, sel, b);
 }
 
-void CaseStatement::to_str(const semantic::Info& sem,
+void CaseStatement::to_str(const sem::Info& sem,
                            std::ostream& out,
                            size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/case_statement.h b/src/ast/case_statement.h
index de589ad..68301a7 100644
--- a/src/ast/case_statement.h
+++ b/src/ast/case_statement.h
@@ -62,7 +62,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/constant_id_decoration.cc b/src/ast/constant_id_decoration.cc
index 7754fef..64f145e 100644
--- a/src/ast/constant_id_decoration.cc
+++ b/src/ast/constant_id_decoration.cc
@@ -28,7 +28,7 @@
 
 ConstantIdDecoration::~ConstantIdDecoration() = default;
 
-void ConstantIdDecoration::to_str(const semantic::Info&,
+void ConstantIdDecoration::to_str(const sem::Info&,
                                   std::ostream& out,
                                   size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/constant_id_decoration.h b/src/ast/constant_id_decoration.h
index 6529778..9261e01 100644
--- a/src/ast/constant_id_decoration.h
+++ b/src/ast/constant_id_decoration.h
@@ -39,7 +39,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/continue_statement.cc b/src/ast/continue_statement.cc
index 5b97a3f..d52a926 100644
--- a/src/ast/continue_statement.cc
+++ b/src/ast/continue_statement.cc
@@ -34,7 +34,7 @@
   return ctx->dst->create<ContinueStatement>(src);
 }
 
-void ContinueStatement::to_str(const semantic::Info&,
+void ContinueStatement::to_str(const sem::Info&,
                                std::ostream& out,
                                size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/continue_statement.h b/src/ast/continue_statement.h
index 4c8d887..7ab3797 100644
--- a/src/ast/continue_statement.h
+++ b/src/ast/continue_statement.h
@@ -41,7 +41,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/discard_statement.cc b/src/ast/discard_statement.cc
index 9a8b2fe..aa3ff08 100644
--- a/src/ast/discard_statement.cc
+++ b/src/ast/discard_statement.cc
@@ -34,7 +34,7 @@
   return ctx->dst->create<DiscardStatement>(src);
 }
 
-void DiscardStatement::to_str(const semantic::Info&,
+void DiscardStatement::to_str(const sem::Info&,
                               std::ostream& out,
                               size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/discard_statement.h b/src/ast/discard_statement.h
index 23e0ce9..04e99d9 100644
--- a/src/ast/discard_statement.h
+++ b/src/ast/discard_statement.h
@@ -41,7 +41,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/else_statement.cc b/src/ast/else_statement.cc
index 7df7e74..7e43364 100644
--- a/src/ast/else_statement.cc
+++ b/src/ast/else_statement.cc
@@ -43,7 +43,7 @@
   return ctx->dst->create<ElseStatement>(src, cond, b);
 }
 
-void ElseStatement::to_str(const semantic::Info& sem,
+void ElseStatement::to_str(const sem::Info& sem,
                            std::ostream& out,
                            size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/else_statement.h b/src/ast/else_statement.h
index f49ba99..aa49f9a 100644
--- a/src/ast/else_statement.h
+++ b/src/ast/else_statement.h
@@ -59,7 +59,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/expression.cc b/src/ast/expression.cc
index 875f9d7..710e79d 100644
--- a/src/ast/expression.cc
+++ b/src/ast/expression.cc
@@ -14,8 +14,8 @@
 
 #include "src/ast/expression.h"
 
-#include "src/semantic/expression.h"
-#include "src/semantic/info.h"
+#include "src/sem/expression.h"
+#include "src/sem/info.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::Expression);
 
@@ -29,7 +29,7 @@
 
 Expression::~Expression() = default;
 
-std::string Expression::result_type_str(const semantic::Info& sem) const {
+std::string Expression::result_type_str(const sem::Info& sem) const {
   auto* sem_expr = sem.Get(this);
   return sem_expr ? sem_expr->Type()->type_name() : "not set";
 }
diff --git a/src/ast/expression.h b/src/ast/expression.h
index 214f194..bfa766f 100644
--- a/src/ast/expression.h
+++ b/src/ast/expression.h
@@ -40,7 +40,7 @@
   /// @param sem the semantic info for the program
   /// @returns a string representation of the result type or 'not set' if no
   /// result type present
-  std::string result_type_str(const semantic::Info& sem) const;
+  std::string result_type_str(const sem::Info& sem) const;
 
  private:
   Expression(const Expression&) = delete;
diff --git a/src/ast/fallthrough_statement.cc b/src/ast/fallthrough_statement.cc
index a3eef90..855e7f7 100644
--- a/src/ast/fallthrough_statement.cc
+++ b/src/ast/fallthrough_statement.cc
@@ -35,7 +35,7 @@
   return ctx->dst->create<FallthroughStatement>(src);
 }
 
-void FallthroughStatement::to_str(const semantic::Info&,
+void FallthroughStatement::to_str(const sem::Info&,
                                   std::ostream& out,
                                   size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/fallthrough_statement.h b/src/ast/fallthrough_statement.h
index ee4df99..9cfee21 100644
--- a/src/ast/fallthrough_statement.h
+++ b/src/ast/fallthrough_statement.h
@@ -41,7 +41,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/float_literal.cc b/src/ast/float_literal.cc
index 3b24f49..1c301b7 100644
--- a/src/ast/float_literal.cc
+++ b/src/ast/float_literal.cc
@@ -31,7 +31,7 @@
 
 FloatLiteral::~FloatLiteral() = default;
 
-std::string FloatLiteral::to_str(const semantic::Info&) const {
+std::string FloatLiteral::to_str(const sem::Info&) const {
   return std::to_string(value_);
 }
 
diff --git a/src/ast/float_literal.h b/src/ast/float_literal.h
index 46182bb..82e37ba 100644
--- a/src/ast/float_literal.h
+++ b/src/ast/float_literal.h
@@ -44,7 +44,7 @@
 
   /// @param sem the semantic info for the program
   /// @returns the literal as a string
-  std::string to_str(const semantic::Info& sem) const override;
+  std::string to_str(const sem::Info& sem) const override;
 
   /// Clones this node and all transitive child nodes using the `CloneContext`
   /// `ctx`.
diff --git a/src/ast/function.cc b/src/ast/function.cc
index 989d5e1..df83626 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -88,7 +88,7 @@
   return ctx->dst->create<Function>(src, sym, p, ret, b, decos, ret_decos);
 }
 
-void Function::to_str(const semantic::Info& sem,
+void Function::to_str(const sem::Info& sem,
                       std::ostream& out,
                       size_t indent) const {
   make_indent(out, indent);
@@ -130,7 +130,7 @@
 
   out << "__func" + return_type_->type_name();
   for (auto* param : params_) {
-    // No need for the semantic::Variable here, functions params must have a
+    // No need for the sem::Variable here, functions params must have a
     // type
     out << param->declared_type()->type_name();
   }
diff --git a/src/ast/function.h b/src/ast/function.h
index 0717a28..62f3bd7 100644
--- a/src/ast/function.h
+++ b/src/ast/function.h
@@ -102,7 +102,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/group_decoration.cc b/src/ast/group_decoration.cc
index 58c59f0..4e731c5 100644
--- a/src/ast/group_decoration.cc
+++ b/src/ast/group_decoration.cc
@@ -28,7 +28,7 @@
 
 GroupDecoration::~GroupDecoration() = default;
 
-void GroupDecoration::to_str(const semantic::Info&,
+void GroupDecoration::to_str(const sem::Info&,
                              std::ostream& out,
                              size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/group_decoration.h b/src/ast/group_decoration.h
index 3a2d718..0e830d0 100644
--- a/src/ast/group_decoration.h
+++ b/src/ast/group_decoration.h
@@ -37,7 +37,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/identifier_expression.cc b/src/ast/identifier_expression.cc
index b737fd3..fc32c43 100644
--- a/src/ast/identifier_expression.cc
+++ b/src/ast/identifier_expression.cc
@@ -40,7 +40,7 @@
   return ctx->dst->create<IdentifierExpression>(src, sym);
 }
 
-void IdentifierExpression::to_str(const semantic::Info& sem,
+void IdentifierExpression::to_str(const sem::Info& sem,
                                   std::ostream& out,
                                   size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/identifier_expression.h b/src/ast/identifier_expression.h
index 888410d..da32342 100644
--- a/src/ast/identifier_expression.h
+++ b/src/ast/identifier_expression.h
@@ -16,7 +16,7 @@
 #define SRC_AST_IDENTIFIER_EXPRESSION_H_
 
 #include "src/ast/expression.h"
-#include "src/semantic/intrinsic.h"
+#include "src/sem/intrinsic.h"
 
 namespace tint {
 namespace ast {
@@ -46,7 +46,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/if_statement.cc b/src/ast/if_statement.cc
index d7c00c5..8ddfe73 100644
--- a/src/ast/if_statement.cc
+++ b/src/ast/if_statement.cc
@@ -53,7 +53,7 @@
   return ctx->dst->create<IfStatement>(src, cond, b, el);
 }
 
-void IfStatement::to_str(const semantic::Info& sem,
+void IfStatement::to_str(const sem::Info& sem,
                          std::ostream& out,
                          size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/if_statement.h b/src/ast/if_statement.h
index 5d79057..6414f23 100644
--- a/src/ast/if_statement.h
+++ b/src/ast/if_statement.h
@@ -63,7 +63,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/internal_decoration.cc b/src/ast/internal_decoration.cc
index 0913dea..d915284 100644
--- a/src/ast/internal_decoration.cc
+++ b/src/ast/internal_decoration.cc
@@ -24,7 +24,7 @@
 
 InternalDecoration::~InternalDecoration() = default;
 
-void InternalDecoration::to_str(const semantic::Info&,
+void InternalDecoration::to_str(const sem::Info&,
                                 std::ostream& out,
                                 size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/internal_decoration.h b/src/ast/internal_decoration.h
index fe3b361..1164f7f 100644
--- a/src/ast/internal_decoration.h
+++ b/src/ast/internal_decoration.h
@@ -43,7 +43,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 };
diff --git a/src/ast/literal.cc b/src/ast/literal.cc
index 6f26682..457ca6b 100644
--- a/src/ast/literal.cc
+++ b/src/ast/literal.cc
@@ -24,7 +24,7 @@
 
 Literal::~Literal() = default;
 
-void Literal::to_str(const semantic::Info& sem,
+void Literal::to_str(const sem::Info& sem,
                      std::ostream& out,
                      size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/literal.h b/src/ast/literal.h
index b26a9f5..39b826c 100644
--- a/src/ast/literal.h
+++ b/src/ast/literal.h
@@ -34,13 +34,13 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
   /// @param sem the semantic info for the program
   /// @returns the literal as a string
-  virtual std::string to_str(const semantic::Info& sem) const = 0;
+  virtual std::string to_str(const sem::Info& sem) const = 0;
 
   /// @returns the name for this literal. This name is unique to this value.
   virtual std::string name() const = 0;
diff --git a/src/ast/location_decoration.cc b/src/ast/location_decoration.cc
index e104791..dcf774f 100644
--- a/src/ast/location_decoration.cc
+++ b/src/ast/location_decoration.cc
@@ -28,7 +28,7 @@
 
 LocationDecoration::~LocationDecoration() = default;
 
-void LocationDecoration::to_str(const semantic::Info&,
+void LocationDecoration::to_str(const sem::Info&,
                                 std::ostream& out,
                                 size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/location_decoration.h b/src/ast/location_decoration.h
index c292e71..51c578d 100644
--- a/src/ast/location_decoration.h
+++ b/src/ast/location_decoration.h
@@ -39,7 +39,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/loop_statement.cc b/src/ast/loop_statement.cc
index 281907d..67d9701 100644
--- a/src/ast/loop_statement.cc
+++ b/src/ast/loop_statement.cc
@@ -43,7 +43,7 @@
   return ctx->dst->create<LoopStatement>(src, b, cont);
 }
 
-void LoopStatement::to_str(const semantic::Info& sem,
+void LoopStatement::to_str(const sem::Info& sem,
                            std::ostream& out,
                            size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/loop_statement.h b/src/ast/loop_statement.h
index fc6da1f..792d886 100644
--- a/src/ast/loop_statement.h
+++ b/src/ast/loop_statement.h
@@ -60,7 +60,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/member_accessor_expression.cc b/src/ast/member_accessor_expression.cc
index 83bb539..1b5e99e 100644
--- a/src/ast/member_accessor_expression.cc
+++ b/src/ast/member_accessor_expression.cc
@@ -46,7 +46,7 @@
   return ctx->dst->create<MemberAccessorExpression>(src, str, mem);
 }
 
-void MemberAccessorExpression::to_str(const semantic::Info& sem,
+void MemberAccessorExpression::to_str(const sem::Info& sem,
                                       std::ostream& out,
                                       size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/member_accessor_expression.h b/src/ast/member_accessor_expression.h
index 24209ac..f3a99ce 100644
--- a/src/ast/member_accessor_expression.h
+++ b/src/ast/member_accessor_expression.h
@@ -52,7 +52,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/module.cc b/src/ast/module.cc
index cacc5ec..50217c0 100644
--- a/src/ast/module.cc
+++ b/src/ast/module.cc
@@ -74,7 +74,7 @@
   }
 }
 
-void Module::to_str(const semantic::Info& sem,
+void Module::to_str(const sem::Info& sem,
                     std::ostream& out,
                     size_t indent) const {
   make_indent(out, indent);
@@ -102,7 +102,7 @@
   out << "}" << std::endl;
 }
 
-std::string Module::to_str(const semantic::Info& sem) const {
+std::string Module::to_str(const sem::Info& sem) const {
   std::ostringstream out;
   to_str(sem, out, 0);
   return out.str();
diff --git a/src/ast/module.h b/src/ast/module.h
index 780988e..b2b7673 100644
--- a/src/ast/module.h
+++ b/src/ast/module.h
@@ -105,13 +105,13 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
   /// @param sem the semantic info for the program
   /// @returns a string representation of the Builder
-  std::string to_str(const semantic::Info& sem) const;
+  std::string to_str(const sem::Info& sem) const;
 
  private:
   std::vector<Cloneable*> global_declarations_;
diff --git a/src/ast/node.cc b/src/ast/node.cc
index dce8c48..1827bd6 100644
--- a/src/ast/node.cc
+++ b/src/ast/node.cc
@@ -31,7 +31,7 @@
     out << " ";
 }
 
-std::string Node::str(const semantic::Info& sem) const {
+std::string Node::str(const sem::Info& sem) const {
   std::ostringstream out;
   to_str(sem, out, 0);
   return out.str();
diff --git a/src/ast/node.h b/src/ast/node.h
index 0d4cf1e..fe74af8 100644
--- a/src/ast/node.h
+++ b/src/ast/node.h
@@ -27,7 +27,7 @@
 namespace type {
 class Type;
 }
-namespace semantic {
+namespace sem {
 class Info;
 }
 
@@ -48,14 +48,14 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  virtual void to_str(const semantic::Info& sem,
+  virtual void to_str(const sem::Info& sem,
                       std::ostream& out,
                       size_t indent) const = 0;
 
   /// Convenience wrapper around the to_str() method.
   /// @param sem the semantic info for the program
   /// @returns the node as a string
-  std::string str(const semantic::Info& sem) const;
+  std::string str(const sem::Info& sem) const;
 
  protected:
   /// Create a new node
diff --git a/src/ast/return_statement.cc b/src/ast/return_statement.cc
index 797141b..e545136 100644
--- a/src/ast/return_statement.cc
+++ b/src/ast/return_statement.cc
@@ -42,7 +42,7 @@
   return ctx->dst->create<ReturnStatement>(src, ret);
 }
 
-void ReturnStatement::to_str(const semantic::Info& sem,
+void ReturnStatement::to_str(const sem::Info& sem,
                              std::ostream& out,
                              size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/return_statement.h b/src/ast/return_statement.h
index fb06dd6..40306dc 100644
--- a/src/ast/return_statement.h
+++ b/src/ast/return_statement.h
@@ -55,7 +55,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/scalar_constructor_expression.cc b/src/ast/scalar_constructor_expression.cc
index 5e74bd0..c8bba78 100644
--- a/src/ast/scalar_constructor_expression.cc
+++ b/src/ast/scalar_constructor_expression.cc
@@ -42,7 +42,7 @@
   return ctx->dst->create<ScalarConstructorExpression>(src, lit);
 }
 
-void ScalarConstructorExpression::to_str(const semantic::Info& sem,
+void ScalarConstructorExpression::to_str(const sem::Info& sem,
                                          std::ostream& out,
                                          size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/scalar_constructor_expression.h b/src/ast/scalar_constructor_expression.h
index 4b19af2..0bdfa0b 100644
--- a/src/ast/scalar_constructor_expression.h
+++ b/src/ast/scalar_constructor_expression.h
@@ -49,7 +49,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/sint_literal.cc b/src/ast/sint_literal.cc
index 8ceec65..8fc435f 100644
--- a/src/ast/sint_literal.cc
+++ b/src/ast/sint_literal.cc
@@ -29,7 +29,7 @@
 
 SintLiteral::~SintLiteral() = default;
 
-std::string SintLiteral::to_str(const semantic::Info&) const {
+std::string SintLiteral::to_str(const sem::Info&) const {
   return std::to_string(value());
 }
 
diff --git a/src/ast/sint_literal.h b/src/ast/sint_literal.h
index d951150..ddc2ac8 100644
--- a/src/ast/sint_literal.h
+++ b/src/ast/sint_literal.h
@@ -44,7 +44,7 @@
 
   /// @param sem the semantic info for the program
   /// @returns the literal as a string
-  std::string to_str(const semantic::Info& sem) const override;
+  std::string to_str(const sem::Info& sem) const override;
 
   /// Clones this node and all transitive child nodes using the `CloneContext`
   /// `ctx`.
diff --git a/src/ast/stage_decoration.cc b/src/ast/stage_decoration.cc
index 129068f..74f3067 100644
--- a/src/ast/stage_decoration.cc
+++ b/src/ast/stage_decoration.cc
@@ -28,7 +28,7 @@
 
 StageDecoration::~StageDecoration() = default;
 
-void StageDecoration::to_str(const semantic::Info&,
+void StageDecoration::to_str(const sem::Info&,
                              std::ostream& out,
                              size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/stage_decoration.h b/src/ast/stage_decoration.h
index b392c5b..f61403d 100644
--- a/src/ast/stage_decoration.h
+++ b/src/ast/stage_decoration.h
@@ -40,7 +40,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/stride_decoration.cc b/src/ast/stride_decoration.cc
index 26ddda9..e343e6b 100644
--- a/src/ast/stride_decoration.cc
+++ b/src/ast/stride_decoration.cc
@@ -28,7 +28,7 @@
 
 StrideDecoration::~StrideDecoration() = default;
 
-void StrideDecoration::to_str(const semantic::Info&,
+void StrideDecoration::to_str(const sem::Info&,
                               std::ostream& out,
                               size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/stride_decoration.h b/src/ast/stride_decoration.h
index be147d1..05ebcab 100644
--- a/src/ast/stride_decoration.h
+++ b/src/ast/stride_decoration.h
@@ -37,7 +37,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/struct.cc b/src/ast/struct.cc
index 77abd2d..a3a396d 100644
--- a/src/ast/struct.cc
+++ b/src/ast/struct.cc
@@ -64,7 +64,7 @@
   return ctx->dst->create<Struct>(src, mem, decos);
 }
 
-void Struct::to_str(const semantic::Info& sem,
+void Struct::to_str(const sem::Info& sem,
                     std::ostream& out,
                     size_t indent) const {
   out << "Struct{" << std::endl;
diff --git a/src/ast/struct.h b/src/ast/struct.h
index a497f63..b6a0314 100644
--- a/src/ast/struct.h
+++ b/src/ast/struct.h
@@ -64,7 +64,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/struct_block_decoration.cc b/src/ast/struct_block_decoration.cc
index dc23bfc..a18f6cf 100644
--- a/src/ast/struct_block_decoration.cc
+++ b/src/ast/struct_block_decoration.cc
@@ -27,7 +27,7 @@
 
 StructBlockDecoration::~StructBlockDecoration() = default;
 
-void StructBlockDecoration::to_str(const semantic::Info&,
+void StructBlockDecoration::to_str(const sem::Info&,
                                    std::ostream& out,
                                    size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/struct_block_decoration.h b/src/ast/struct_block_decoration.h
index ec3ecb0..54a9404 100644
--- a/src/ast/struct_block_decoration.h
+++ b/src/ast/struct_block_decoration.h
@@ -36,7 +36,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/struct_member.cc b/src/ast/struct_member.cc
index 1f229d0..68c9340 100644
--- a/src/ast/struct_member.cc
+++ b/src/ast/struct_member.cc
@@ -64,7 +64,7 @@
   return ctx->dst->create<StructMember>(src, sym, ty, decos);
 }
 
-void StructMember::to_str(const semantic::Info& sem,
+void StructMember::to_str(const sem::Info& sem,
                           std::ostream& out,
                           size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/struct_member.h b/src/ast/struct_member.h
index 6ecf823..afb0e6b 100644
--- a/src/ast/struct_member.h
+++ b/src/ast/struct_member.h
@@ -65,7 +65,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/struct_member_align_decoration.cc b/src/ast/struct_member_align_decoration.cc
index d45911a..b4b78ea 100644
--- a/src/ast/struct_member_align_decoration.cc
+++ b/src/ast/struct_member_align_decoration.cc
@@ -29,7 +29,7 @@
 
 StructMemberAlignDecoration::~StructMemberAlignDecoration() = default;
 
-void StructMemberAlignDecoration::to_str(const semantic::Info&,
+void StructMemberAlignDecoration::to_str(const sem::Info&,
                                          std::ostream& out,
                                          size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/struct_member_align_decoration.h b/src/ast/struct_member_align_decoration.h
index dfa32d2..49af979 100644
--- a/src/ast/struct_member_align_decoration.h
+++ b/src/ast/struct_member_align_decoration.h
@@ -42,7 +42,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/struct_member_offset_decoration.cc b/src/ast/struct_member_offset_decoration.cc
index 6f09870..6e59d5e 100644
--- a/src/ast/struct_member_offset_decoration.cc
+++ b/src/ast/struct_member_offset_decoration.cc
@@ -28,7 +28,7 @@
 
 StructMemberOffsetDecoration::~StructMemberOffsetDecoration() = default;
 
-void StructMemberOffsetDecoration::to_str(const semantic::Info&,
+void StructMemberOffsetDecoration::to_str(const sem::Info&,
                                           std::ostream& out,
                                           size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/struct_member_offset_decoration.h b/src/ast/struct_member_offset_decoration.h
index 61c1caf..a7f880d 100644
--- a/src/ast/struct_member_offset_decoration.h
+++ b/src/ast/struct_member_offset_decoration.h
@@ -49,7 +49,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/struct_member_size_decoration.cc b/src/ast/struct_member_size_decoration.cc
index ec4ae77..4d9fb79 100644
--- a/src/ast/struct_member_size_decoration.cc
+++ b/src/ast/struct_member_size_decoration.cc
@@ -29,7 +29,7 @@
 
 StructMemberSizeDecoration::~StructMemberSizeDecoration() = default;
 
-void StructMemberSizeDecoration::to_str(const semantic::Info&,
+void StructMemberSizeDecoration::to_str(const sem::Info&,
                                         std::ostream& out,
                                         size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/struct_member_size_decoration.h b/src/ast/struct_member_size_decoration.h
index 5d3be8f..8be17ce 100644
--- a/src/ast/struct_member_size_decoration.h
+++ b/src/ast/struct_member_size_decoration.h
@@ -42,7 +42,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/switch_statement.cc b/src/ast/switch_statement.cc
index 876ca1e..b9511f7 100644
--- a/src/ast/switch_statement.cc
+++ b/src/ast/switch_statement.cc
@@ -46,7 +46,7 @@
   return ctx->dst->create<SwitchStatement>(src, cond, b);
 }
 
-void SwitchStatement::to_str(const semantic::Info& sem,
+void SwitchStatement::to_str(const sem::Info& sem,
                              std::ostream& out,
                              size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/switch_statement.h b/src/ast/switch_statement.h
index 16c6622..a0ee1e3 100644
--- a/src/ast/switch_statement.h
+++ b/src/ast/switch_statement.h
@@ -55,7 +55,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/type_constructor_expression.cc b/src/ast/type_constructor_expression.cc
index 6ae0772..2b4a940 100644
--- a/src/ast/type_constructor_expression.cc
+++ b/src/ast/type_constructor_expression.cc
@@ -47,7 +47,7 @@
   return ctx->dst->create<TypeConstructorExpression>(src, ty, vals);
 }
 
-void TypeConstructorExpression::to_str(const semantic::Info& sem,
+void TypeConstructorExpression::to_str(const sem::Info& sem,
                                        std::ostream& out,
                                        size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/type_constructor_expression.h b/src/ast/type_constructor_expression.h
index 37629da..8052121 100644
--- a/src/ast/type_constructor_expression.h
+++ b/src/ast/type_constructor_expression.h
@@ -54,7 +54,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/uint_literal.cc b/src/ast/uint_literal.cc
index f893a0a..1616c50 100644
--- a/src/ast/uint_literal.cc
+++ b/src/ast/uint_literal.cc
@@ -29,7 +29,7 @@
 
 UintLiteral::~UintLiteral() = default;
 
-std::string UintLiteral::to_str(const semantic::Info&) const {
+std::string UintLiteral::to_str(const sem::Info&) const {
   return std::to_string(value()) + "u";
 }
 
diff --git a/src/ast/uint_literal.h b/src/ast/uint_literal.h
index 141239f..557be53 100644
--- a/src/ast/uint_literal.h
+++ b/src/ast/uint_literal.h
@@ -44,7 +44,7 @@
 
   /// @param sem the semantic info for the program
   /// @returns the literal as a string
-  std::string to_str(const semantic::Info& sem) const override;
+  std::string to_str(const sem::Info& sem) const override;
 
   /// Clones this node and all transitive child nodes using the `CloneContext`
   /// `ctx`.
diff --git a/src/ast/unary_op_expression.cc b/src/ast/unary_op_expression.cc
index 3009c74..be3d5ef 100644
--- a/src/ast/unary_op_expression.cc
+++ b/src/ast/unary_op_expression.cc
@@ -41,7 +41,7 @@
   return ctx->dst->create<UnaryOpExpression>(src, op_, e);
 }
 
-void UnaryOpExpression::to_str(const semantic::Info& sem,
+void UnaryOpExpression::to_str(const sem::Info& sem,
                                std::ostream& out,
                                size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/unary_op_expression.h b/src/ast/unary_op_expression.h
index a9e2d6e..3f8e887 100644
--- a/src/ast/unary_op_expression.h
+++ b/src/ast/unary_op_expression.h
@@ -52,7 +52,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/variable.cc b/src/ast/variable.cc
index 83e66b2..3e5f7f8 100644
--- a/src/ast/variable.cc
+++ b/src/ast/variable.cc
@@ -16,7 +16,7 @@
 
 #include "src/ast/constant_id_decoration.h"
 #include "src/program_builder.h"
-#include "src/semantic/variable.h"
+#include "src/sem/variable.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::Variable);
 
@@ -80,7 +80,7 @@
                                     is_const_, ctor, decos);
 }
 
-void Variable::info_to_str(const semantic::Info& sem,
+void Variable::info_to_str(const sem::Info& sem,
                            std::ostream& out,
                            size_t indent) const {
   auto* var_sem = sem.Get(this);
@@ -95,7 +95,7 @@
   }
 }
 
-void Variable::constructor_to_str(const semantic::Info& sem,
+void Variable::constructor_to_str(const sem::Info& sem,
                                   std::ostream& out,
                                   size_t indent) const {
   if (constructor_ == nullptr)
@@ -110,7 +110,7 @@
   out << "}" << std::endl;
 }
 
-void Variable::to_str(const semantic::Info& sem,
+void Variable::to_str(const sem::Info& sem,
                       std::ostream& out,
                       size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/variable.h b/src/ast/variable.h
index 6caeee8..ab88e3a 100644
--- a/src/ast/variable.h
+++ b/src/ast/variable.h
@@ -150,7 +150,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
@@ -159,14 +159,14 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void info_to_str(const semantic::Info& sem,
+  void info_to_str(const sem::Info& sem,
                    std::ostream& out,
                    size_t indent) const;
   /// Output constructor for this variable.
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void constructor_to_str(const semantic::Info& sem,
+  void constructor_to_str(const sem::Info& sem,
                           std::ostream& out,
                           size_t indent) const;
 
diff --git a/src/ast/variable_decl_statement.cc b/src/ast/variable_decl_statement.cc
index e636fb5..0e41626 100644
--- a/src/ast/variable_decl_statement.cc
+++ b/src/ast/variable_decl_statement.cc
@@ -40,7 +40,7 @@
   return ctx->dst->create<VariableDeclStatement>(src, var);
 }
 
-void VariableDeclStatement::to_str(const semantic::Info& sem,
+void VariableDeclStatement::to_str(const sem::Info& sem,
                                    std::ostream& out,
                                    size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/variable_decl_statement.h b/src/ast/variable_decl_statement.h
index 4cfdfa9..2456497 100644
--- a/src/ast/variable_decl_statement.h
+++ b/src/ast/variable_decl_statement.h
@@ -49,7 +49,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/ast/workgroup_decoration.cc b/src/ast/workgroup_decoration.cc
index 85e6dbe..ba7d3ff 100644
--- a/src/ast/workgroup_decoration.cc
+++ b/src/ast/workgroup_decoration.cc
@@ -41,7 +41,7 @@
 
 WorkgroupDecoration::~WorkgroupDecoration() = default;
 
-void WorkgroupDecoration::to_str(const semantic::Info&,
+void WorkgroupDecoration::to_str(const sem::Info&,
                                  std::ostream& out,
                                  size_t indent) const {
   make_indent(out, indent);
diff --git a/src/ast/workgroup_decoration.h b/src/ast/workgroup_decoration.h
index ae52f15..5838168 100644
--- a/src/ast/workgroup_decoration.h
+++ b/src/ast/workgroup_decoration.h
@@ -61,7 +61,7 @@
   /// @param sem the semantic info for the program
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 
diff --git a/src/clone_context_test.cc b/src/clone_context_test.cc
index c64ca9f..d8736e4 100644
--- a/src/clone_context_test.cc
+++ b/src/clone_context_test.cc
@@ -39,7 +39,7 @@
     return out;
   }
 
-  void to_str(const semantic::Info&, std::ostream&, size_t) const override {}
+  void to_str(const sem::Info&, std::ostream&, size_t) const override {}
 };
 
 struct Replaceable : public Castable<Replaceable, Node> {
@@ -59,7 +59,7 @@
     return ctx->dst->create<NotANode>();
   }
 
-  void to_str(const semantic::Info&, std::ostream&, size_t) const override {}
+  void to_str(const sem::Info&, std::ostream&, size_t) const override {}
 };
 
 TEST(CloneContext, Clone) {
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index d01f2a4..a11a446 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -17,15 +17,15 @@
 #include <utility>
 
 #include "src/ast/bool_literal.h"
-#include "src/ast/float_literal.h"
 #include "src/ast/constant_id_decoration.h"
+#include "src/ast/float_literal.h"
 #include "src/ast/module.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/ast/sint_literal.h"
 #include "src/ast/uint_literal.h"
-#include "src/semantic/function.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/function.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/type/array_type.h"
 #include "src/type/f32_type.h"
diff --git a/src/intrinsic_table.cc b/src/intrinsic_table.cc
index f9d19c7..39df6a5 100644
--- a/src/intrinsic_table.cc
+++ b/src/intrinsic_table.cc
@@ -638,7 +638,7 @@
   Impl();
 
   IntrinsicTable::Result Lookup(ProgramBuilder& builder,
-                                semantic::IntrinsicType type,
+                                sem::IntrinsicType type,
                                 const std::vector<type::Type*>& args,
                                 const Source& source) const override;
 
@@ -647,11 +647,10 @@
     Parameter(
         Builder* m)  // NOLINT - implicit constructor required for Register()
         : matcher(m) {}
-    Parameter(semantic::Parameter::Usage u, Builder* m)
-        : matcher(m), usage(u) {}
+    Parameter(sem::Parameter::Usage u, Builder* m) : matcher(m), usage(u) {}
 
     Builder* const matcher;
-    semantic::Parameter::Usage const usage = semantic::Parameter::Usage::kNone;
+    sem::Parameter::Usage const usage = sem::Parameter::Usage::kNone;
   };
 
   /// A single overload definition.
@@ -660,13 +659,13 @@
     /// types. If a match is made, the build intrinsic is returned, otherwise
     /// `match_score` is assigned a score of how closely the overload matched
     /// (positive representing a greater match), and nullptr is returned.
-    semantic::Intrinsic* Match(ProgramBuilder& builder,
-                               semantic::IntrinsicType type,
-                               const std::vector<type::Type*>& arg_types,
-                               diag::List& diagnostics,
-                               int& match_score) const;
+    sem::Intrinsic* Match(ProgramBuilder& builder,
+                          sem::IntrinsicType type,
+                          const std::vector<type::Type*>& arg_types,
+                          diag::List& diagnostics,
+                          int& match_score) const;
 
-    semantic::IntrinsicType type;
+    sem::IntrinsicType type;
     Builder* return_type;
     std::vector<Parameter> parameters;
     std::unordered_map<OpenType, Matcher*> open_type_matchers;
@@ -774,7 +773,7 @@
   /// Registers an overload with the given intrinsic type, return type Matcher /
   /// Builder, and parameter Matcher / Builders.
   /// This overload of Register does not constrain any OpenTypes.
-  void Register(semantic::IntrinsicType type,
+  void Register(sem::IntrinsicType type,
                 Builder* return_type,
                 std::vector<Parameter> parameters) {
     Overload overload{type, return_type, std::move(parameters), {}};
@@ -785,7 +784,7 @@
   /// Builder, and parameter Matcher / Builders.
   /// A single OpenType is contained with the given Matcher in
   /// open_type_matcher.
-  void Register(semantic::IntrinsicType type,
+  void Register(sem::IntrinsicType type,
                 Builder* return_type,
                 std::vector<Parameter> parameters,
                 std::pair<OpenType, Matcher*> open_type_matcher) {
@@ -796,7 +795,7 @@
 };
 
 Impl::Impl() {
-  using I = semantic::IntrinsicType;
+  using I = sem::IntrinsicType;
   using Dim = type::TextureDimension;
 
   auto* void_ = &matchers_.void_;      // void
@@ -835,8 +834,8 @@
   //
   //   Register(I::kIsInf, bool_, {f32});
   //
-  //   I     - is an alias to semantic::IntrinsicType.
-  //           I::kIsInf is shorthand for semantic::IntrinsicType::kIsInf.
+  //   I     - is an alias to sem::IntrinsicType.
+  //           I::kIsInf is shorthand for sem::IntrinsicType::kIsInf.
   //   bool_ - is a pointer to a pre-constructed BoolBuilder which matches and
   //           builds type::Bool types.
   //   {f32} - is the list of parameter Builders for the overload.
@@ -858,12 +857,12 @@
   //   (2) All the parameters have had their Matcher::Match() methods return
   //       true, there are no open-types (more about these later), so the
   //       overload has matched.
-  //   (3) The semantic::Intrinsic now needs to be built, so we begin by
+  //   (3) The sem::Intrinsic now needs to be built, so we begin by
   //       building the overload's parameter types (these may not exactly match
   //       the argument types). Build() is called for each parameter Builder,
   //       returning the parameter type.
   //   (4) Finally, Builder::Build() is called for the return_type, and the
-  //       semantic::Intrinsic is constructed and returned.
+  //       sem::Intrinsic is constructed and returned.
   //       Job done.
   //
   // Overload resolution also supports basic pattern matching through the use of
@@ -915,11 +914,11 @@
   //       The Matcher::Match() is called for each closed type. If any return
   //       false then the overload match fails.
   //   (4) Overload::Match() now needs to build and return the output
-  //       semantic::Intrinsic holding the matched overload signature.
+  //       sem::Intrinsic holding the matched overload signature.
   //   (5) The parameter types are built by calling OpenTypeBuilder::Build().
   //       This simply returns the closed type.
   //   (6) OpenTypeBuilder::Build() is called again for the return_type, and the
-  //       semantic::Intrinsic is constructed and returned.
+  //       sem::Intrinsic is constructed and returned.
   //       Job done.
   //
   // Open-numbers are very similar to open-types, except they match against
@@ -1118,18 +1117,18 @@
   auto* sampler = this->sampler(type::SamplerKind::kSampler);
   auto* sampler_comparison =
       this->sampler(type::SamplerKind::kComparisonSampler);
-  auto t = semantic::Parameter::Usage::kTexture;
-  auto s = semantic::Parameter::Usage::kSampler;
-  auto coords = semantic::Parameter::Usage::kCoords;
-  auto array_index = semantic::Parameter::Usage::kArrayIndex;
-  auto ddx = semantic::Parameter::Usage::kDdx;
-  auto ddy = semantic::Parameter::Usage::kDdy;
-  auto depth_ref = semantic::Parameter::Usage::kDepthRef;
-  auto bias = semantic::Parameter::Usage::kBias;
-  auto level = semantic::Parameter::Usage::kLevel;
-  auto offset = semantic::Parameter::Usage::kOffset;
-  auto value = semantic::Parameter::Usage::kValue;
-  auto sample_index = semantic::Parameter::Usage::kSampleIndex;
+  auto t = sem::Parameter::Usage::kTexture;
+  auto s = sem::Parameter::Usage::kSampler;
+  auto coords = sem::Parameter::Usage::kCoords;
+  auto array_index = sem::Parameter::Usage::kArrayIndex;
+  auto ddx = sem::Parameter::Usage::kDdx;
+  auto ddy = sem::Parameter::Usage::kDdy;
+  auto depth_ref = sem::Parameter::Usage::kDepthRef;
+  auto bias = sem::Parameter::Usage::kBias;
+  auto level = sem::Parameter::Usage::kLevel;
+  auto offset = sem::Parameter::Usage::kOffset;
+  auto value = sem::Parameter::Usage::kValue;
+  auto sample_index = sem::Parameter::Usage::kSampleIndex;
 
   // clang-format off
 
@@ -1271,8 +1270,8 @@
         ss << ", ";
       }
       first = false;
-      if (param.usage != semantic::Parameter::Usage::kNone) {
-        ss << semantic::str(param.usage) << " : ";
+      if (param.usage != sem::Parameter::Usage::kNone) {
+        ss << sem::str(param.usage) << " : ";
       }
       ss << param.matcher->str();
     }
@@ -1300,10 +1299,10 @@
 /// @return a string representing a call to an intrinsic with the given argument
 /// types.
 std::string CallSignature(ProgramBuilder& builder,
-                          semantic::IntrinsicType type,
+                          sem::IntrinsicType type,
                           const std::vector<type::Type*>& args) {
   std::stringstream ss;
-  ss << semantic::str(type) << "(";
+  ss << sem::str(type) << "(";
   {
     bool first = true;
     for (auto* arg : args) {
@@ -1320,7 +1319,7 @@
 }
 
 IntrinsicTable::Result Impl::Lookup(ProgramBuilder& builder,
-                                    semantic::IntrinsicType type,
+                                    sem::IntrinsicType type,
                                     const std::vector<type::Type*>& args,
                                     const Source& source) const {
   diag::List diagnostics;
@@ -1369,11 +1368,11 @@
   return Result{nullptr, std::move(diagnostics)};
 }
 
-semantic::Intrinsic* Impl::Overload::Match(ProgramBuilder& builder,
-                                           semantic::IntrinsicType intrinsic,
-                                           const std::vector<type::Type*>& args,
-                                           diag::List& diagnostics,
-                                           int& match_score) const {
+sem::Intrinsic* Impl::Overload::Match(ProgramBuilder& builder,
+                                      sem::IntrinsicType intrinsic,
+                                      const std::vector<type::Type*>& args,
+                                      diag::List& diagnostics,
+                                      int& match_score) const {
   if (type != intrinsic) {
     match_score = std::numeric_limits<int>::min();
     return nullptr;  // Incorrect function
@@ -1463,15 +1462,15 @@
   }
 
   // Build the semantic parameters
-  semantic::ParameterList params;
+  sem::ParameterList params;
   params.reserve(parameters.size());
   for (size_t i = 0; i < args.size(); i++) {
     auto& parameter = parameters[i];
     auto* ty = parameter.matcher->Build(builder_state);
-    params.emplace_back(semantic::Parameter{ty, parameter.usage});
+    params.emplace_back(sem::Parameter{ty, parameter.usage});
   }
 
-  return builder.create<semantic::Intrinsic>(intrinsic, ret, params);
+  return builder.create<sem::Intrinsic>(intrinsic, ret, params);
 }
 
 }  // namespace
diff --git a/src/intrinsic_table.h b/src/intrinsic_table.h
index 167dcc4..fc0e465 100644
--- a/src/intrinsic_table.h
+++ b/src/intrinsic_table.h
@@ -19,7 +19,7 @@
 #include <string>
 #include <vector>
 
-#include "src/semantic/intrinsic.h"
+#include "src/sem/intrinsic.h"
 
 namespace tint {
 
@@ -38,7 +38,7 @@
   /// Result is returned by Lookup
   struct Result {
     /// The intrinsic, if the lookup succeeded, otherwise nullptr
-    semantic::Intrinsic* intrinsic;
+    sem::Intrinsic* intrinsic;
     /// Diagnostic messages
     diag::List diagnostics;
   };
@@ -50,7 +50,7 @@
   /// @param source the source of the intrinsic call
   /// @return the semantic intrinsic if found, otherwise nullptr
   virtual Result Lookup(ProgramBuilder& builder,
-                        semantic::IntrinsicType type,
+                        sem::IntrinsicType type,
                         const std::vector<type::Type*>& args,
                         const Source& source) const = 0;
 };
diff --git a/src/intrinsic_table_test.cc b/src/intrinsic_table_test.cc
index 350eec7..073f0df 100644
--- a/src/intrinsic_table_test.cc
+++ b/src/intrinsic_table_test.cc
@@ -28,8 +28,8 @@
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
 
-using IntrinsicType = semantic::IntrinsicType;
-using Parameter = semantic::Parameter;
+using IntrinsicType = sem::IntrinsicType;
+using Parameter = sem::Parameter;
 
 class IntrinsicTableTest : public testing::Test, public ProgramBuilder {
  public:
diff --git a/src/program.cc b/src/program.cc
index 77f6775..4342d10 100644
--- a/src/program.cc
+++ b/src/program.cc
@@ -18,7 +18,7 @@
 
 #include "src/demangler.h"
 #include "src/resolver/resolver.h"
-#include "src/semantic/expression.h"
+#include "src/sem/expression.h"
 
 namespace tint {
 
diff --git a/src/program.h b/src/program.h
index b7e5aaf..f2f6eaf 100644
--- a/src/program.h
+++ b/src/program.h
@@ -19,7 +19,7 @@
 
 #include "src/ast/function.h"
 #include "src/program_id.h"
-#include "src/semantic/info.h"
+#include "src/sem/info.h"
 #include "src/symbol_table.h"
 #include "src/type/type_manager.h"
 
@@ -40,8 +40,8 @@
   /// ASTNodeAllocator is an alias to BlockAllocator<ast::Node>
   using ASTNodeAllocator = BlockAllocator<ast::Node>;
 
-  /// SemNodeAllocator is an alias to BlockAllocator<semantic::Node>
-  using SemNodeAllocator = BlockAllocator<semantic::Node>;
+  /// SemNodeAllocator is an alias to BlockAllocator<sem::Node>
+  using SemNodeAllocator = BlockAllocator<sem::Node>;
 
   /// Constructor
   Program();
@@ -90,7 +90,7 @@
   }
 
   /// @returns a reference to the program's semantic info
-  const semantic::Info& Sem() const {
+  const sem::Info& Sem() const {
     AssertNotMoved();
     return sem_;
   }
@@ -164,7 +164,7 @@
   ASTNodeAllocator ast_nodes_;
   SemNodeAllocator sem_nodes_;
   ast::Module* ast_ = nullptr;
-  semantic::Info sem_;
+  sem::Info sem_;
   SymbolTable symbols_{id_};
   diag::List diagnostics_;
   bool is_valid_ = false;  // Not valid until it is built
diff --git a/src/program_builder.cc b/src/program_builder.cc
index 034882e..9bd988a 100644
--- a/src/program_builder.cc
+++ b/src/program_builder.cc
@@ -19,7 +19,7 @@
 #include "src/ast/variable_decl_statement.h"
 #include "src/debug.h"
 #include "src/demangler.h"
-#include "src/semantic/expression.h"
+#include "src/sem/expression.h"
 
 namespace tint {
 
@@ -59,7 +59,7 @@
   builder.types_ = type::Manager::Wrap(program->Types());
   builder.ast_ = builder.create<ast::Module>(
       program->AST().source(), program->AST().GlobalDeclarations());
-  builder.sem_ = semantic::Info::Wrap(program->Sem());
+  builder.sem_ = sem::Info::Wrap(program->Sem());
   builder.symbols_ = program->Symbols();
   builder.diagnostics_ = program->Diagnostics();
   return builder;
diff --git a/src/program_builder.h b/src/program_builder.h
index ce0f9cb..400f9cd 100644
--- a/src/program_builder.h
+++ b/src/program_builder.h
@@ -73,8 +73,8 @@
   /// ASTNodeAllocator is an alias to BlockAllocator<ast::Node>
   using ASTNodeAllocator = BlockAllocator<ast::Node>;
 
-  /// SemNodeAllocator is an alias to BlockAllocator<semantic::Node>
-  using SemNodeAllocator = BlockAllocator<semantic::Node>;
+  /// SemNodeAllocator is an alias to BlockAllocator<sem::Node>
+  using SemNodeAllocator = BlockAllocator<sem::Node>;
 
   /// `i32` is a type alias to `int`.
   /// Useful for passing to template methods such as `vec2<i32>()` to imitate
@@ -172,13 +172,13 @@
   }
 
   /// @returns a reference to the program's semantic info
-  semantic::Info& Sem() {
+  sem::Info& Sem() {
     AssertNotMoved();
     return sem_;
   }
 
   /// @returns a reference to the program's semantic info
-  const semantic::Info& Sem() const {
+  const sem::Info& Sem() const {
     AssertNotMoved();
     return sem_;
   }
@@ -276,13 +276,13 @@
                                 std::forward<ARGS>(args)...);
   }
 
-  /// Creates a new semantic::Node owned by the ProgramBuilder.
-  /// When the ProgramBuilder is destructed, the semantic::Node will also be
+  /// Creates a new sem::Node owned by the ProgramBuilder.
+  /// When the ProgramBuilder is destructed, the sem::Node will also be
   /// destructed.
   /// @param args the arguments to pass to the type constructor
   /// @returns the node pointer
   template <typename T, typename... ARGS>
-  traits::EnableIfIsType<T, semantic::Node>* create(ARGS&&... args) {
+  traits::EnableIfIsType<T, sem::Node>* create(ARGS&&... args) {
     AssertNotMoved();
     return sem_nodes_.Create<T>(std::forward<ARGS>(args)...);
   }
@@ -1445,7 +1445,7 @@
   ASTNodeAllocator ast_nodes_;
   SemNodeAllocator sem_nodes_;
   ast::Module* ast_;
-  semantic::Info sem_;
+  sem::Info sem_;
   SymbolTable symbols_{id_};
   diag::List diagnostics_;
 
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index 6e73457..96191b3 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -433,37 +433,37 @@
 }
 
 // Returns the WGSL standard library function intrinsic for the
-// given instruction, or semantic::IntrinsicType::kNone
-semantic::IntrinsicType GetIntrinsic(SpvOp opcode) {
+// given instruction, or sem::IntrinsicType::kNone
+sem::IntrinsicType GetIntrinsic(SpvOp opcode) {
   switch (opcode) {
     case SpvOpBitCount:
-      return semantic::IntrinsicType::kCountOneBits;
+      return sem::IntrinsicType::kCountOneBits;
     case SpvOpBitReverse:
-      return semantic::IntrinsicType::kReverseBits;
+      return sem::IntrinsicType::kReverseBits;
     case SpvOpDot:
-      return semantic::IntrinsicType::kDot;
+      return sem::IntrinsicType::kDot;
     case SpvOpDPdx:
-      return semantic::IntrinsicType::kDpdx;
+      return sem::IntrinsicType::kDpdx;
     case SpvOpDPdy:
-      return semantic::IntrinsicType::kDpdy;
+      return sem::IntrinsicType::kDpdy;
     case SpvOpFwidth:
-      return semantic::IntrinsicType::kFwidth;
+      return sem::IntrinsicType::kFwidth;
     case SpvOpDPdxFine:
-      return semantic::IntrinsicType::kDpdxFine;
+      return sem::IntrinsicType::kDpdxFine;
     case SpvOpDPdyFine:
-      return semantic::IntrinsicType::kDpdyFine;
+      return sem::IntrinsicType::kDpdyFine;
     case SpvOpFwidthFine:
-      return semantic::IntrinsicType::kFwidthFine;
+      return sem::IntrinsicType::kFwidthFine;
     case SpvOpDPdxCoarse:
-      return semantic::IntrinsicType::kDpdxCoarse;
+      return sem::IntrinsicType::kDpdxCoarse;
     case SpvOpDPdyCoarse:
-      return semantic::IntrinsicType::kDpdyCoarse;
+      return sem::IntrinsicType::kDpdyCoarse;
     case SpvOpFwidthCoarse:
-      return semantic::IntrinsicType::kFwidthCoarse;
+      return sem::IntrinsicType::kFwidthCoarse;
     default:
       break;
   }
-  return semantic::IntrinsicType::kNone;
+  return sem::IntrinsicType::kNone;
 }
 
 // @param opcode a SPIR-V opcode
@@ -705,7 +705,7 @@
 ast::Node* StatementBuilder::Clone(CloneContext*) const {
   return nullptr;
 }
-void StatementBuilder::to_str(const semantic::Info&,
+void StatementBuilder::to_str(const sem::Info&,
                               std::ostream& out,
                               size_t indent) const {
   make_indent(out, indent);
@@ -3253,7 +3253,7 @@
   }
 
   const auto intrinsic = GetIntrinsic(opcode);
-  if (intrinsic != semantic::IntrinsicType::kNone) {
+  if (intrinsic != sem::IntrinsicType::kNone) {
     return MakeIntrinsicCall(inst);
   }
 
diff --git a/src/reader/spirv/function.h b/src/reader/spirv/function.h
index 3fab0d8..f0517b2 100644
--- a/src/reader/spirv/function.h
+++ b/src/reader/spirv/function.h
@@ -375,7 +375,7 @@
 
  private:
   Node* Clone(CloneContext*) const override;
-  void to_str(const semantic::Info& sem,
+  void to_str(const sem::Info& sem,
               std::ostream& out,
               size_t indent) const override;
 };
diff --git a/src/reader/spirv/parser_impl_barrier_test.cc b/src/reader/spirv/parser_impl_barrier_test.cc
index 751ce3f..08d1b34 100644
--- a/src/reader/spirv/parser_impl_barrier_test.cc
+++ b/src/reader/spirv/parser_impl_barrier_test.cc
@@ -17,7 +17,7 @@
 #include "src/reader/spirv/function.h"
 #include "src/reader/spirv/parser_impl_test_helper.h"
 #include "src/reader/spirv/spirv_tools_helpers_test.h"
-#include "src/semantic/call.h"
+#include "src/sem/call.h"
 
 namespace tint {
 namespace reader {
@@ -68,9 +68,9 @@
   EXPECT_EQ(call->expr()->params().size(), 0u);
   auto* sem_call = program.Sem().Get(call->expr());
   ASSERT_NE(sem_call, nullptr);
-  auto* intrinsic = sem_call->Target()->As<semantic::Intrinsic>();
+  auto* intrinsic = sem_call->Target()->As<sem::Intrinsic>();
   ASSERT_NE(intrinsic, nullptr);
-  EXPECT_EQ(intrinsic->Type(), semantic::IntrinsicType::kWorkgroupBarrier);
+  EXPECT_EQ(intrinsic->Type(), sem::IntrinsicType::kWorkgroupBarrier);
 }
 
 TEST_F(SpvParserTest, StorageBarrier) {
@@ -96,9 +96,9 @@
   EXPECT_EQ(call->expr()->params().size(), 0u);
   auto* sem_call = program.Sem().Get(call->expr());
   ASSERT_NE(sem_call, nullptr);
-  auto* intrinsic = sem_call->Target()->As<semantic::Intrinsic>();
+  auto* intrinsic = sem_call->Target()->As<sem::Intrinsic>();
   ASSERT_NE(intrinsic, nullptr);
-  EXPECT_EQ(intrinsic->Type(), semantic::IntrinsicType::kStorageBarrier);
+  EXPECT_EQ(intrinsic->Type(), sem::IntrinsicType::kStorageBarrier);
 }
 
 TEST_F(SpvParserTest, ErrBarrierInvalidExecution) {
diff --git a/src/resolver/host_shareable_validation_test.cc b/src/resolver/host_shareable_validation_test.cc
index ef5aec7..9da185c 100644
--- a/src/resolver/host_shareable_validation_test.cc
+++ b/src/resolver/host_shareable_validation_test.cc
@@ -16,7 +16,7 @@
 
 #include "gmock/gmock.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/struct.h"
+#include "src/sem/struct.h"
 #include "src/type/access_control_type.h"
 
 namespace tint {
diff --git a/src/resolver/intrinsic_test.cc b/src/resolver/intrinsic_test.cc
index 1ec20a9..ace8df5 100644
--- a/src/resolver/intrinsic_test.cc
+++ b/src/resolver/intrinsic_test.cc
@@ -29,11 +29,11 @@
 #include "src/ast/unary_op_expression.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/call.h"
-#include "src/semantic/function.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/variable.h"
+#include "src/sem/call.h"
+#include "src/sem/function.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/type/sampled_texture_type.h"
 
@@ -44,7 +44,7 @@
 namespace resolver {
 namespace {
 
-using IntrinsicType = semantic::IntrinsicType;
+using IntrinsicType = sem::IntrinsicType;
 
 using ResolverIntrinsicTest = ResolverTest;
 
@@ -1678,7 +1678,7 @@
     testing::ValuesIn(ast::intrinsic::test::TextureOverloadCase::ValidCases()));
 
 std::string to_str(const std::string& function,
-                   const semantic::ParameterList& params) {
+                   const sem::ParameterList& params) {
   std::stringstream out;
   out << function << "(";
   bool first = true;
@@ -1686,7 +1686,7 @@
     if (!first) {
       out << ", ";
     }
-    out << semantic::str(param.usage);
+    out << sem::str(param.usage);
     first = false;
   }
   out << ")";
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index b69ccb2..1bbccd6 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -34,13 +34,13 @@
 #include "src/ast/unary_op_expression.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/ast/workgroup_decoration.h"
-#include "src/semantic/array.h"
-#include "src/semantic/call.h"
-#include "src/semantic/function.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/array.h"
+#include "src/sem/call.h"
+#include "src/sem/function.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/statement.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/utils/get_or_create.h"
 #include "src/utils/math.h"
@@ -49,7 +49,7 @@
 namespace resolver {
 namespace {
 
-using IntrinsicType = tint::semantic::IntrinsicType;
+using IntrinsicType = tint::sem::IntrinsicType;
 
 // Helper class that temporarily assigns a value to a reference for the scope of
 // the object. Once the ScopedAssignment is destructed, the original value is
@@ -394,7 +394,7 @@
   // Persistent state is used to track which builtins and locations have already
   // been seen, in order to catch conflicts.
   // TODO(jrprice): This state could be stored in FunctionInfo instead, and then
-  // passed to semantic::Function since it would be useful there too.
+  // passed to sem::Function since it would be useful there too.
   std::unordered_set<ast::Builtin> builtins;
   std::unordered_set<uint32_t> locations;
   enum class ParamOrRetType {
@@ -594,15 +594,15 @@
       switch (func->pipeline_stage()) {
         case ast::PipelineStage::kVertex:
           info->pipeline_stage_uses.emplace(
-              semantic::PipelineStageUsage::kVertexInput);
+              sem::PipelineStageUsage::kVertexInput);
           break;
         case ast::PipelineStage::kFragment:
           info->pipeline_stage_uses.emplace(
-              semantic::PipelineStageUsage::kFragmentInput);
+              sem::PipelineStageUsage::kFragmentInput);
           break;
         case ast::PipelineStage::kCompute:
           info->pipeline_stage_uses.emplace(
-              semantic::PipelineStageUsage::kComputeInput);
+              sem::PipelineStageUsage::kComputeInput);
           break;
         case ast::PipelineStage::kNone:
           break;
@@ -626,15 +626,15 @@
     switch (func->pipeline_stage()) {
       case ast::PipelineStage::kVertex:
         info->pipeline_stage_uses.emplace(
-            semantic::PipelineStageUsage::kVertexOutput);
+            sem::PipelineStageUsage::kVertexOutput);
         break;
       case ast::PipelineStage::kFragment:
         info->pipeline_stage_uses.emplace(
-            semantic::PipelineStageUsage::kFragmentOutput);
+            sem::PipelineStageUsage::kFragmentOutput);
         break;
       case ast::PipelineStage::kCompute:
         info->pipeline_stage_uses.emplace(
-            semantic::PipelineStageUsage::kComputeOutput);
+            sem::PipelineStageUsage::kComputeOutput);
         break;
       case ast::PipelineStage::kNone:
         break;
@@ -677,10 +677,10 @@
 
 bool Resolver::Statement(ast::Statement* stmt) {
   auto* sem_statement =
-      builder_->create<semantic::Statement>(stmt, current_block_->block);
+      builder_->create<sem::Statement>(stmt, current_block_->block);
   builder_->Sem().Add(stmt, sem_statement);
 
-  ScopedAssignment<semantic::Statement*> sa(current_statement_, sem_statement);
+  ScopedAssignment<sem::Statement*> sa(current_statement_, sem_statement);
 
   if (auto* a = stmt->As<ast::AssignmentStatement>()) {
     return Assignment(a);
@@ -790,10 +790,9 @@
     // not a BlockStatement.
     constexpr ast::BlockStatement* no_block_statement = nullptr;
     auto* sem_else_stmt =
-        builder_->create<semantic::Statement>(else_stmt, no_block_statement);
+        builder_->create<sem::Statement>(else_stmt, no_block_statement);
     builder_->Sem().Add(else_stmt, sem_else_stmt);
-    ScopedAssignment<semantic::Statement*> sa(current_statement_,
-                                              sem_else_stmt);
+    ScopedAssignment<sem::Statement*> sa(current_statement_, sem_else_stmt);
     if (!Expression(else_stmt->condition())) {
       return false;
     }
@@ -916,7 +915,7 @@
 
   auto name = builder_->Symbols().NameFor(ident->symbol());
 
-  auto intrinsic_type = semantic::ParseIntrinsicType(name);
+  auto intrinsic_type = sem::ParseIntrinsicType(name);
   if (intrinsic_type != IntrinsicType::kNone) {
     if (!IntrinsicCall(call, intrinsic_type)) {
       return false;
@@ -970,7 +969,7 @@
 }
 
 bool Resolver::IntrinsicCall(ast::CallExpression* call,
-                             semantic::IntrinsicType intrinsic_type) {
+                             sem::IntrinsicType intrinsic_type) {
   std::vector<type::Type*> arg_tys;
   arg_tys.reserve(call->params().size());
   for (auto* expr : call->params()) {
@@ -985,8 +984,8 @@
     return false;
   }
 
-  builder_->Sem().Add(call, builder_->create<semantic::Call>(
-                                call, result.intrinsic, current_statement_));
+  builder_->Sem().Add(call, builder_->create<sem::Call>(call, result.intrinsic,
+                                                        current_statement_));
   SetType(call, result.intrinsic->ReturnType());
   return true;
 }
@@ -1186,7 +1185,7 @@
   }
 
   std::string name = builder_->Symbols().NameFor(symbol);
-  if (semantic::ParseIntrinsicType(name) != IntrinsicType::kNone) {
+  if (sem::ParseIntrinsicType(name) != IntrinsicType::kNone) {
     diagnostics_.add_error("missing '(' for intrinsic call",
                            expr->source().End());
     return false;
@@ -1213,7 +1212,7 @@
     auto* str = Structure(ty);
     auto symbol = expr->member()->symbol();
 
-    const semantic::StructMember* member = nullptr;
+    const sem::StructMember* member = nullptr;
     for (auto* m : str->members) {
       if (m->Declaration()->symbol() == symbol) {
         ret = m->Declaration()->type();
@@ -1234,7 +1233,7 @@
       ret = builder_->create<type::Pointer>(ret, ptr->storage_class());
     }
 
-    builder_->Sem().Add(expr, builder_->create<semantic::StructMemberAccess>(
+    builder_->Sem().Add(expr, builder_->create<sem::StructMemberAccess>(
                                   expr, ret, current_statement_, member));
   } else if (auto* vec = data_type->As<type::Vector>()) {
     std::string str = builder_->Symbols().NameFor(expr->member()->symbol());
@@ -1302,8 +1301,8 @@
                                            static_cast<uint32_t>(size));
     }
     builder_->Sem().Add(
-        expr, builder_->create<semantic::Swizzle>(expr, ret, current_statement_,
-                                                  std::move(swizzle)));
+        expr, builder_->create<sem::Swizzle>(expr, ret, current_statement_,
+                                             std::move(swizzle)));
   } else {
     diagnostics_.add_error(
         "invalid use of member accessor on a non-vector/non-struct " +
@@ -1682,9 +1681,9 @@
   for (auto it : variable_to_info_) {
     auto* var = it.first;
     auto* info = it.second;
-    auto* sem_var = builder_->create<semantic::Variable>(var, info->type,
-                                                         info->storage_class);
-    std::vector<const semantic::VariableUser*> users;
+    auto* sem_var =
+        builder_->create<sem::Variable>(var, info->type, info->storage_class);
+    std::vector<const sem::VariableUser*> users;
     for (auto* user : info->users) {
       // Create semantic node for the identifier expression if necessary
       auto* sem_expr = sem.Get(user);
@@ -1692,14 +1691,14 @@
         auto* type = expr_info_.at(user).type;
         auto* stmt = expr_info_.at(user).statement;
         auto* sem_user =
-            builder_->create<semantic::VariableUser>(user, type, stmt, sem_var);
+            builder_->create<sem::VariableUser>(user, type, stmt, sem_var);
         sem_var->AddUser(sem_user);
         sem.Add(user, sem_user);
       } else {
-        auto* sem_user = sem_expr->As<semantic::VariableUser>();
+        auto* sem_user = sem_expr->As<sem::VariableUser>();
         if (!sem_user) {
           TINT_ICE(builder_->Diagnostics())
-              << "expected semantic::VariableUser, got "
+              << "expected sem::VariableUser, got "
               << sem_expr->TypeInfo().name;
         }
         sem_var->AddUser(sem_user);
@@ -1709,7 +1708,7 @@
   }
 
   auto remap_vars = [&sem](const std::vector<VariableInfo*>& in) {
-    std::vector<const semantic::Variable*> out;
+    std::vector<const sem::Variable*> out;
     out.reserve(in.size());
     for (auto* info : in) {
       out.emplace_back(sem.Get(info->declaration));
@@ -1718,12 +1717,12 @@
   };
 
   // Create semantic nodes for all ast::Functions
-  std::unordered_map<FunctionInfo*, semantic::Function*> func_info_to_sem_func;
+  std::unordered_map<FunctionInfo*, sem::Function*> func_info_to_sem_func;
   for (auto it : function_to_info_) {
     auto* func = it.first;
     auto* info = it.second;
 
-    auto* sem_func = builder_->create<semantic::Function>(
+    auto* sem_func = builder_->create<sem::Function>(
         info->declaration, remap_vars(info->parameters),
         remap_vars(info->referenced_module_vars),
         remap_vars(info->local_referenced_module_vars), info->return_statements,
@@ -1737,8 +1736,7 @@
     auto* call = it.first;
     auto info = it.second;
     auto* sem_func = func_info_to_sem_func.at(info.function);
-    sem.Add(call,
-            builder_->create<semantic::Call>(call, sem_func, info.statement));
+    sem.Add(call, builder_->create<sem::Call>(call, sem_func, info.statement));
   }
 
   // Create semantic nodes for all remaining expression types
@@ -1749,8 +1747,8 @@
       // Expression has already been assigned a semantic node
       continue;
     }
-    sem.Add(expr, builder_->create<semantic::Expression>(expr, info.type,
-                                                         info.statement));
+    sem.Add(expr,
+            builder_->create<sem::Expression>(expr, info.type, info.statement));
   }
 
   // Create semantic nodes for all structs
@@ -1758,7 +1756,7 @@
     auto* str = it.first;
     auto* info = it.second;
     builder_->Sem().Add(
-        str, builder_->create<semantic::Struct>(
+        str, builder_->create<sem::Struct>(
                  str, std::move(info->members), info->align, info->size,
                  info->size_no_padding, info->storage_class_usage,
                  info->pipeline_stage_uses));
@@ -1829,7 +1827,7 @@
   return false;
 }
 
-const semantic::Array* Resolver::Array(type::Array* arr, const Source& source) {
+const sem::Array* Resolver::Array(type::Array* arr, const Source& source) {
   if (auto* sem = builder_->Sem().Get(arr)) {
     // Semantic info already constructed for this array type
     return sem;
@@ -1851,12 +1849,12 @@
     return nullptr;
   }
 
-  auto create_semantic = [&](uint32_t stride) -> semantic::Array* {
+  auto create_semantic = [&](uint32_t stride) -> sem::Array* {
     auto align = el_align;
     // WebGPU requires runtime arrays have at least one element, but the AST
     // records an element count of 0 for it.
     auto size = std::max<uint32_t>(arr->size(), 1) * stride;
-    auto* sem = builder_->create<semantic::Array>(arr, align, size, stride);
+    auto* sem = builder_->create<sem::Array>(arr, align, size, stride);
     builder_->Sem().Add(arr, sem);
     return sem;
   };
@@ -1956,7 +1954,7 @@
     return nullptr;
   }
 
-  semantic::StructMemberList sem_members;
+  sem::StructMemberList sem_members;
   sem_members.reserve(str->impl()->members().size());
 
   // Calculate the effective size and alignment of each field, and the overall
@@ -2036,7 +2034,7 @@
     offset = utils::RoundUp(align, offset);
 
     auto* sem_member =
-        builder_->create<semantic::StructMember>(member, offset, align, size);
+        builder_->create<sem::StructMember>(member, offset, align, size);
     builder_->Sem().Add(member, sem_member);
     sem_members.emplace_back(sem_member);
 
diff --git a/src/resolver/resolver.h b/src/resolver/resolver.h
index ee942dc..ae3d823 100644
--- a/src/resolver/resolver.h
+++ b/src/resolver/resolver.h
@@ -24,7 +24,7 @@
 #include "src/intrinsic_table.h"
 #include "src/program_builder.h"
 #include "src/scope_stack.h"
-#include "src/semantic/struct.h"
+#include "src/sem/struct.h"
 #include "src/utils/unique_vector.h"
 
 namespace tint {
@@ -45,10 +45,10 @@
 class UnaryOpExpression;
 class Variable;
 }  // namespace ast
-namespace semantic {
+namespace sem {
 class Array;
 class Statement;
-}  // namespace semantic
+}  // namespace sem
 namespace type {
 class Struct;
 }  // namespace type
@@ -94,7 +94,7 @@
 
  private:
   /// Structure holding semantic information about a variable.
-  /// Used to build the semantic::Variable nodes at the end of resolving.
+  /// Used to build the sem::Variable nodes at the end of resolving.
   struct VariableInfo {
     VariableInfo(ast::Variable* decl, type::Type* type);
     ~VariableInfo();
@@ -106,7 +106,7 @@
   };
 
   /// Structure holding semantic information about a function.
-  /// Used to build the semantic::Function nodes at the end of resolving.
+  /// Used to build the sem::Function nodes at the end of resolving.
   struct FunctionInfo {
     explicit FunctionInfo(ast::Function* decl);
     ~FunctionInfo();
@@ -122,32 +122,32 @@
   };
 
   /// Structure holding semantic information about an expression.
-  /// Used to build the semantic::Expression nodes at the end of resolving.
+  /// Used to build the sem::Expression nodes at the end of resolving.
   struct ExpressionInfo {
     type::Type* type;
-    semantic::Statement* statement;
+    sem::Statement* statement;
   };
 
   /// Structure holding semantic information about a call expression to an
   /// ast::Function.
-  /// Used to build the semantic::Call nodes at the end of resolving.
+  /// Used to build the sem::Call nodes at the end of resolving.
   struct FunctionCallInfo {
     FunctionInfo* function;
-    semantic::Statement* statement;
+    sem::Statement* statement;
   };
 
   /// Structure holding semantic information about a struct.
-  /// Used to build the semantic::Struct nodes at the end of resolving.
+  /// Used to build the sem::Struct nodes at the end of resolving.
   struct StructInfo {
     StructInfo();
     ~StructInfo();
 
-    std::vector<const semantic::StructMember*> members;
+    std::vector<const sem::StructMember*> members;
     uint32_t align = 0;
     uint32_t size = 0;
     uint32_t size_no_padding = 0;
     std::unordered_set<ast::StorageClass> storage_class_usage;
-    std::unordered_set<semantic::PipelineStageUsage> pipeline_stage_uses;
+    std::unordered_set<sem::PipelineStageUsage> pipeline_stage_uses;
   };
 
   /// Structure holding semantic information about a block (i.e. scope), such as
@@ -188,7 +188,7 @@
   /// @returns true on success, false on error
   bool ResolveInternal();
 
-  /// Creates the nodes and adds them to the semantic::Info mappings of the
+  /// Creates the nodes and adds them to the sem::Info mappings of the
   /// ProgramBuilder.
   void CreateSemanticNodes() const;
 
@@ -225,7 +225,7 @@
   bool Function(ast::Function*);
   bool Identifier(ast::IdentifierExpression*);
   bool IfStatement(ast::IfStatement*);
-  bool IntrinsicCall(ast::CallExpression*, semantic::IntrinsicType);
+  bool IntrinsicCall(ast::CallExpression*, sem::IntrinsicType);
   bool MemberAccessor(ast::MemberAccessorExpression*);
   bool Statement(ast::Statement*);
   bool Statements(const ast::StatementList&);
@@ -253,7 +253,7 @@
   /// returned.
   /// @param arr the Array to get semantic information for
   /// @param source the Source of the ast node with this array as its type
-  const semantic::Array* Array(type::Array* arr, const Source& source);
+  const sem::Array* Array(type::Array* arr, const Source& source);
 
   /// @returns the StructInfo for the structure `str`, building it if it hasn't
   /// been constructed already. If an error is raised, nullptr is returned.
@@ -291,7 +291,7 @@
   /// @param expr the expression
   type::Type* TypeOf(ast::Expression* expr);
 
-  /// Creates a semantic::Expression node with the resolved type `type`, and
+  /// Creates a sem::Expression node with the resolved type `type`, and
   /// assigns this semantic node to the expression `expr`.
   /// @param expr the expression
   /// @param type the resolved type
@@ -325,7 +325,7 @@
   std::unordered_map<type::Struct*, StructInfo*> struct_info_;
   std::unordered_map<type::Type*, type::Type*> type_to_canonical_;
   FunctionInfo* current_function_ = nullptr;
-  semantic::Statement* current_statement_ = nullptr;
+  sem::Statement* current_statement_ = nullptr;
   BlockAllocator<VariableInfo> variable_infos_;
   BlockAllocator<FunctionInfo> function_infos_;
   BlockAllocator<StructInfo> struct_infos_;
diff --git a/src/resolver/resolver_test.cc b/src/resolver/resolver_test.cc
index fba46ed..f54ffb1 100644
--- a/src/resolver/resolver_test.cc
+++ b/src/resolver/resolver_test.cc
@@ -31,11 +31,11 @@
 #include "src/ast/unary_op_expression.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/call.h"
-#include "src/semantic/function.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/variable.h"
+#include "src/sem/call.h"
+#include "src/sem/function.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/type/sampled_texture_type.h"
 
@@ -902,10 +902,10 @@
 
   auto* ptr = TypeOf(mem)->As<type::Pointer>();
   EXPECT_TRUE(ptr->type()->Is<type::F32>());
-  ASSERT_TRUE(Sem().Get(mem)->Is<semantic::StructMemberAccess>());
+  ASSERT_TRUE(Sem().Get(mem)->Is<sem::StructMemberAccess>());
   EXPECT_EQ(Sem()
                 .Get(mem)
-                ->As<semantic::StructMemberAccess>()
+                ->As<sem::StructMemberAccess>()
                 ->Member()
                 ->Declaration()
                 ->symbol(),
@@ -932,7 +932,7 @@
 
   auto* ptr = TypeOf(mem)->As<type::Pointer>();
   EXPECT_TRUE(ptr->type()->Is<type::F32>());
-  ASSERT_TRUE(Sem().Get(mem)->Is<semantic::StructMemberAccess>());
+  ASSERT_TRUE(Sem().Get(mem)->Is<sem::StructMemberAccess>());
 }
 
 TEST_F(ResolverTest, Expr_MemberAccessor_VectorSwizzle) {
@@ -947,8 +947,8 @@
   ASSERT_TRUE(TypeOf(mem)->Is<type::Vector>());
   EXPECT_TRUE(TypeOf(mem)->As<type::Vector>()->type()->Is<type::F32>());
   EXPECT_EQ(TypeOf(mem)->As<type::Vector>()->size(), 4u);
-  ASSERT_TRUE(Sem().Get(mem)->Is<semantic::Swizzle>());
-  EXPECT_THAT(Sem().Get(mem)->As<semantic::Swizzle>()->Indices(),
+  ASSERT_TRUE(Sem().Get(mem)->Is<sem::Swizzle>());
+  EXPECT_THAT(Sem().Get(mem)->As<sem::Swizzle>()->Indices(),
               ElementsAre(0, 2, 1, 3));
 }
 
@@ -965,9 +965,8 @@
 
   auto* ptr = TypeOf(mem)->As<type::Pointer>();
   ASSERT_TRUE(ptr->type()->Is<type::F32>());
-  ASSERT_TRUE(Sem().Get(mem)->Is<semantic::Swizzle>());
-  EXPECT_THAT(Sem().Get(mem)->As<semantic::Swizzle>()->Indices(),
-              ElementsAre(2));
+  ASSERT_TRUE(Sem().Get(mem)->Is<sem::Swizzle>());
+  EXPECT_THAT(Sem().Get(mem)->As<sem::Swizzle>()->Indices(), ElementsAre(2));
 }
 
 TEST_F(ResolverTest, Expr_Accessor_MultiLevel) {
@@ -1019,7 +1018,7 @@
   ASSERT_TRUE(TypeOf(mem)->Is<type::Vector>());
   EXPECT_TRUE(TypeOf(mem)->As<type::Vector>()->type()->Is<type::F32>());
   EXPECT_EQ(TypeOf(mem)->As<type::Vector>()->size(), 2u);
-  ASSERT_TRUE(Sem().Get(mem)->Is<semantic::Swizzle>());
+  ASSERT_TRUE(Sem().Get(mem)->Is<sem::Swizzle>());
 }
 
 TEST_F(ResolverTest, Expr_MemberAccessor_InBinaryOp) {
diff --git a/src/resolver/resolver_test_helper.h b/src/resolver/resolver_test_helper.h
index 3ac82f7..b39f975 100644
--- a/src/resolver/resolver_test_helper.h
+++ b/src/resolver/resolver_test_helper.h
@@ -21,9 +21,9 @@
 #include "gtest/gtest.h"
 #include "src/program_builder.h"
 #include "src/resolver/resolver.h"
-#include "src/semantic/expression.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/variable.h"
+#include "src/sem/expression.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
 
 namespace tint {
 namespace resolver {
@@ -69,12 +69,11 @@
 
   /// Returns the semantic variable for the given identifier expression.
   /// @param expr the identifier expression
-  /// @return the resolved semantic::Variable of the identifier, or nullptr if
+  /// @return the resolved sem::Variable of the identifier, or nullptr if
   /// the expression did not resolve to a variable.
-  const semantic::Variable* VarOf(ast::Expression* expr) {
+  const sem::Variable* VarOf(ast::Expression* expr) {
     auto* sem_ident = Sem().Get(expr);
-    auto* var_user =
-        sem_ident ? sem_ident->As<semantic::VariableUser>() : nullptr;
+    auto* var_user = sem_ident ? sem_ident->As<sem::VariableUser>() : nullptr;
     return var_user ? var_user->Variable() : nullptr;
   }
 
diff --git a/src/resolver/storage_class_validation_test.cc b/src/resolver/storage_class_validation_test.cc
index 0fde1a1..5f9324e 100644
--- a/src/resolver/storage_class_validation_test.cc
+++ b/src/resolver/storage_class_validation_test.cc
@@ -16,7 +16,7 @@
 
 #include "gmock/gmock.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/struct.h"
+#include "src/sem/struct.h"
 #include "src/type/access_control_type.h"
 
 namespace tint {
diff --git a/src/resolver/struct_layout_test.cc b/src/resolver/struct_layout_test.cc
index 6b29a88..6cf4851 100644
--- a/src/resolver/struct_layout_test.cc
+++ b/src/resolver/struct_layout_test.cc
@@ -17,7 +17,7 @@
 #include "gmock/gmock.h"
 #include "src/ast/struct_block_decoration.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/struct.h"
+#include "src/sem/struct.h"
 
 namespace tint {
 namespace resolver {
diff --git a/src/resolver/struct_pipeline_stage_use_test.cc b/src/resolver/struct_pipeline_stage_use_test.cc
index d4c6153..44572df 100644
--- a/src/resolver/struct_pipeline_stage_use_test.cc
+++ b/src/resolver/struct_pipeline_stage_use_test.cc
@@ -17,7 +17,7 @@
 #include "gmock/gmock.h"
 #include "src/ast/stage_decoration.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/struct.h"
+#include "src/sem/struct.h"
 
 using ::testing::UnorderedElementsAre;
 
@@ -76,7 +76,7 @@
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
   EXPECT_THAT(sem->PipelineStageUses(),
-              UnorderedElementsAre(semantic::PipelineStageUsage::kVertexInput));
+              UnorderedElementsAre(sem::PipelineStageUsage::kVertexInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsVertexShaderReturnType) {
@@ -90,9 +90,8 @@
 
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
-  EXPECT_THAT(
-      sem->PipelineStageUses(),
-      UnorderedElementsAre(semantic::PipelineStageUsage::kVertexOutput));
+  EXPECT_THAT(sem->PipelineStageUses(),
+              UnorderedElementsAre(sem::PipelineStageUsage::kVertexOutput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsFragmentShaderParam) {
@@ -106,9 +105,8 @@
 
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
-  EXPECT_THAT(
-      sem->PipelineStageUses(),
-      UnorderedElementsAre(semantic::PipelineStageUsage::kFragmentInput));
+  EXPECT_THAT(sem->PipelineStageUses(),
+              UnorderedElementsAre(sem::PipelineStageUsage::kFragmentInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsFragmentShaderReturnType) {
@@ -122,9 +120,8 @@
 
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
-  EXPECT_THAT(
-      sem->PipelineStageUses(),
-      UnorderedElementsAre(semantic::PipelineStageUsage::kFragmentOutput));
+  EXPECT_THAT(sem->PipelineStageUses(),
+              UnorderedElementsAre(sem::PipelineStageUsage::kFragmentOutput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsComputeShaderParam) {
@@ -139,9 +136,8 @@
 
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
-  EXPECT_THAT(
-      sem->PipelineStageUses(),
-      UnorderedElementsAre(semantic::PipelineStageUsage::kComputeInput));
+  EXPECT_THAT(sem->PipelineStageUses(),
+              UnorderedElementsAre(sem::PipelineStageUsage::kComputeInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedMultipleStages) {
@@ -158,11 +154,10 @@
 
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
-  EXPECT_THAT(
-      sem->PipelineStageUses(),
-      UnorderedElementsAre(semantic::PipelineStageUsage::kVertexInput,
-                           semantic::PipelineStageUsage::kVertexOutput,
-                           semantic::PipelineStageUsage::kFragmentInput));
+  EXPECT_THAT(sem->PipelineStageUses(),
+              UnorderedElementsAre(sem::PipelineStageUsage::kVertexInput,
+                                   sem::PipelineStageUsage::kVertexOutput,
+                                   sem::PipelineStageUsage::kFragmentInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsShaderParamViaAlias) {
@@ -177,9 +172,8 @@
 
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
-  EXPECT_THAT(
-      sem->PipelineStageUses(),
-      UnorderedElementsAre(semantic::PipelineStageUsage::kFragmentInput));
+  EXPECT_THAT(sem->PipelineStageUses(),
+              UnorderedElementsAre(sem::PipelineStageUsage::kFragmentInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsShaderReturnTypeViaAlias) {
@@ -194,9 +188,8 @@
 
   auto* sem = Sem().Get(s);
   ASSERT_NE(sem, nullptr);
-  EXPECT_THAT(
-      sem->PipelineStageUses(),
-      UnorderedElementsAre(semantic::PipelineStageUsage::kFragmentOutput));
+  EXPECT_THAT(sem->PipelineStageUses(),
+              UnorderedElementsAre(sem::PipelineStageUsage::kFragmentOutput));
 }
 
 }  // namespace
diff --git a/src/resolver/struct_storage_class_use_test.cc b/src/resolver/struct_storage_class_use_test.cc
index 80a1f4d..0521200 100644
--- a/src/resolver/struct_storage_class_use_test.cc
+++ b/src/resolver/struct_storage_class_use_test.cc
@@ -16,7 +16,7 @@
 
 #include "gmock/gmock.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/struct.h"
+#include "src/sem/struct.h"
 
 using ::testing::UnorderedElementsAre;
 
diff --git a/src/resolver/validation_test.cc b/src/resolver/validation_test.cc
index bc27e2a..ab1c622 100644
--- a/src/resolver/validation_test.cc
+++ b/src/resolver/validation_test.cc
@@ -29,11 +29,11 @@
 #include "src/ast/unary_op_expression.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/resolver/resolver_test_helper.h"
-#include "src/semantic/call.h"
-#include "src/semantic/function.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/variable.h"
+#include "src/sem/call.h"
+#include "src/sem/function.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/type/sampled_texture_type.h"
 
@@ -51,7 +51,7 @@
   FakeStmt(ProgramID program_id, Source source)
       : ast::Statement(program_id, source) {}
   FakeStmt* Clone(CloneContext*) const override { return nullptr; }
-  void to_str(const semantic::Info&, std::ostream& out, size_t) const override {
+  void to_str(const sem::Info&, std::ostream& out, size_t) const override {
     out << "Fake";
   }
 };
@@ -61,7 +61,7 @@
   FakeExpr(ProgramID program_id, Source source)
       : ast::Expression(program_id, source) {}
   FakeExpr* Clone(CloneContext*) const override { return nullptr; }
-  void to_str(const semantic::Info&, std::ostream&, size_t) const override {}
+  void to_str(const sem::Info&, std::ostream&, size_t) const override {}
 };
 
 TEST_F(ResolverValidationTest, Error_WithEmptySource) {
diff --git a/src/semantic/array.h b/src/sem/array.h
similarity index 92%
rename from src/semantic/array.h
rename to src/sem/array.h
index c620d49..e2c98d6 100644
--- a/src/semantic/array.h
+++ b/src/sem/array.h
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_ARRAY_H_
-#define SRC_SEMANTIC_ARRAY_H_
+#ifndef SRC_SEM_ARRAY_H_
+#define SRC_SEM_ARRAY_H_
 
 #include <stdint.h>
 
-#include "src/semantic/node.h"
+#include "src/sem/node.h"
 
 namespace tint {
 
@@ -26,7 +26,7 @@
 class Array;
 }  // namespace type
 
-namespace semantic {
+namespace sem {
 
 /// Array holds the semantic information for Array nodes.
 class Array : public Castable<Array, Node> {
@@ -63,7 +63,7 @@
   uint32_t const stride_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_ARRAY_H_
+#endif  // SRC_SEM_ARRAY_H_
diff --git a/src/semantic/call.h b/src/sem/call.h
similarity index 85%
rename from src/semantic/call.h
rename to src/sem/call.h
index 8ea4dc1..a3e3da7 100644
--- a/src/semantic/call.h
+++ b/src/sem/call.h
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_CALL_H_
-#define SRC_SEMANTIC_CALL_H_
+#ifndef SRC_SEM_CALL_H_
+#define SRC_SEM_CALL_H_
 
-#include "src/semantic/expression.h"
-#include "src/semantic/intrinsic.h"
+#include "src/sem/expression.h"
+#include "src/sem/intrinsic.h"
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 /// Call is the base class for semantic nodes that hold semantic information for
 /// ast::CallExpression nodes.
@@ -43,7 +43,7 @@
   CallTarget const* const target_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_CALL_H_
+#endif  // SRC_SEM_CALL_H_
diff --git a/src/semantic/call_target.h b/src/sem/call_target.h
similarity index 93%
rename from src/semantic/call_target.h
rename to src/sem/call_target.h
index 1683473..e0085d4 100644
--- a/src/semantic/call_target.h
+++ b/src/sem/call_target.h
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_CALL_TARGET_H_
-#define SRC_SEMANTIC_CALL_TARGET_H_
+#ifndef SRC_SEM_CALL_TARGET_H_
+#define SRC_SEM_CALL_TARGET_H_
 
 #include <vector>
 
-#include "src/semantic/node.h"
+#include "src/sem/node.h"
 #include "src/type/sampler_type.h"
 
 namespace tint {
@@ -27,7 +27,7 @@
 class Type;
 }  // namespace type
 
-namespace semantic {
+namespace sem {
 
 /// Parameter describes a single parameter of a call target
 struct Parameter {
@@ -96,7 +96,7 @@
   ParameterList const parameters_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_CALL_TARGET_H_
+#endif  // SRC_SEM_CALL_TARGET_H_
diff --git a/src/semantic/expression.h b/src/sem/expression.h
similarity index 86%
rename from src/semantic/expression.h
rename to src/sem/expression.h
index e361658..507699e 100644
--- a/src/semantic/expression.h
+++ b/src/sem/expression.h
@@ -12,23 +12,23 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_EXPRESSION_H_
-#define SRC_SEMANTIC_EXPRESSION_H_
+#ifndef SRC_SEM_EXPRESSION_H_
+#define SRC_SEM_EXPRESSION_H_
 
 #include "src/ast/expression.h"
-#include "src/semantic/node.h"
+#include "src/sem/node.h"
 
 namespace tint {
 
 // Forward declarations
-namespace semantic {
+namespace sem {
 class Statement;
-}  // namespace semantic
+}  // namespace sem
 namespace type {
 class Type;
 }  // namespace type
 
-namespace semantic {
+namespace sem {
 
 /// Expression holds the semantic information for expression nodes.
 class Expression : public Castable<Expression, Node> {
@@ -56,7 +56,7 @@
   Statement* const statement_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_EXPRESSION_H_
+#endif  // SRC_SEM_EXPRESSION_H_
diff --git a/src/semantic/function.h b/src/sem/function.h
similarity index 96%
rename from src/semantic/function.h
rename to src/sem/function.h
index d3ee7cd..9483f94 100644
--- a/src/semantic/function.h
+++ b/src/sem/function.h
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_FUNCTION_H_
-#define SRC_SEMANTIC_FUNCTION_H_
+#ifndef SRC_SEM_FUNCTION_H_
+#define SRC_SEM_FUNCTION_H_
 
 #include <utility>
 #include <vector>
 
 #include "src/ast/variable.h"
-#include "src/semantic/call_target.h"
+#include "src/sem/call_target.h"
 
 namespace tint {
 
@@ -33,7 +33,7 @@
 class ReturnStatement;
 }  // namespace ast
 
-namespace semantic {
+namespace sem {
 
 class Variable;
 
@@ -154,7 +154,7 @@
   std::vector<Symbol> const ancestor_entry_points_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_FUNCTION_H_
+#endif  // SRC_SEM_FUNCTION_H_
diff --git a/src/semantic/info.h b/src/sem/info.h
similarity index 89%
rename from src/semantic/info.h
rename to src/sem/info.h
index b058ff3..412e3ef 100644
--- a/src/semantic/info.h
+++ b/src/sem/info.h
@@ -12,17 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_INFO_H_
-#define SRC_SEMANTIC_INFO_H_
+#ifndef SRC_SEM_INFO_H_
+#define SRC_SEM_INFO_H_
 
 #include <unordered_map>
 
 #include "src/debug.h"
-#include "src/semantic/node.h"
-#include "src/semantic/type_mappings.h"
+#include "src/sem/node.h"
+#include "src/sem/type_mappings.h"
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 /// Info holds all the resolved semantic information for a Program.
 class Info {
@@ -80,10 +80,10 @@
   }
 
  private:
-  std::unordered_map<const CastableBase*, const semantic::Node*> map;
+  std::unordered_map<const CastableBase*, const sem::Node*> map;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_INFO_H_
+#endif  // SRC_SEM_INFO_H_
diff --git a/src/semantic/intrinsic.h b/src/sem/intrinsic.h
similarity index 96%
rename from src/semantic/intrinsic.h
rename to src/sem/intrinsic.h
index b1bd113..b8fe7cb 100644
--- a/src/semantic/intrinsic.h
+++ b/src/sem/intrinsic.h
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_INTRINSIC_H_
-#define SRC_SEMANTIC_INTRINSIC_H_
+#ifndef SRC_SEM_INTRINSIC_H_
+#define SRC_SEM_INTRINSIC_H_
 
 #include <string>
 
-#include "src/semantic/call_target.h"
+#include "src/sem/call_target.h"
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 enum class IntrinsicType {
   kNone = -1,
@@ -222,7 +222,7 @@
 /// matches the name in the WGSL spec.
 std::ostream& operator<<(std::ostream& out, IntrinsicType i);
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_INTRINSIC_H_
+#endif  // SRC_SEM_INTRINSIC_H_
diff --git a/src/semantic/member_accessor_expression.h b/src/sem/member_accessor_expression.h
similarity index 92%
rename from src/semantic/member_accessor_expression.h
rename to src/sem/member_accessor_expression.h
index 2f98821..1355445 100644
--- a/src/semantic/member_accessor_expression.h
+++ b/src/sem/member_accessor_expression.h
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_MEMBER_ACCESSOR_EXPRESSION_H_
-#define SRC_SEMANTIC_MEMBER_ACCESSOR_EXPRESSION_H_
+#ifndef SRC_SEM_MEMBER_ACCESSOR_EXPRESSION_H_
+#define SRC_SEM_MEMBER_ACCESSOR_EXPRESSION_H_
 
 #include <vector>
 
-#include "src/semantic/expression.h"
+#include "src/sem/expression.h"
 
 namespace tint {
 
@@ -26,7 +26,7 @@
 class MemberAccessorExpression;
 }  // namespace ast
 
-namespace semantic {
+namespace sem {
 
 /// Forward declarations
 class Struct;
@@ -99,7 +99,7 @@
   std::vector<uint32_t> const indices_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_MEMBER_ACCESSOR_EXPRESSION_H_
+#endif  // SRC_SEM_MEMBER_ACCESSOR_EXPRESSION_H_
diff --git a/src/semantic/node.h b/src/sem/node.h
similarity index 85%
rename from src/semantic/node.h
rename to src/sem/node.h
index 587fbe7..7fde0a3 100644
--- a/src/semantic/node.h
+++ b/src/sem/node.h
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_NODE_H_
-#define SRC_SEMANTIC_NODE_H_
+#ifndef SRC_SEM_NODE_H_
+#define SRC_SEM_NODE_H_
 
 #include "src/castable.h"
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 /// Node is the base class for all semantic nodes
 class Node : public Castable<Node> {
@@ -27,7 +27,7 @@
   ~Node() override;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_NODE_H_
+#endif  // SRC_SEM_NODE_H_
diff --git a/src/semantic/sem_array.cc b/src/sem/sem_array.cc
similarity index 85%
rename from src/semantic/sem_array.cc
rename to src/sem/sem_array.cc
index c54a3fc..7dc6aa9 100644
--- a/src/semantic/sem_array.cc
+++ b/src/sem/sem_array.cc
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/array.h"
+#include "src/sem/array.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Array);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Array);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Array::Array(type::Array* type, uint32_t align, uint32_t size, uint32_t stride)
     : type_(type), align_(align), size_(size), stride_(stride) {}
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_call.cc b/src/sem/sem_call.cc
similarity index 86%
rename from src/semantic/sem_call.cc
rename to src/sem/sem_call.cc
index a39a036..baa4425 100644
--- a/src/semantic/sem_call.cc
+++ b/src/sem/sem_call.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/call.h"
+#include "src/sem/call.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Call);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Call);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Call::Call(ast::Expression* declaration,
            const CallTarget* target,
@@ -26,5 +26,5 @@
 
 Call::~Call() = default;
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_call_target.cc b/src/sem/sem_call_target.cc
similarity index 93%
rename from src/semantic/sem_call_target.cc
rename to src/sem/sem_call_target.cc
index 5f78a3e..b048f69 100644
--- a/src/semantic/sem_call_target.cc
+++ b/src/sem/sem_call_target.cc
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/call_target.h"
+#include "src/sem/call_target.h"
 
 #include "src/symbol_table.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::CallTarget);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::CallTarget);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 CallTarget::CallTarget(type::Type* return_type, const ParameterList& parameters)
     : return_type_(return_type), parameters_(parameters) {}
@@ -72,5 +72,5 @@
   return out;
 }
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_expression.cc b/src/sem/sem_expression.cc
similarity index 86%
rename from src/semantic/sem_expression.cc
rename to src/sem/sem_expression.cc
index 466781b..52c27c7 100644
--- a/src/semantic/sem_expression.cc
+++ b/src/sem/sem_expression.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/expression.h"
+#include "src/sem/expression.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Expression);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Expression);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Expression::Expression(ast::Expression* declaration,
                        type::Type* type,
@@ -26,5 +26,5 @@
       type_(type->UnwrapIfNeeded()),
       statement_(statement) {}
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_function.cc b/src/sem/sem_function.cc
similarity index 97%
rename from src/semantic/sem_function.cc
rename to src/sem/sem_function.cc
index 511f862..64c294e 100644
--- a/src/semantic/sem_function.cc
+++ b/src/sem/sem_function.cc
@@ -12,19 +12,19 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/function.h"
+#include "src/sem/function.h"
 
 #include "src/ast/function.h"
-#include "src/semantic/variable.h"
+#include "src/sem/variable.h"
 #include "src/type/depth_texture_type.h"
 #include "src/type/multisampled_texture_type.h"
 #include "src/type/sampled_texture_type.h"
 #include "src/type/storage_texture_type.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Function);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Function);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 namespace {
 
@@ -225,5 +225,5 @@
   return ret;
 }
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_info.cc b/src/sem/sem_info.cc
similarity index 90%
rename from src/semantic/sem_info.cc
rename to src/sem/sem_info.cc
index ddd3de5..e2bab98 100644
--- a/src/semantic/sem_info.cc
+++ b/src/sem/sem_info.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/info.h"
+#include "src/sem/info.h"
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Info::Info() = default;
 
@@ -25,5 +25,5 @@
 
 Info& Info::operator=(Info&&) = default;
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_intrinsic.cc b/src/sem/sem_intrinsic.cc
similarity index 98%
rename from src/semantic/sem_intrinsic.cc
rename to src/sem/sem_intrinsic.cc
index 0ff77a2..6b95a1a 100644
--- a/src/semantic/sem_intrinsic.cc
+++ b/src/sem/sem_intrinsic.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/intrinsic.h"
+#include "src/sem/intrinsic.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Intrinsic);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Intrinsic);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 std::ostream& operator<<(std::ostream& out, IntrinsicType i) {
   out << str(i);
@@ -25,7 +25,7 @@
 }
 
 const char* Intrinsic::str() const {
-  return semantic::str(type_);
+  return sem::str(type_);
 }
 
 /// Name matches the spelling in the WGSL spec including case.
@@ -237,5 +237,5 @@
   return IsBarrierIntrinsic(type_);
 }
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_intrinsic_test.cc b/src/sem/sem_intrinsic_test.cc
similarity index 98%
rename from src/semantic/sem_intrinsic_test.cc
rename to src/sem/sem_intrinsic_test.cc
index 227b29b..e35ea5a 100644
--- a/src/semantic/sem_intrinsic_test.cc
+++ b/src/sem/sem_intrinsic_test.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/intrinsic.h"
+#include "src/sem/intrinsic.h"
 
 #include "gtest/gtest.h"
 
 namespace tint {
-namespace semantic {
+namespace sem {
 namespace {
 
 struct IntrinsicData {
@@ -126,5 +126,5 @@
 }
 
 }  // namespace
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_member_accessor_expression.cc b/src/sem/sem_member_accessor_expression.cc
similarity index 84%
rename from src/semantic/sem_member_accessor_expression.cc
rename to src/sem/sem_member_accessor_expression.cc
index d0d4968..d030774 100644
--- a/src/semantic/sem_member_accessor_expression.cc
+++ b/src/sem/sem_member_accessor_expression.cc
@@ -13,14 +13,14 @@
 // limitations under the License.
 
 #include "src/ast/member_accessor_expression.h"
-#include "src/semantic/member_accessor_expression.h"
+#include "src/sem/member_accessor_expression.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::MemberAccessorExpression);
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::StructMemberAccess);
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Swizzle);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::MemberAccessorExpression);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::StructMemberAccess);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Swizzle);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 MemberAccessorExpression::MemberAccessorExpression(
     ast::MemberAccessorExpression* declaration,
@@ -47,5 +47,5 @@
 
 Swizzle::~Swizzle() = default;
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_node.cc b/src/sem/sem_node.cc
similarity index 83%
rename from src/semantic/sem_node.cc
rename to src/sem/sem_node.cc
index 82e570d..a10ebcb 100644
--- a/src/semantic/sem_node.cc
+++ b/src/sem/sem_node.cc
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/node.h"
+#include "src/sem/node.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Node);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Node);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Node::~Node() = default;
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_statement.cc b/src/sem/sem_statement.cc
similarity index 88%
rename from src/semantic/sem_statement.cc
rename to src/sem/sem_statement.cc
index 811842f..32c88b1 100644
--- a/src/semantic/sem_statement.cc
+++ b/src/sem/sem_statement.cc
@@ -16,12 +16,12 @@
 
 #include "src/ast/block_statement.h"
 #include "src/debug.h"
-#include "src/semantic/statement.h"
+#include "src/sem/statement.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Statement);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Statement);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Statement::Statement(const ast::Statement* declaration,
                      const ast::BlockStatement* block)
@@ -35,5 +35,5 @@
 #endif  //  NDEBUG
 }
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_struct.cc b/src/sem/sem_struct.cc
similarity index 90%
rename from src/semantic/sem_struct.cc
rename to src/sem/sem_struct.cc
index d715863..3bd32f6 100644
--- a/src/semantic/sem_struct.cc
+++ b/src/sem/sem_struct.cc
@@ -13,13 +13,13 @@
 // limitations under the License.
 
 #include "src/ast/struct_member.h"
-#include "src/semantic/struct.h"
+#include "src/sem/struct.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Struct);
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::StructMember);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Struct);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::StructMember);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Struct::Struct(type::Struct* type,
                StructMemberList members,
@@ -55,5 +55,5 @@
 
 StructMember::~StructMember() = default;
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/sem_variable.cc b/src/sem/sem_variable.cc
similarity index 83%
rename from src/semantic/sem_variable.cc
rename to src/sem/sem_variable.cc
index c345154..88d951e 100644
--- a/src/semantic/sem_variable.cc
+++ b/src/sem/sem_variable.cc
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/variable.h"
+#include "src/sem/variable.h"
 
 #include "src/ast/identifier_expression.h"
 #include "src/ast/variable.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::Variable);
-TINT_INSTANTIATE_TYPEINFO(tint::semantic::VariableUser);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::Variable);
+TINT_INSTANTIATE_TYPEINFO(tint::sem::VariableUser);
 
 namespace tint {
-namespace semantic {
+namespace sem {
 
 Variable::Variable(const ast::Variable* declaration,
                    type::Type* type,
@@ -37,8 +37,8 @@
 VariableUser::VariableUser(ast::IdentifierExpression* declaration,
                            type::Type* type,
                            Statement* statement,
-                           semantic::Variable* variable)
+                           sem::Variable* variable)
     : Base(declaration, type, statement), variable_(variable) {}
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
diff --git a/src/semantic/statement.h b/src/sem/statement.h
similarity index 88%
rename from src/semantic/statement.h
rename to src/sem/statement.h
index ea4d534..251690c 100644
--- a/src/semantic/statement.h
+++ b/src/sem/statement.h
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_STATEMENT_H_
-#define SRC_SEMANTIC_STATEMENT_H_
+#ifndef SRC_SEM_STATEMENT_H_
+#define SRC_SEM_STATEMENT_H_
 
-#include "src/semantic/node.h"
+#include "src/sem/node.h"
 
 namespace tint {
 
@@ -25,7 +25,7 @@
 class Statement;
 }  // namespace ast
 
-namespace semantic {
+namespace sem {
 
 /// Statement holds the semantic information for a statement.
 class Statement : public Castable<Statement, Node> {
@@ -47,7 +47,7 @@
   ast::BlockStatement const* const block_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_STATEMENT_H_
+#endif  // SRC_SEM_STATEMENT_H_
diff --git a/src/semantic/struct.h b/src/sem/struct.h
similarity index 96%
rename from src/semantic/struct.h
rename to src/sem/struct.h
index 4400f64..695303d 100644
--- a/src/semantic/struct.h
+++ b/src/sem/struct.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_STRUCT_H_
-#define SRC_SEMANTIC_STRUCT_H_
+#ifndef SRC_SEM_STRUCT_H_
+#define SRC_SEM_STRUCT_H_
 
 #include <stdint.h>
 
@@ -21,7 +21,7 @@
 #include <vector>
 
 #include "src/ast/storage_class.h"
-#include "src/semantic/node.h"
+#include "src/sem/node.h"
 
 namespace tint {
 
@@ -33,7 +33,7 @@
 class Struct;
 }  // namespace type
 
-namespace semantic {
+namespace sem {
 
 class StructMember;
 
@@ -171,7 +171,7 @@
   uint32_t const size_;    // Byte size of the member
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_STRUCT_H_
+#endif  // SRC_SEM_STRUCT_H_
diff --git a/src/semantic/type_mappings.h b/src/sem/type_mappings.h
similarity index 76%
rename from src/semantic/type_mappings.h
rename to src/sem/type_mappings.h
index 47fdfe9..2787bbe 100644
--- a/src/semantic/type_mappings.h
+++ b/src/sem/type_mappings.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_TYPE_MAPPINGS_H_
-#define SRC_SEMANTIC_TYPE_MAPPINGS_H_
+#ifndef SRC_SEM_TYPE_MAPPINGS_H_
+#define SRC_SEM_TYPE_MAPPINGS_H_
 
 #include <type_traits>
 
@@ -34,7 +34,7 @@
 class Struct;
 }  // namespace type
 
-namespace semantic {
+namespace sem {
 
 // Forward declarations
 class Array;
@@ -47,10 +47,10 @@
 class StructMember;
 class Variable;
 
-/// TypeMappings is a struct that holds dummy `operator()` methods that's used
-/// by SemanticNodeTypeFor to map AST / type node types to their corresponding
-/// semantic node types. The standard operator overload resolving rules will be
-/// used to infer the return type based on the argument type.
+/// TypeMappings is a struct that holds undefined `operator()` methods that's
+/// used by SemanticNodeTypeFor to map AST / type node types to their
+/// corresponding semantic node types. The standard operator overload resolving
+/// rules will be used to infer the return type based on the argument type.
 struct TypeMappings {
   //! @cond Doxygen_Suppress
   Array* operator()(type::Array*);
@@ -65,13 +65,13 @@
   //! @endcond
 };
 
-/// SemanticNodeTypeFor resolves to the appropriate semantic::Node type for the
+/// SemanticNodeTypeFor resolves to the appropriate sem::Node type for the
 /// AST or type node `AST_OR_TYPE`.
 template <typename AST_OR_TYPE>
 using SemanticNodeTypeFor = typename std::remove_pointer<decltype(
     TypeMappings()(std::declval<AST_OR_TYPE*>()))>::type;
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_TYPE_MAPPINGS_H_
+#endif  // SRC_SEM_TYPE_MAPPINGS_H_
diff --git a/src/semantic/variable.h b/src/sem/variable.h
similarity index 88%
rename from src/semantic/variable.h
rename to src/sem/variable.h
index 9873176..056d5b6 100644
--- a/src/semantic/variable.h
+++ b/src/sem/variable.h
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_SEMANTIC_VARIABLE_H_
-#define SRC_SEMANTIC_VARIABLE_H_
+#ifndef SRC_SEM_VARIABLE_H_
+#define SRC_SEM_VARIABLE_H_
 
 #include <vector>
 
 #include "src/ast/storage_class.h"
-#include "src/semantic/expression.h"
+#include "src/sem/expression.h"
 
 namespace tint {
 
@@ -31,7 +31,7 @@
 class Type;
 }  // namespace type
 
-namespace semantic {
+namespace sem {
 
 class VariableUser;
 
@@ -86,16 +86,16 @@
   VariableUser(ast::IdentifierExpression* declaration,
                type::Type* type,
                Statement* statement,
-               semantic::Variable* variable);
+               sem::Variable* variable);
 
   /// @returns the variable that this expression refers to
-  const semantic::Variable* Variable() const { return variable_; }
+  const sem::Variable* Variable() const { return variable_; }
 
  private:
-  semantic::Variable const* const variable_;
+  sem::Variable const* const variable_;
 };
 
-}  // namespace semantic
+}  // namespace sem
 }  // namespace tint
 
-#endif  // SRC_SEMANTIC_VARIABLE_H_
+#endif  // SRC_SEM_VARIABLE_H_
diff --git a/src/transform/binding_remapper.cc b/src/transform/binding_remapper.cc
index 8cc1f9c..af4b2ac 100644
--- a/src/transform/binding_remapper.cc
+++ b/src/transform/binding_remapper.cc
@@ -17,7 +17,7 @@
 #include <utility>
 
 #include "src/program_builder.h"
-#include "src/semantic/variable.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::transform::BindingRemapper::Remappings);
diff --git a/src/transform/bound_array_accessors.cc b/src/transform/bound_array_accessors.cc
index e66866d..4f5692f 100644
--- a/src/transform/bound_array_accessors.cc
+++ b/src/transform/bound_array_accessors.cc
@@ -18,7 +18,7 @@
 #include <utility>
 
 #include "src/program_builder.h"
-#include "src/semantic/expression.h"
+#include "src/sem/expression.h"
 
 namespace tint {
 namespace transform {
diff --git a/src/transform/calculate_array_length.cc b/src/transform/calculate_array_length.cc
index 3d37e86..ae1d054 100644
--- a/src/transform/calculate_array_length.cc
+++ b/src/transform/calculate_array_length.cc
@@ -19,10 +19,10 @@
 
 #include "src/ast/call_statement.h"
 #include "src/program_builder.h"
-#include "src/semantic/call.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/call.h"
+#include "src/sem/statement.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/utils/get_or_create.h"
 #include "src/utils/hash.h"
 
@@ -38,7 +38,7 @@
 /// It is used as a key by the array_length_by_usage map.
 struct ArrayUsage {
   ast::BlockStatement const* const block;
-  semantic::Node const* const buffer;
+  sem::Node const* const buffer;
   bool operator==(const ArrayUsage& rhs) const {
     return block == rhs.block && buffer == rhs.buffer;
   }
@@ -110,8 +110,8 @@
   for (auto* node : ctx.src->ASTNodes().Objects()) {
     if (auto* call_expr = node->As<ast::CallExpression>()) {
       auto* call = sem.Get(call_expr);
-      if (auto* intrinsic = call->Target()->As<semantic::Intrinsic>()) {
-        if (intrinsic->Type() == semantic::IntrinsicType::kArrayLength) {
+      if (auto* intrinsic = call->Target()->As<sem::Intrinsic>()) {
+        if (intrinsic->Type() == sem::IntrinsicType::kArrayLength) {
           // We're dealing with an arrayLength() call
 
           // https://gpuweb.github.io/gpuweb/wgsl.html#array-types states:
@@ -163,8 +163,8 @@
           // true) then key the array_length from the variable. If not, key off
           // the expression semantic node, which will be unique per call to
           // arrayLength().
-          const semantic::Node* storage_buffer_usage = storage_buffer_sem;
-          if (auto* user = storage_buffer_sem->As<semantic::VariableUser>()) {
+          const sem::Node* storage_buffer_usage = storage_buffer_sem;
+          if (auto* user = storage_buffer_sem->As<sem::VariableUser>()) {
             storage_buffer_usage = user->Variable();
           }
 
diff --git a/src/transform/canonicalize_entry_point_io.cc b/src/transform/canonicalize_entry_point_io.cc
index 06bb158..27d5c81 100644
--- a/src/transform/canonicalize_entry_point_io.cc
+++ b/src/transform/canonicalize_entry_point_io.cc
@@ -18,9 +18,9 @@
 #include <utility>
 
 #include "src/program_builder.h"
-#include "src/semantic/function.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/variable.h"
+#include "src/sem/function.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
 
 namespace tint {
 namespace transform {
diff --git a/src/transform/decompose_storage_access.cc b/src/transform/decompose_storage_access.cc
index a5c9e09..fb77b55 100644
--- a/src/transform/decompose_storage_access.cc
+++ b/src/transform/decompose_storage_access.cc
@@ -24,11 +24,11 @@
 #include "src/ast/call_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/program_builder.h"
-#include "src/semantic/array.h"
-#include "src/semantic/call.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/array.h"
+#include "src/sem/call.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/utils/get_or_create.h"
 #include "src/utils/hash.h"
@@ -356,7 +356,7 @@
 
 /// StorageBufferAccess describes a single storage buffer access
 struct StorageBufferAccess {
-  semantic::Expression const* var = nullptr;  // Storage buffer variable
+  sem::Expression const* var = nullptr;       // Storage buffer variable
   std::unique_ptr<Offset> offset;             // The byte offset on var
   type::Type* type = nullptr;                 // The type of the access
   operator bool() const { return var; }       // Returns true if valid
@@ -628,7 +628,7 @@
     if (auto* ident = node->As<ast::IdentifierExpression>()) {
       // X
       auto* expr = sem.Get(ident);
-      if (auto* var = expr->As<semantic::VariableUser>()) {
+      if (auto* var = expr->As<sem::VariableUser>()) {
         if (var->Variable()->StorageClass() == ast::StorageClass::kStorage) {
           // Variable to a storage buffer
           state.AddAccesss(ident, {
@@ -644,7 +644,7 @@
     if (auto* accessor = node->As<ast::MemberAccessorExpression>()) {
       // X.Y
       auto* accessor_sem = sem.Get(accessor);
-      if (auto* swizzle = accessor_sem->As<semantic::Swizzle>()) {
+      if (auto* swizzle = accessor_sem->As<sem::Swizzle>()) {
         if (swizzle->Indices().size() == 1) {
           if (auto access = state.TakeAccess(accessor->structure())) {
             auto* vec_ty = access.type->As<type::Vector>();
@@ -724,8 +724,8 @@
 
     if (auto* call_expr = node->As<ast::CallExpression>()) {
       auto* call = sem.Get(call_expr);
-      if (auto* intrinsic = call->Target()->As<semantic::Intrinsic>()) {
-        if (intrinsic->Type() == semantic::IntrinsicType::kArrayLength) {
+      if (auto* intrinsic = call->Target()->As<sem::Intrinsic>()) {
+        if (intrinsic->Type() == sem::IntrinsicType::kArrayLength) {
           // arrayLength(X)
           // Don't convert X into a load, this actually requires the real
           // reference.
diff --git a/src/transform/first_index_offset.cc b/src/transform/first_index_offset.cc
index 7a96995..2ee4e1e 100644
--- a/src/transform/first_index_offset.cc
+++ b/src/transform/first_index_offset.cc
@@ -20,10 +20,10 @@
 
 #include "src/ast/struct_block_decoration.h"
 #include "src/program_builder.h"
-#include "src/semantic/function.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/function.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::transform::FirstIndexOffset::BindingPoint);
 TINT_INSTANTIATE_TYPEINFO(tint::transform::FirstIndexOffset::Data);
@@ -73,9 +73,8 @@
   CloneContext ctx(&out, in);
 
   // Map of builtin usages
-  std::unordered_map<const semantic::Variable*, const char*> builtin_vars;
-  std::unordered_map<const semantic::StructMember*, const char*>
-      builtin_members;
+  std::unordered_map<const sem::Variable*, const char*> builtin_vars;
+  std::unordered_map<const sem::StructMember*, const char*> builtin_members;
 
   bool has_vertex_index = false;
   bool has_instance_index = false;
@@ -153,14 +152,14 @@
     // Fix up all references to the builtins with the offsets
     ctx.ReplaceAll([=, &ctx](ast::Expression* expr) -> ast::Expression* {
       auto* sem = ctx.src->Sem().Get(expr);
-      if (auto* user = sem->As<semantic::VariableUser>()) {
+      if (auto* user = sem->As<sem::VariableUser>()) {
         auto it = builtin_vars.find(user->Variable());
         if (it != builtin_vars.end()) {
           return ctx.dst->Add(ctx.CloneWithoutTransform(expr),
                               ctx.dst->MemberAccessor(buffer_name, it->second));
         }
       }
-      if (auto* access = sem->As<semantic::StructMemberAccess>()) {
+      if (auto* access = sem->As<sem::StructMemberAccess>()) {
         auto it = builtin_members.find(access->Member());
         if (it != builtin_members.end()) {
           return ctx.dst->Add(ctx.CloneWithoutTransform(expr),
diff --git a/src/transform/hlsl.cc b/src/transform/hlsl.cc
index 5a5b6db..83d309e 100644
--- a/src/transform/hlsl.cc
+++ b/src/transform/hlsl.cc
@@ -19,9 +19,9 @@
 #include "src/ast/stage_decoration.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/program_builder.h"
-#include "src/semantic/expression.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/variable.h"
+#include "src/sem/expression.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
 #include "src/transform/calculate_array_length.h"
 #include "src/transform/canonicalize_entry_point_io.h"
 #include "src/transform/decompose_storage_access.h"
diff --git a/src/transform/renamer.cc b/src/transform/renamer.cc
index a5a6856..9eb2ecb 100644
--- a/src/transform/renamer.cc
+++ b/src/transform/renamer.cc
@@ -19,8 +19,8 @@
 #include <utility>
 
 #include "src/program_builder.h"
-#include "src/semantic/call.h"
-#include "src/semantic/member_accessor_expression.h"
+#include "src/sem/call.h"
+#include "src/sem/member_accessor_expression.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::transform::Renamer::Data);
 
@@ -861,7 +861,7 @@
             << "MemberAccessorExpression has no semantic info";
         continue;
       }
-      if (sem->Is<semantic::Swizzle>()) {
+      if (sem->Is<sem::Swizzle>()) {
         preserve.emplace(member->member());
       }
     } else if (auto* call = node->As<ast::CallExpression>()) {
@@ -870,7 +870,7 @@
         TINT_ICE(out.Diagnostics()) << "CallExpression has no semantic info";
         continue;
       }
-      if (sem->Target()->Is<semantic::Intrinsic>()) {
+      if (sem->Target()->Is<sem::Intrinsic>()) {
         preserve.emplace(call->func()->As<ast::IdentifierExpression>());
       }
     }
diff --git a/src/transform/spirv.cc b/src/transform/spirv.cc
index 1faad8f..411213d 100644
--- a/src/transform/spirv.cc
+++ b/src/transform/spirv.cc
@@ -21,9 +21,9 @@
 #include "src/ast/return_statement.h"
 #include "src/ast/stage_decoration.h"
 #include "src/program_builder.h"
-#include "src/semantic/function.h"
-#include "src/semantic/statement.h"
-#include "src/semantic/variable.h"
+#include "src/sem/function.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
 
 namespace tint {
 namespace transform {
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 7b5d1a2..973afe3 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -21,7 +21,7 @@
 #include "src/ast/struct_block_decoration.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/program_builder.h"
-#include "src/semantic/variable.h"
+#include "src/sem/variable.h"
 #include "src/utils/get_or_create.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::transform::VertexPulling::Config);
diff --git a/src/writer/append_vector.cc b/src/writer/append_vector.cc
index 97f645d..4e98d24 100644
--- a/src/writer/append_vector.cc
+++ b/src/writer/append_vector.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/semantic/expression.h"
+#include "src/sem/expression.h"
 
 namespace tint {
 namespace writer {
@@ -64,7 +64,7 @@
   if (packed_el_ty != b->Sem().Get(scalar)->Type()->UnwrapPtrIfNeeded()) {
     // Cast scalar to the vector element type
     auto* scalar_cast = b->Construct(packed_el_ty, scalar);
-    b->Sem().Add(scalar_cast, b->create<semantic::Expression>(
+    b->Sem().Add(scalar_cast, b->create<sem::Expression>(
                                   scalar_cast, packed_el_ty, statement));
     packed.emplace_back(scalar_cast);
   } else {
@@ -72,8 +72,8 @@
   }
 
   auto* constructor = b->Construct(packed_ty, std::move(packed));
-  b->Sem().Add(constructor, b->create<semantic::Expression>(
-                                constructor, packed_ty, statement));
+  b->Sem().Add(constructor,
+               b->create<sem::Expression>(constructor, packed_ty, statement));
 
   return constructor;
 }
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index b4445da..5550534 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -22,12 +22,12 @@
 #include "src/ast/fallthrough_statement.h"
 #include "src/ast/internal_decoration.h"
 #include "src/ast/variable_decl_statement.h"
-#include "src/semantic/array.h"
-#include "src/semantic/call.h"
-#include "src/semantic/function.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/array.h"
+#include "src/sem/call.h"
+#include "src/sem/function.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/transform/calculate_array_length.h"
 #include "src/transform/decompose_storage_access.h"
 #include "src/type/access_control_type.h"
@@ -486,7 +486,7 @@
   auto* call = builder_.Sem().Get(expr);
   auto* target = call->Target();
 
-  if (auto* func = target->As<semantic::Function>()) {
+  if (auto* func = target->As<sem::Function>()) {
     if (ast::HasDecoration<
             transform::CalculateArrayLength::BufferSizeIntrinsic>(
             func->Declaration()->decorations())) {
@@ -602,14 +602,14 @@
     }
   }
 
-  if (auto* intrinsic = call->Target()->As<semantic::Intrinsic>()) {
+  if (auto* intrinsic = call->Target()->As<sem::Intrinsic>()) {
     if (intrinsic->IsTexture()) {
       return EmitTextureCall(pre, out, expr, intrinsic);
     }
-    if (intrinsic->Type() == semantic::IntrinsicType::kSelect) {
+    if (intrinsic->Type() == sem::IntrinsicType::kSelect) {
       diagnostics_.add_error("select not supported in HLSL backend yet");
       return false;
-    } else if (intrinsic->Type() == semantic::IntrinsicType::kIsNormal) {
+    } else if (intrinsic->Type() == sem::IntrinsicType::kIsNormal) {
       diagnostics_.add_error("is_normal not supported in HLSL backend yet");
       return false;
     } else if (intrinsic->IsDataPacking()) {
@@ -700,7 +700,7 @@
 bool GeneratorImpl::EmitDataPackingCall(std::ostream& pre,
                                         std::ostream& out,
                                         ast::CallExpression* expr,
-                                        const semantic::Intrinsic* intrinsic) {
+                                        const sem::Intrinsic* intrinsic) {
   auto* param = expr->params()[0];
   auto tmp_name = generate_name(kTempNamePrefix);
   std::ostringstream expr_out;
@@ -710,21 +710,21 @@
   uint32_t dims = 2;
   bool is_signed = false;
   uint32_t scale = 65535;
-  if (intrinsic->Type() == semantic::IntrinsicType::kPack4x8Snorm ||
-      intrinsic->Type() == semantic::IntrinsicType::kPack4x8Unorm) {
+  if (intrinsic->Type() == sem::IntrinsicType::kPack4x8Snorm ||
+      intrinsic->Type() == sem::IntrinsicType::kPack4x8Unorm) {
     dims = 4;
     scale = 255;
   }
-  if (intrinsic->Type() == semantic::IntrinsicType::kPack4x8Snorm ||
-      intrinsic->Type() == semantic::IntrinsicType::kPack2x16Snorm) {
+  if (intrinsic->Type() == sem::IntrinsicType::kPack4x8Snorm ||
+      intrinsic->Type() == sem::IntrinsicType::kPack2x16Snorm) {
     is_signed = true;
     scale = (scale - 1) / 2;
   }
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kPack4x8Snorm:
-    case semantic::IntrinsicType::kPack4x8Unorm:
-    case semantic::IntrinsicType::kPack2x16Snorm:
-    case semantic::IntrinsicType::kPack2x16Unorm:
+    case sem::IntrinsicType::kPack4x8Snorm:
+    case sem::IntrinsicType::kPack4x8Unorm:
+    case sem::IntrinsicType::kPack2x16Snorm:
+    case sem::IntrinsicType::kPack2x16Unorm:
       pre << (is_signed ? "" : "u") << "int" << dims << " " << tmp_name << " = "
           << (is_signed ? "" : "u") << "int" << dims << "(round(clamp("
           << expr_out.str() << ", " << (is_signed ? "-1.0" : "0.0")
@@ -743,7 +743,7 @@
       }
       out << ")";
       break;
-    case semantic::IntrinsicType::kPack2x16Float:
+    case sem::IntrinsicType::kPack2x16Float:
       pre << "uint2 " << tmp_name << " = f32tof16(" << expr_out.str() << ");\n";
       out << "(" << tmp_name << ".x | " << tmp_name << ".y << 16)";
       break;
@@ -756,11 +756,10 @@
   return true;
 }
 
-bool GeneratorImpl::EmitDataUnpackingCall(
-    std::ostream& pre,
-    std::ostream& out,
-    ast::CallExpression* expr,
-    const semantic::Intrinsic* intrinsic) {
+bool GeneratorImpl::EmitDataUnpackingCall(std::ostream& pre,
+                                          std::ostream& out,
+                                          ast::CallExpression* expr,
+                                          const sem::Intrinsic* intrinsic) {
   auto* param = expr->params()[0];
   auto tmp_name = generate_name(kTempNamePrefix);
   std::ostringstream expr_out;
@@ -770,19 +769,19 @@
   uint32_t dims = 2;
   bool is_signed = false;
   uint32_t scale = 65535;
-  if (intrinsic->Type() == semantic::IntrinsicType::kUnpack4x8Snorm ||
-      intrinsic->Type() == semantic::IntrinsicType::kUnpack4x8Unorm) {
+  if (intrinsic->Type() == sem::IntrinsicType::kUnpack4x8Snorm ||
+      intrinsic->Type() == sem::IntrinsicType::kUnpack4x8Unorm) {
     dims = 4;
     scale = 255;
   }
-  if (intrinsic->Type() == semantic::IntrinsicType::kUnpack4x8Snorm ||
-      intrinsic->Type() == semantic::IntrinsicType::kUnpack2x16Snorm) {
+  if (intrinsic->Type() == sem::IntrinsicType::kUnpack4x8Snorm ||
+      intrinsic->Type() == sem::IntrinsicType::kUnpack2x16Snorm) {
     is_signed = true;
     scale = (scale - 1) / 2;
   }
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kUnpack4x8Snorm:
-    case semantic::IntrinsicType::kUnpack2x16Snorm: {
+    case sem::IntrinsicType::kUnpack4x8Snorm:
+    case sem::IntrinsicType::kUnpack2x16Snorm: {
       auto tmp_name2 = generate_name(kTempNamePrefix);
       pre << "int " << tmp_name2 << " = int(" << expr_out.str() << ");\n";
       // Perform sign extension on the converted values.
@@ -798,8 +797,8 @@
           << ".0, " << (is_signed ? "-1.0" : "0.0") << ", 1.0)";
       break;
     }
-    case semantic::IntrinsicType::kUnpack4x8Unorm:
-    case semantic::IntrinsicType::kUnpack2x16Unorm: {
+    case sem::IntrinsicType::kUnpack4x8Unorm:
+    case sem::IntrinsicType::kUnpack2x16Unorm: {
       auto tmp_name2 = generate_name(kTempNamePrefix);
       pre << "uint " << tmp_name2 << " = " << expr_out.str() << ";\n";
       pre << "uint" << dims << " " << tmp_name << " = uint" << dims << "(";
@@ -814,7 +813,7 @@
       out << "float" << dims << "(" << tmp_name << ") / " << scale << ".0";
       break;
     }
-    case semantic::IntrinsicType::kUnpack2x16Float:
+    case sem::IntrinsicType::kUnpack2x16Float:
       pre << "uint " << tmp_name << " = " << expr_out.str() << ";\n";
       out << "f16tof32(uint2(" << tmp_name << " & 0xffff, " << tmp_name
           << " >> 16))";
@@ -830,16 +829,16 @@
 
 bool GeneratorImpl::EmitBarrierCall(std::ostream&,
                                     std::ostream& out,
-                                    const semantic::Intrinsic* intrinsic) {
+                                    const sem::Intrinsic* intrinsic) {
   // TODO(crbug.com/tint/661): Combine sequential barriers to a single
   // instruction.
-  if (intrinsic->Type() == semantic::IntrinsicType::kWorkgroupBarrier) {
+  if (intrinsic->Type() == sem::IntrinsicType::kWorkgroupBarrier) {
     out << "GroupMemoryBarrierWithGroupSync()";
-  } else if (intrinsic->Type() == semantic::IntrinsicType::kStorageBarrier) {
+  } else if (intrinsic->Type() == sem::IntrinsicType::kStorageBarrier) {
     out << "DeviceMemoryBarrierWithGroupSync()";
   } else {
-    TINT_UNREACHABLE(diagnostics_) << "unexpected barrier intrinsic type "
-                                   << semantic::str(intrinsic->Type());
+    TINT_UNREACHABLE(diagnostics_)
+        << "unexpected barrier intrinsic type " << sem::str(intrinsic->Type());
     return false;
   }
   return true;
@@ -848,15 +847,15 @@
 bool GeneratorImpl::EmitTextureCall(std::ostream& pre,
                                     std::ostream& out,
                                     ast::CallExpression* expr,
-                                    const semantic::Intrinsic* intrinsic) {
-  using Usage = semantic::Parameter::Usage;
+                                    const sem::Intrinsic* intrinsic) {
+  using Usage = sem::Parameter::Usage;
 
   auto parameters = intrinsic->Parameters();
   auto arguments = expr->params();
 
   // Returns the argument with the given usage
   auto arg = [&](Usage usage) {
-    int idx = semantic::IndexOf(parameters, usage);
+    int idx = sem::IndexOf(parameters, usage);
     return (idx >= 0) ? arguments[idx] : nullptr;
   };
 
@@ -869,17 +868,17 @@
   auto* texture_type = TypeOf(texture)->UnwrapAll()->As<type::Texture>();
 
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kTextureDimensions:
-    case semantic::IntrinsicType::kTextureNumLayers:
-    case semantic::IntrinsicType::kTextureNumLevels:
-    case semantic::IntrinsicType::kTextureNumSamples: {
+    case sem::IntrinsicType::kTextureDimensions:
+    case sem::IntrinsicType::kTextureNumLayers:
+    case sem::IntrinsicType::kTextureNumLevels:
+    case sem::IntrinsicType::kTextureNumSamples: {
       // All of these intrinsics use the GetDimensions() method on the texture
       bool is_ms = texture_type->Is<type::MultisampledTexture>();
       int num_dimensions = 0;
       std::string swizzle;
 
       switch (intrinsic->Type()) {
-        case semantic::IntrinsicType::kTextureDimensions:
+        case sem::IntrinsicType::kTextureDimensions:
           switch (texture_type->dim()) {
             case type::TextureDimension::kNone:
               TINT_ICE(diagnostics_) << "texture dimension is kNone";
@@ -912,7 +911,7 @@
               break;
           }
           break;
-        case semantic::IntrinsicType::kTextureNumLayers:
+        case sem::IntrinsicType::kTextureNumLayers:
           switch (texture_type->dim()) {
             default:
               TINT_ICE(diagnostics_) << "texture dimension is not arrayed";
@@ -927,7 +926,7 @@
               break;
           }
           break;
-        case semantic::IntrinsicType::kTextureNumLevels:
+        case sem::IntrinsicType::kTextureNumLevels:
           switch (texture_type->dim()) {
             default:
               TINT_ICE(diagnostics_)
@@ -946,7 +945,7 @@
               break;
           }
           break;
-        case semantic::IntrinsicType::kTextureNumSamples:
+        case sem::IntrinsicType::kTextureNumSamples:
           switch (texture_type->dim()) {
             default:
               TINT_ICE(diagnostics_)
@@ -1013,8 +1012,7 @@
           return false;
         }
         pre << ", ";
-      } else if (intrinsic->Type() ==
-                 semantic::IntrinsicType::kTextureNumLevels) {
+      } else if (intrinsic->Type() == sem::IntrinsicType::kTextureNumLevels) {
         pre << "0, ";
       }
 
@@ -1053,26 +1051,26 @@
   bool pack_mip_in_coords = false;
 
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kTextureSample:
+    case sem::IntrinsicType::kTextureSample:
       out << ".Sample(";
       break;
-    case semantic::IntrinsicType::kTextureSampleBias:
+    case sem::IntrinsicType::kTextureSampleBias:
       out << ".SampleBias(";
       break;
-    case semantic::IntrinsicType::kTextureSampleLevel:
+    case sem::IntrinsicType::kTextureSampleLevel:
       out << ".SampleLevel(";
       break;
-    case semantic::IntrinsicType::kTextureSampleGrad:
+    case sem::IntrinsicType::kTextureSampleGrad:
       out << ".SampleGrad(";
       break;
-    case semantic::IntrinsicType::kTextureSampleCompare:
+    case sem::IntrinsicType::kTextureSampleCompare:
       out << ".SampleCmpLevelZero(";
       break;
-    case semantic::IntrinsicType::kTextureLoad:
+    case sem::IntrinsicType::kTextureLoad:
       out << ".Load(";
       pack_mip_in_coords = true;
       break;
-    case semantic::IntrinsicType::kTextureStore:
+    case sem::IntrinsicType::kTextureStore:
       out << "[";
       break;
     default:
@@ -1098,8 +1096,7 @@
     auto* i32 = builder_.create<type::I32>();
     auto* zero = builder_.Expr(0);
     auto* stmt = builder_.Sem().Get(vector)->Stmt();
-    builder_.Sem().Add(zero,
-                       builder_.create<semantic::Expression>(zero, i32, stmt));
+    builder_.Sem().Add(zero, builder_.create<sem::Expression>(zero, i32, stmt));
     auto* packed = AppendVector(&builder_, vector, zero);
     return EmitExpression(pre, out, packed);
   };
@@ -1134,7 +1131,7 @@
     }
   }
 
-  if (intrinsic->Type() == semantic::IntrinsicType::kTextureStore) {
+  if (intrinsic->Type() == sem::IntrinsicType::kTextureStore) {
     out << "] = ";
     if (!EmitExpression(pre, out, arg(Usage::kValue)))
       return false;
@@ -1146,97 +1143,97 @@
 }  // namespace hlsl
 
 std::string GeneratorImpl::generate_builtin_name(
-    const semantic::Intrinsic* intrinsic) {
+    const sem::Intrinsic* intrinsic) {
   std::string out;
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kAcos:
-    case semantic::IntrinsicType::kAny:
-    case semantic::IntrinsicType::kAll:
-    case semantic::IntrinsicType::kAsin:
-    case semantic::IntrinsicType::kAtan:
-    case semantic::IntrinsicType::kAtan2:
-    case semantic::IntrinsicType::kCeil:
-    case semantic::IntrinsicType::kCos:
-    case semantic::IntrinsicType::kCosh:
-    case semantic::IntrinsicType::kCross:
-    case semantic::IntrinsicType::kDeterminant:
-    case semantic::IntrinsicType::kDistance:
-    case semantic::IntrinsicType::kDot:
-    case semantic::IntrinsicType::kExp:
-    case semantic::IntrinsicType::kExp2:
-    case semantic::IntrinsicType::kFloor:
-    case semantic::IntrinsicType::kFma:
-    case semantic::IntrinsicType::kLdexp:
-    case semantic::IntrinsicType::kLength:
-    case semantic::IntrinsicType::kLog:
-    case semantic::IntrinsicType::kLog2:
-    case semantic::IntrinsicType::kNormalize:
-    case semantic::IntrinsicType::kPow:
-    case semantic::IntrinsicType::kReflect:
-    case semantic::IntrinsicType::kRound:
-    case semantic::IntrinsicType::kSin:
-    case semantic::IntrinsicType::kSinh:
-    case semantic::IntrinsicType::kSqrt:
-    case semantic::IntrinsicType::kStep:
-    case semantic::IntrinsicType::kTan:
-    case semantic::IntrinsicType::kTanh:
-    case semantic::IntrinsicType::kTrunc:
-    case semantic::IntrinsicType::kMix:
-    case semantic::IntrinsicType::kSign:
-    case semantic::IntrinsicType::kAbs:
-    case semantic::IntrinsicType::kMax:
-    case semantic::IntrinsicType::kMin:
-    case semantic::IntrinsicType::kClamp:
+    case sem::IntrinsicType::kAcos:
+    case sem::IntrinsicType::kAny:
+    case sem::IntrinsicType::kAll:
+    case sem::IntrinsicType::kAsin:
+    case sem::IntrinsicType::kAtan:
+    case sem::IntrinsicType::kAtan2:
+    case sem::IntrinsicType::kCeil:
+    case sem::IntrinsicType::kCos:
+    case sem::IntrinsicType::kCosh:
+    case sem::IntrinsicType::kCross:
+    case sem::IntrinsicType::kDeterminant:
+    case sem::IntrinsicType::kDistance:
+    case sem::IntrinsicType::kDot:
+    case sem::IntrinsicType::kExp:
+    case sem::IntrinsicType::kExp2:
+    case sem::IntrinsicType::kFloor:
+    case sem::IntrinsicType::kFma:
+    case sem::IntrinsicType::kLdexp:
+    case sem::IntrinsicType::kLength:
+    case sem::IntrinsicType::kLog:
+    case sem::IntrinsicType::kLog2:
+    case sem::IntrinsicType::kNormalize:
+    case sem::IntrinsicType::kPow:
+    case sem::IntrinsicType::kReflect:
+    case sem::IntrinsicType::kRound:
+    case sem::IntrinsicType::kSin:
+    case sem::IntrinsicType::kSinh:
+    case sem::IntrinsicType::kSqrt:
+    case sem::IntrinsicType::kStep:
+    case sem::IntrinsicType::kTan:
+    case sem::IntrinsicType::kTanh:
+    case sem::IntrinsicType::kTrunc:
+    case sem::IntrinsicType::kMix:
+    case sem::IntrinsicType::kSign:
+    case sem::IntrinsicType::kAbs:
+    case sem::IntrinsicType::kMax:
+    case sem::IntrinsicType::kMin:
+    case sem::IntrinsicType::kClamp:
       out = intrinsic->str();
       break;
-    case semantic::IntrinsicType::kCountOneBits:
+    case sem::IntrinsicType::kCountOneBits:
       out = "countbits";
       break;
-    case semantic::IntrinsicType::kDpdx:
+    case sem::IntrinsicType::kDpdx:
       out = "ddx";
       break;
-    case semantic::IntrinsicType::kDpdxCoarse:
+    case sem::IntrinsicType::kDpdxCoarse:
       out = "ddx_coarse";
       break;
-    case semantic::IntrinsicType::kDpdxFine:
+    case sem::IntrinsicType::kDpdxFine:
       out = "ddx_fine";
       break;
-    case semantic::IntrinsicType::kDpdy:
+    case sem::IntrinsicType::kDpdy:
       out = "ddy";
       break;
-    case semantic::IntrinsicType::kDpdyCoarse:
+    case sem::IntrinsicType::kDpdyCoarse:
       out = "ddy_coarse";
       break;
-    case semantic::IntrinsicType::kDpdyFine:
+    case sem::IntrinsicType::kDpdyFine:
       out = "ddy_fine";
       break;
-    case semantic::IntrinsicType::kFaceForward:
+    case sem::IntrinsicType::kFaceForward:
       out = "faceforward";
       break;
-    case semantic::IntrinsicType::kFract:
+    case sem::IntrinsicType::kFract:
       out = "frac";
       break;
-    case semantic::IntrinsicType::kFwidth:
-    case semantic::IntrinsicType::kFwidthCoarse:
-    case semantic::IntrinsicType::kFwidthFine:
+    case sem::IntrinsicType::kFwidth:
+    case sem::IntrinsicType::kFwidthCoarse:
+    case sem::IntrinsicType::kFwidthFine:
       out = "fwidth";
       break;
-    case semantic::IntrinsicType::kInverseSqrt:
+    case sem::IntrinsicType::kInverseSqrt:
       out = "rsqrt";
       break;
-    case semantic::IntrinsicType::kIsFinite:
+    case sem::IntrinsicType::kIsFinite:
       out = "isfinite";
       break;
-    case semantic::IntrinsicType::kIsInf:
+    case sem::IntrinsicType::kIsInf:
       out = "isinf";
       break;
-    case semantic::IntrinsicType::kIsNan:
+    case sem::IntrinsicType::kIsNan:
       out = "isnan";
       break;
-    case semantic::IntrinsicType::kReverseBits:
+    case sem::IntrinsicType::kReverseBits:
       out = "reversebits";
       break;
-    case semantic::IntrinsicType::kSmoothStep:
+    case sem::IntrinsicType::kSmoothStep:
       out = "smoothstep";
       break;
     default:
@@ -1392,7 +1389,7 @@
   return false;
 }
 
-bool GeneratorImpl::global_is_in_struct(const semantic::Variable* var) const {
+bool GeneratorImpl::global_is_in_struct(const sem::Variable* var) const {
   auto& decorations = var->Declaration()->decorations();
   if (ast::HasDecoration<ast::LocationDecoration>(decorations) ||
       ast::HasDecoration<ast::BuiltinDecoration>(decorations)) {
@@ -1406,7 +1403,7 @@
                                    std::ostream& out,
                                    ast::IdentifierExpression* expr) {
   auto* ident = expr->As<ast::IdentifierExpression>();
-  const semantic::Variable* var = nullptr;
+  const sem::Variable* var = nullptr;
   if (global_variables_.get(ident->symbol(), &var)) {
     if (global_is_in_struct(var)) {
       auto var_type = var->StorageClass() == ast::StorageClass::kInput
@@ -1482,7 +1479,7 @@
 }
 
 bool GeneratorImpl::has_referenced_in_var_needing_struct(
-    const semantic::Function* func) {
+    const sem::Function* func) {
   for (auto data : func->ReferencedLocationVariables()) {
     auto* var = data.first;
     if (var->StorageClass() == ast::StorageClass::kInput) {
@@ -1500,7 +1497,7 @@
 }
 
 bool GeneratorImpl::has_referenced_out_var_needing_struct(
-    const semantic::Function* func) {
+    const sem::Function* func) {
   for (auto data : func->ReferencedLocationVariables()) {
     auto* var = data.first;
     if (var->StorageClass() == ast::StorageClass::kOutput) {
@@ -1518,7 +1515,7 @@
 }
 
 bool GeneratorImpl::has_referenced_var_needing_struct(
-    const semantic::Function* func) {
+    const sem::Function* func) {
   for (auto data : func->ReferencedLocationVariables()) {
     auto* var = data.first;
     if (var->StorageClass() == ast::StorageClass::kOutput ||
@@ -2237,7 +2234,7 @@
   out << ".";
 
   // Swizzles output the name directly
-  if (builder_.Sem().Get(expr)->Is<semantic::Swizzle>()) {
+  if (builder_.Sem().Get(expr)->Is<sem::Swizzle>()) {
     out << builder_.Symbols().NameFor(expr->member()->symbol());
   } else if (!EmitExpression(pre, out, expr->member())) {
     return false;
@@ -2556,17 +2553,16 @@
           TINT_ICE(diagnostics_) << "invalid entry point IO struct uses";
         }
 
-        if (pipeline_stage_uses.count(
-                semantic::PipelineStageUsage::kVertexInput)) {
+        if (pipeline_stage_uses.count(sem::PipelineStageUsage::kVertexInput)) {
           out << " : TEXCOORD" + std::to_string(location->value());
         } else if (pipeline_stage_uses.count(
-                       semantic::PipelineStageUsage::kVertexOutput)) {
+                       sem::PipelineStageUsage::kVertexOutput)) {
           out << " : TEXCOORD" + std::to_string(location->value());
         } else if (pipeline_stage_uses.count(
-                       semantic::PipelineStageUsage::kFragmentInput)) {
+                       sem::PipelineStageUsage::kFragmentInput)) {
           out << " : TEXCOORD" + std::to_string(location->value());
         } else if (pipeline_stage_uses.count(
-                       semantic::PipelineStageUsage::kFragmentOutput)) {
+                       sem::PipelineStageUsage::kFragmentOutput)) {
           out << " : SV_Target" + std::to_string(location->value());
         } else {
           TINT_ICE(diagnostics_) << "invalid use of location decoration";
diff --git a/src/writer/hlsl/generator_impl.h b/src/writer/hlsl/generator_impl.h
index 7961c21..4c8a186 100644
--- a/src/writer/hlsl/generator_impl.h
+++ b/src/writer/hlsl/generator_impl.h
@@ -39,10 +39,10 @@
 namespace type {
 class AccessControl;
 }  // namespace type
-namespace semantic {
+namespace sem {
 class Call;
 class Intrinsic;
-}  // namespace semantic
+}  // namespace sem
 
 namespace writer {
 namespace hlsl {
@@ -129,7 +129,7 @@
   /// @returns true if the call expression is emitted
   bool EmitBarrierCall(std::ostream& pre,
                        std::ostream& out,
-                       const semantic::Intrinsic* intrinsic);
+                       const sem::Intrinsic* intrinsic);
   /// Handles generating a call to a texture function (`textureSample`,
   /// `textureSampleGrad`, etc)
   /// @param pre the preamble for the expression stream
@@ -140,7 +140,7 @@
   bool EmitTextureCall(std::ostream& pre,
                        std::ostream& out,
                        ast::CallExpression* expr,
-                       const semantic::Intrinsic* intrinsic);
+                       const sem::Intrinsic* intrinsic);
   /// Handles generating a call to data packing intrinsic
   /// @param pre the preamble of the expression stream
   /// @param out the output of the expression stream
@@ -150,7 +150,7 @@
   bool EmitDataPackingCall(std::ostream& pre,
                            std::ostream& out,
                            ast::CallExpression* expr,
-                           const semantic::Intrinsic* intrinsic);
+                           const sem::Intrinsic* intrinsic);
   /// Handles generating a call to data unpacking intrinsic
   /// @param pre the preamble of the expression stream
   /// @param out the output of the expression stream
@@ -160,7 +160,7 @@
   bool EmitDataUnpackingCall(std::ostream& pre,
                              std::ostream& out,
                              ast::CallExpression* expr,
-                             const semantic::Intrinsic* intrinsic);
+                             const sem::Intrinsic* intrinsic);
   /// Handles a case statement
   /// @param out the output stream
   /// @param stmt the statement
@@ -334,11 +334,11 @@
   /// Checks if the global variable is in an input or output struct
   /// @param var the variable to check
   /// @returns true if the global is in an input or output struct
-  bool global_is_in_struct(const semantic::Variable* var) const;
+  bool global_is_in_struct(const sem::Variable* var) const;
   /// Handles generating a builtin method name
   /// @param intrinsic the semantic info for the intrinsic
   /// @returns the name or "" if not valid
-  std::string generate_builtin_name(const semantic::Intrinsic* intrinsic);
+  std::string generate_builtin_name(const sem::Intrinsic* intrinsic);
   /// Converts a builtin to an attribute name
   /// @param builtin the builtin to convert
   /// @returns the string name of the builtin or blank on error
@@ -346,16 +346,16 @@
   /// Determines if the function needs the input struct passed to it.
   /// @param func the function to check
   /// @returns true if there are input struct variables used in the function
-  bool has_referenced_in_var_needing_struct(const semantic::Function* func);
+  bool has_referenced_in_var_needing_struct(const sem::Function* func);
   /// Determines if the function needs the output struct passed to it.
   /// @param func the function to check
   /// @returns true if there are output struct variables used in the function
-  bool has_referenced_out_var_needing_struct(const semantic::Function* func);
+  bool has_referenced_out_var_needing_struct(const sem::Function* func);
   /// Determines if any used program variable requires an input or output
   /// struct.
   /// @param func the function to check
   /// @returns true if an input or output struct is required.
-  bool has_referenced_var_needing_struct(const semantic::Function* func);
+  bool has_referenced_var_needing_struct(const sem::Function* func);
 
   /// Generate a unique name
   /// @param prefix the name prefix
@@ -383,7 +383,7 @@
   Symbol current_ep_sym_;
   bool generating_entry_point_ = false;
   uint32_t loop_emission_counter_ = 0;
-  ScopeStack<const semantic::Variable*> global_variables_;
+  ScopeStack<const sem::Variable*> global_variables_;
   std::unordered_map<Symbol, EntryPointData> ep_sym_to_in_data_;
   std::unordered_map<Symbol, EntryPointData> ep_sym_to_out_data_;
 
diff --git a/src/writer/hlsl/generator_impl_intrinsic_test.cc b/src/writer/hlsl/generator_impl_intrinsic_test.cc
index baac6d1..4978b91 100644
--- a/src/writer/hlsl/generator_impl_intrinsic_test.cc
+++ b/src/writer/hlsl/generator_impl_intrinsic_test.cc
@@ -15,7 +15,7 @@
 #include "gmock/gmock.h"
 #include "src/ast/call_statement.h"
 #include "src/ast/stage_decoration.h"
-#include "src/semantic/call.h"
+#include "src/sem/call.h"
 #include "src/writer/hlsl/test_helper.h"
 
 namespace tint {
@@ -23,7 +23,7 @@
 namespace hlsl {
 namespace {
 
-using IntrinsicType = semantic::IntrinsicType;
+using IntrinsicType = sem::IntrinsicType;
 
 using ::testing::HasSubstr;
 
@@ -171,7 +171,7 @@
   ASSERT_NE(sem, nullptr);
   auto* target = sem->Target();
   ASSERT_NE(target, nullptr);
-  auto* intrinsic = target->As<semantic::Intrinsic>();
+  auto* intrinsic = target->As<sem::Intrinsic>();
   ASSERT_NE(intrinsic, nullptr);
 
   EXPECT_EQ(gen.generate_builtin_name(intrinsic), param.hlsl_name);
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 12b5711..ffca978 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -28,12 +28,12 @@
 #include "src/ast/sint_literal.h"
 #include "src/ast/uint_literal.h"
 #include "src/ast/variable_decl_statement.h"
-#include "src/semantic/array.h"
-#include "src/semantic/call.h"
-#include "src/semantic/function.h"
-#include "src/semantic/member_accessor_expression.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/array.h"
+#include "src/sem/call.h"
+#include "src/sem/function.h"
+#include "src/sem/member_accessor_expression.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/type/alias_type.h"
 #include "src/type/array_type.h"
@@ -321,14 +321,14 @@
   }
 
   auto* call = program_->Sem().Get(expr);
-  if (auto* intrinsic = call->Target()->As<semantic::Intrinsic>()) {
+  if (auto* intrinsic = call->Target()->As<sem::Intrinsic>()) {
     if (intrinsic->IsTexture()) {
       return EmitTextureCall(expr, intrinsic);
     }
-    if (intrinsic->Type() == semantic::IntrinsicType::kPack2x16Float ||
-        intrinsic->Type() == semantic::IntrinsicType::kUnpack2x16Float) {
+    if (intrinsic->Type() == sem::IntrinsicType::kPack2x16Float ||
+        intrinsic->Type() == sem::IntrinsicType::kUnpack2x16Float) {
       make_indent();
-      if (intrinsic->Type() == semantic::IntrinsicType::kPack2x16Float) {
+      if (intrinsic->Type() == sem::IntrinsicType::kPack2x16Float) {
         out_ << "as_type<uint>(half2(";
       } else {
         out_ << "float2(as_type<half2>(";
@@ -341,12 +341,12 @@
     }
     // TODO(crbug.com/tint/661): Combine sequential barriers to a single
     // instruction.
-    if (intrinsic->Type() == semantic::IntrinsicType::kStorageBarrier) {
+    if (intrinsic->Type() == sem::IntrinsicType::kStorageBarrier) {
       make_indent();
       out_ << "threadgroup_barrier(mem_flags::mem_device)";
       return true;
     }
-    if (intrinsic->Type() == semantic::IntrinsicType::kWorkgroupBarrier) {
+    if (intrinsic->Type() == sem::IntrinsicType::kWorkgroupBarrier) {
       make_indent();
       out_ << "threadgroup_barrier(mem_flags::mem_threadgroup)";
       return true;
@@ -461,15 +461,15 @@
 }
 
 bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
-                                    const semantic::Intrinsic* intrinsic) {
-  using Usage = semantic::Parameter::Usage;
+                                    const sem::Intrinsic* intrinsic) {
+  using Usage = sem::Parameter::Usage;
 
   auto parameters = intrinsic->Parameters();
   auto arguments = expr->params();
 
   // Returns the argument with the given usage
   auto arg = [&](Usage usage) {
-    int idx = semantic::IndexOf(parameters, usage);
+    int idx = sem::IndexOf(parameters, usage);
     return (idx >= 0) ? arguments[idx] : nullptr;
   };
 
@@ -482,7 +482,7 @@
   auto* texture_type = TypeOf(texture)->UnwrapAll()->As<type::Texture>();
 
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kTextureDimensions: {
+    case sem::IntrinsicType::kTextureDimensions: {
       std::vector<const char*> dims;
       switch (texture_type->dim()) {
         case type::TextureDimension::kNone:
@@ -537,7 +537,7 @@
       }
       return true;
     }
-    case semantic::IntrinsicType::kTextureNumLayers: {
+    case sem::IntrinsicType::kTextureNumLayers: {
       out_ << "int(";
       if (!EmitExpression(texture)) {
         return false;
@@ -545,7 +545,7 @@
       out_ << ".get_array_size())";
       return true;
     }
-    case semantic::IntrinsicType::kTextureNumLevels: {
+    case sem::IntrinsicType::kTextureNumLevels: {
       out_ << "int(";
       if (!EmitExpression(texture)) {
         return false;
@@ -553,7 +553,7 @@
       out_ << ".get_num_mip_levels())";
       return true;
     }
-    case semantic::IntrinsicType::kTextureNumSamples: {
+    case sem::IntrinsicType::kTextureNumSamples: {
       out_ << "int(";
       if (!EmitExpression(texture)) {
         return false;
@@ -571,20 +571,20 @@
   bool lod_param_is_named = true;
 
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kTextureSample:
-    case semantic::IntrinsicType::kTextureSampleBias:
-    case semantic::IntrinsicType::kTextureSampleLevel:
-    case semantic::IntrinsicType::kTextureSampleGrad:
+    case sem::IntrinsicType::kTextureSample:
+    case sem::IntrinsicType::kTextureSampleBias:
+    case sem::IntrinsicType::kTextureSampleLevel:
+    case sem::IntrinsicType::kTextureSampleGrad:
       out_ << ".sample(";
       break;
-    case semantic::IntrinsicType::kTextureSampleCompare:
+    case sem::IntrinsicType::kTextureSampleCompare:
       out_ << ".sample_compare(";
       break;
-    case semantic::IntrinsicType::kTextureLoad:
+    case sem::IntrinsicType::kTextureLoad:
       out_ << ".read(";
       lod_param_is_named = false;
       break;
-    case semantic::IntrinsicType::kTextureStore:
+    case sem::IntrinsicType::kTextureStore:
       out_ << ".write(";
       break;
     default:
@@ -678,135 +678,135 @@
 }
 
 std::string GeneratorImpl::generate_builtin_name(
-    const semantic::Intrinsic* intrinsic) {
+    const sem::Intrinsic* intrinsic) {
   std::string out = "";
   switch (intrinsic->Type()) {
-    case semantic::IntrinsicType::kAcos:
-    case semantic::IntrinsicType::kAll:
-    case semantic::IntrinsicType::kAny:
-    case semantic::IntrinsicType::kAsin:
-    case semantic::IntrinsicType::kAtan:
-    case semantic::IntrinsicType::kAtan2:
-    case semantic::IntrinsicType::kCeil:
-    case semantic::IntrinsicType::kCos:
-    case semantic::IntrinsicType::kCosh:
-    case semantic::IntrinsicType::kCross:
-    case semantic::IntrinsicType::kDeterminant:
-    case semantic::IntrinsicType::kDistance:
-    case semantic::IntrinsicType::kDot:
-    case semantic::IntrinsicType::kExp:
-    case semantic::IntrinsicType::kExp2:
-    case semantic::IntrinsicType::kFloor:
-    case semantic::IntrinsicType::kFma:
-    case semantic::IntrinsicType::kFract:
-    case semantic::IntrinsicType::kLength:
-    case semantic::IntrinsicType::kLdexp:
-    case semantic::IntrinsicType::kLog:
-    case semantic::IntrinsicType::kLog2:
-    case semantic::IntrinsicType::kMix:
-    case semantic::IntrinsicType::kNormalize:
-    case semantic::IntrinsicType::kPow:
-    case semantic::IntrinsicType::kReflect:
-    case semantic::IntrinsicType::kSelect:
-    case semantic::IntrinsicType::kSin:
-    case semantic::IntrinsicType::kSinh:
-    case semantic::IntrinsicType::kSqrt:
-    case semantic::IntrinsicType::kStep:
-    case semantic::IntrinsicType::kTan:
-    case semantic::IntrinsicType::kTanh:
-    case semantic::IntrinsicType::kTrunc:
-    case semantic::IntrinsicType::kSign:
-    case semantic::IntrinsicType::kClamp:
+    case sem::IntrinsicType::kAcos:
+    case sem::IntrinsicType::kAll:
+    case sem::IntrinsicType::kAny:
+    case sem::IntrinsicType::kAsin:
+    case sem::IntrinsicType::kAtan:
+    case sem::IntrinsicType::kAtan2:
+    case sem::IntrinsicType::kCeil:
+    case sem::IntrinsicType::kCos:
+    case sem::IntrinsicType::kCosh:
+    case sem::IntrinsicType::kCross:
+    case sem::IntrinsicType::kDeterminant:
+    case sem::IntrinsicType::kDistance:
+    case sem::IntrinsicType::kDot:
+    case sem::IntrinsicType::kExp:
+    case sem::IntrinsicType::kExp2:
+    case sem::IntrinsicType::kFloor:
+    case sem::IntrinsicType::kFma:
+    case sem::IntrinsicType::kFract:
+    case sem::IntrinsicType::kLength:
+    case sem::IntrinsicType::kLdexp:
+    case sem::IntrinsicType::kLog:
+    case sem::IntrinsicType::kLog2:
+    case sem::IntrinsicType::kMix:
+    case sem::IntrinsicType::kNormalize:
+    case sem::IntrinsicType::kPow:
+    case sem::IntrinsicType::kReflect:
+    case sem::IntrinsicType::kSelect:
+    case sem::IntrinsicType::kSin:
+    case sem::IntrinsicType::kSinh:
+    case sem::IntrinsicType::kSqrt:
+    case sem::IntrinsicType::kStep:
+    case sem::IntrinsicType::kTan:
+    case sem::IntrinsicType::kTanh:
+    case sem::IntrinsicType::kTrunc:
+    case sem::IntrinsicType::kSign:
+    case sem::IntrinsicType::kClamp:
       out += intrinsic->str();
       break;
-    case semantic::IntrinsicType::kAbs:
+    case sem::IntrinsicType::kAbs:
       if (intrinsic->ReturnType()->is_float_scalar_or_vector()) {
         out += "fabs";
       } else {
         out += "abs";
       }
       break;
-    case semantic::IntrinsicType::kCountOneBits:
+    case sem::IntrinsicType::kCountOneBits:
       out += "popcount";
       break;
-    case semantic::IntrinsicType::kDpdx:
-    case semantic::IntrinsicType::kDpdxCoarse:
-    case semantic::IntrinsicType::kDpdxFine:
+    case sem::IntrinsicType::kDpdx:
+    case sem::IntrinsicType::kDpdxCoarse:
+    case sem::IntrinsicType::kDpdxFine:
       out += "dfdx";
       break;
-    case semantic::IntrinsicType::kDpdy:
-    case semantic::IntrinsicType::kDpdyCoarse:
-    case semantic::IntrinsicType::kDpdyFine:
+    case sem::IntrinsicType::kDpdy:
+    case sem::IntrinsicType::kDpdyCoarse:
+    case sem::IntrinsicType::kDpdyFine:
       out += "dfdy";
       break;
-    case semantic::IntrinsicType::kFwidth:
-    case semantic::IntrinsicType::kFwidthCoarse:
-    case semantic::IntrinsicType::kFwidthFine:
+    case sem::IntrinsicType::kFwidth:
+    case sem::IntrinsicType::kFwidthCoarse:
+    case sem::IntrinsicType::kFwidthFine:
       out += "fwidth";
       break;
-    case semantic::IntrinsicType::kIsFinite:
+    case sem::IntrinsicType::kIsFinite:
       out += "isfinite";
       break;
-    case semantic::IntrinsicType::kIsInf:
+    case sem::IntrinsicType::kIsInf:
       out += "isinf";
       break;
-    case semantic::IntrinsicType::kIsNan:
+    case sem::IntrinsicType::kIsNan:
       out += "isnan";
       break;
-    case semantic::IntrinsicType::kIsNormal:
+    case sem::IntrinsicType::kIsNormal:
       out += "isnormal";
       break;
-    case semantic::IntrinsicType::kMax:
+    case sem::IntrinsicType::kMax:
       if (intrinsic->ReturnType()->is_float_scalar_or_vector()) {
         out += "fmax";
       } else {
         out += "max";
       }
       break;
-    case semantic::IntrinsicType::kMin:
+    case sem::IntrinsicType::kMin:
       if (intrinsic->ReturnType()->is_float_scalar_or_vector()) {
         out += "fmin";
       } else {
         out += "min";
       }
       break;
-    case semantic::IntrinsicType::kFaceForward:
+    case sem::IntrinsicType::kFaceForward:
       out += "faceforward";
       break;
-    case semantic::IntrinsicType::kPack4x8Snorm:
+    case sem::IntrinsicType::kPack4x8Snorm:
       out += "pack_float_to_snorm4x8";
       break;
-    case semantic::IntrinsicType::kPack4x8Unorm:
+    case sem::IntrinsicType::kPack4x8Unorm:
       out += "pack_float_to_unorm4x8";
       break;
-    case semantic::IntrinsicType::kPack2x16Snorm:
+    case sem::IntrinsicType::kPack2x16Snorm:
       out += "pack_float_to_snorm2x16";
       break;
-    case semantic::IntrinsicType::kPack2x16Unorm:
+    case sem::IntrinsicType::kPack2x16Unorm:
       out += "pack_float_to_unorm2x16";
       break;
-    case semantic::IntrinsicType::kReverseBits:
+    case sem::IntrinsicType::kReverseBits:
       out += "reverse_bits";
       break;
-    case semantic::IntrinsicType::kRound:
+    case sem::IntrinsicType::kRound:
       out += "rint";
       break;
-    case semantic::IntrinsicType::kSmoothStep:
+    case sem::IntrinsicType::kSmoothStep:
       out += "smoothstep";
       break;
-    case semantic::IntrinsicType::kInverseSqrt:
+    case sem::IntrinsicType::kInverseSqrt:
       out += "rsqrt";
       break;
-    case semantic::IntrinsicType::kUnpack4x8Snorm:
+    case sem::IntrinsicType::kUnpack4x8Snorm:
       out += "unpack_snorm4x8_to_float";
       break;
-    case semantic::IntrinsicType::kUnpack4x8Unorm:
+    case sem::IntrinsicType::kUnpack4x8Unorm:
       out += "unpack_unorm4x8_to_float";
       break;
-    case semantic::IntrinsicType::kUnpack2x16Snorm:
+    case sem::IntrinsicType::kUnpack2x16Snorm:
       out += "unpack_snorm2x16_to_float";
       break;
-    case semantic::IntrinsicType::kUnpack2x16Unorm:
+    case sem::IntrinsicType::kUnpack2x16Unorm:
       out += "unpack_unorm2x16_to_float";
       break;
     default:
@@ -1563,7 +1563,7 @@
   return true;
 }
 
-bool GeneratorImpl::global_is_in_struct(const semantic::Variable* var) const {
+bool GeneratorImpl::global_is_in_struct(const sem::Variable* var) const {
   auto& decorations = var->Declaration()->decorations();
   bool in_or_out_struct_has_location =
       var != nullptr &&
@@ -1579,7 +1579,7 @@
 
 bool GeneratorImpl::EmitIdentifier(ast::IdentifierExpression* expr) {
   auto* ident = expr->As<ast::IdentifierExpression>();
-  const semantic::Variable* var = nullptr;
+  const sem::Variable* var = nullptr;
   if (global_variables_.get(ident->symbol(), &var)) {
     if (global_is_in_struct(var)) {
       auto var_type = var->StorageClass() == ast::StorageClass::kInput
@@ -1739,7 +1739,7 @@
   out_ << ".";
 
   // Swizzles get written out directly
-  if (program_->Sem().Get(expr)->Is<semantic::Swizzle>()) {
+  if (program_->Sem().Get(expr)->Is<sem::Swizzle>()) {
     out_ << program_->Symbols().NameFor(expr->member()->symbol());
   } else if (!EmitExpression(expr->member())) {
     return false;
@@ -2127,17 +2127,16 @@
           TINT_ICE(diagnostics_) << "invalid entry point IO struct uses";
         }
 
-        if (pipeline_stage_uses.count(
-                semantic::PipelineStageUsage::kVertexInput)) {
+        if (pipeline_stage_uses.count(sem::PipelineStageUsage::kVertexInput)) {
           out_ << " [[attribute(" + std::to_string(loc->value()) + ")]]";
         } else if (pipeline_stage_uses.count(
-                       semantic::PipelineStageUsage::kVertexOutput)) {
+                       sem::PipelineStageUsage::kVertexOutput)) {
           out_ << " [[user(locn" + std::to_string(loc->value()) + ")]]";
         } else if (pipeline_stage_uses.count(
-                       semantic::PipelineStageUsage::kFragmentInput)) {
+                       sem::PipelineStageUsage::kFragmentInput)) {
           out_ << " [[user(locn" + std::to_string(loc->value()) + ")]]";
         } else if (pipeline_stage_uses.count(
-                       semantic::PipelineStageUsage::kFragmentOutput)) {
+                       sem::PipelineStageUsage::kFragmentOutput)) {
           out_ << " [[color(" + std::to_string(loc->value()) + ")]]";
         } else {
           TINT_ICE(diagnostics_) << "invalid use of location decoration";
@@ -2193,7 +2192,7 @@
   return true;
 }
 
-bool GeneratorImpl::EmitVariable(const semantic::Variable* var,
+bool GeneratorImpl::EmitVariable(const sem::Variable* var,
                                  bool skip_constructor) {
   make_indent();
 
diff --git a/src/writer/msl/generator_impl.h b/src/writer/msl/generator_impl.h
index b53afd5..a9ddb63 100644
--- a/src/writer/msl/generator_impl.h
+++ b/src/writer/msl/generator_impl.h
@@ -41,10 +41,10 @@
 namespace tint {
 
 // Forward declarations
-namespace semantic {
+namespace sem {
 class Call;
 class Intrinsic;
-}  // namespace semantic
+}  // namespace sem
 
 namespace writer {
 namespace msl {
@@ -106,7 +106,7 @@
   /// @param intrinsic the semantic information for the texture intrinsic
   /// @returns true if the call expression is emitted
   bool EmitTextureCall(ast::CallExpression* expr,
-                       const semantic::Intrinsic* intrinsic);
+                       const sem::Intrinsic* intrinsic);
   /// Handles a case statement
   /// @param stmt the statement
   /// @returns true if the statement was emitted successfully
@@ -219,7 +219,7 @@
   /// @param var the variable to generate
   /// @param skip_constructor set true if the constructor should be skipped
   /// @returns true if the variable was emitted
-  bool EmitVariable(const semantic::Variable* var, bool skip_constructor);
+  bool EmitVariable(const sem::Variable* var, bool skip_constructor);
   /// Handles generating a program scope constant variable
   /// @param var the variable to emit
   /// @returns true if the variable was emitted
@@ -245,12 +245,12 @@
   /// Handles generating a builtin name
   /// @param intrinsic the semantic info for the intrinsic
   /// @returns the name or "" if not valid
-  std::string generate_builtin_name(const semantic::Intrinsic* intrinsic);
+  std::string generate_builtin_name(const sem::Intrinsic* intrinsic);
 
   /// Checks if the global variable is in an input or output struct
   /// @param var the variable to check
   /// @returns true if the global is in an input or output struct
-  bool global_is_in_struct(const semantic::Variable* var) const;
+  bool global_is_in_struct(const sem::Variable* var) const;
 
   /// Converts a builtin to an attribute name
   /// @param builtin the builtin to convert
@@ -283,7 +283,7 @@
   /// type.
   SizeAndAlign MslPackedTypeSizeAndAlign(type::Type* ty);
 
-  ScopeStack<const semantic::Variable*> global_variables_;
+  ScopeStack<const sem::Variable*> global_variables_;
   Symbol current_ep_sym_;
   bool generating_entry_point_ = false;
   const Program* program_ = nullptr;
diff --git a/src/writer/msl/generator_impl_import_test.cc b/src/writer/msl/generator_impl_import_test.cc
index 6841432..8b93b5f 100644
--- a/src/writer/msl/generator_impl_import_test.cc
+++ b/src/writer/msl/generator_impl_import_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/call.h"
+#include "src/sem/call.h"
 #include "src/writer/msl/test_helper.h"
 
 namespace tint {
@@ -44,7 +44,7 @@
   ASSERT_NE(sem, nullptr);
   auto* target = sem->Target();
   ASSERT_NE(target, nullptr);
-  auto* intrinsic = target->As<semantic::Intrinsic>();
+  auto* intrinsic = target->As<sem::Intrinsic>();
   ASSERT_NE(intrinsic, nullptr);
 
   ASSERT_EQ(gen.generate_builtin_name(intrinsic), param.msl_name);
diff --git a/src/writer/msl/generator_impl_intrinsic_test.cc b/src/writer/msl/generator_impl_intrinsic_test.cc
index 154b0ac..6088319 100644
--- a/src/writer/msl/generator_impl_intrinsic_test.cc
+++ b/src/writer/msl/generator_impl_intrinsic_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/call.h"
+#include "src/sem/call.h"
 #include "src/writer/msl/test_helper.h"
 
 namespace tint {
@@ -20,7 +20,7 @@
 namespace msl {
 namespace {
 
-using IntrinsicType = semantic::IntrinsicType;
+using IntrinsicType = sem::IntrinsicType;
 
 using MslGeneratorImplTest = TestHelper;
 
@@ -184,7 +184,7 @@
   ASSERT_NE(sem, nullptr);
   auto* target = sem->Target();
   ASSERT_NE(target, nullptr);
-  auto* intrinsic = target->As<semantic::Intrinsic>();
+  auto* intrinsic = target->As<sem::Intrinsic>();
   ASSERT_NE(intrinsic, nullptr);
 
   EXPECT_EQ(gen.generate_builtin_name(intrinsic), param.msl_name);
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 4c8187b..77e3f11 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -21,12 +21,12 @@
 #include "src/ast/call_statement.h"
 #include "src/ast/constant_id_decoration.h"
 #include "src/ast/fallthrough_statement.h"
-#include "src/semantic/array.h"
-#include "src/semantic/call.h"
-#include "src/semantic/function.h"
-#include "src/semantic/intrinsic.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/array.h"
+#include "src/sem/call.h"
+#include "src/sem/function.h"
+#include "src/sem/intrinsic.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/type/depth_texture_type.h"
 #include "src/type/multisampled_texture_type.h"
 #include "src/type/sampled_texture_type.h"
@@ -37,7 +37,7 @@
 namespace spirv {
 namespace {
 
-using IntrinsicType = semantic::IntrinsicType;
+using IntrinsicType = sem::IntrinsicType;
 
 const char kGLSLstd450[] = "GLSL.std.450";
 
@@ -118,7 +118,7 @@
   return type->As<type::Matrix>();
 }
 
-uint32_t intrinsic_to_glsl_method(const semantic::Intrinsic* intrinsic) {
+uint32_t intrinsic_to_glsl_method(const sem::Intrinsic* intrinsic) {
   switch (intrinsic->Type()) {
     case IntrinsicType::kAbs:
       if (intrinsic->ReturnType()->is_float_scalar_or_vector()) {
@@ -1879,7 +1879,7 @@
 
   auto* call = builder_.Sem().Get(expr);
   auto* target = call->Target();
-  if (auto* intrinsic = target->As<semantic::Intrinsic>()) {
+  if (auto* intrinsic = target->As<sem::Intrinsic>()) {
     return GenerateIntrinsic(expr, intrinsic);
   }
 
@@ -1918,7 +1918,7 @@
 }
 
 uint32_t Builder::GenerateIntrinsic(ast::CallExpression* call,
-                                    const semantic::Intrinsic* intrinsic) {
+                                    const sem::Intrinsic* intrinsic) {
   auto result = result_op();
   auto result_id = result.to_i();
 
@@ -2091,10 +2091,10 @@
 }
 
 bool Builder::GenerateTextureIntrinsic(ast::CallExpression* call,
-                                       const semantic::Intrinsic* intrinsic,
+                                       const sem::Intrinsic* intrinsic,
                                        Operand result_type,
                                        Operand result_id) {
-  using Usage = semantic::Parameter::Usage;
+  using Usage = sem::Parameter::Usage;
 
   auto parameters = intrinsic->Parameters();
   auto arguments = call->params();
@@ -2112,7 +2112,7 @@
 
   // Returns the argument with the given usage
   auto arg = [&](Usage usage) {
-    int idx = semantic::IndexOf(parameters, usage);
+    int idx = sem::IndexOf(parameters, usage);
     return (idx >= 0) ? arguments[idx] : nullptr;
   };
 
@@ -2491,8 +2491,7 @@
   return post_emission();
 }
 
-bool Builder::GenerateControlBarrierIntrinsic(
-    const semantic::Intrinsic* intrinsic) {
+bool Builder::GenerateControlBarrierIntrinsic(const sem::Intrinsic* intrinsic) {
   auto const op = spv::Op::OpControlBarrier;
   uint32_t execution = 0;
   uint32_t memory = 0;
@@ -2500,13 +2499,13 @@
 
   // TODO(crbug.com/tint/661): Combine sequential barriers to a single
   // instruction.
-  if (intrinsic->Type() == semantic::IntrinsicType::kWorkgroupBarrier) {
+  if (intrinsic->Type() == sem::IntrinsicType::kWorkgroupBarrier) {
     execution = static_cast<uint32_t>(spv::Scope::Workgroup);
     memory = static_cast<uint32_t>(spv::Scope::Workgroup);
     semantics =
         static_cast<uint32_t>(spv::MemorySemanticsMask::AcquireRelease) |
         static_cast<uint32_t>(spv::MemorySemanticsMask::WorkgroupMemory);
-  } else if (intrinsic->Type() == semantic::IntrinsicType::kStorageBarrier) {
+  } else if (intrinsic->Type() == sem::IntrinsicType::kStorageBarrier) {
     execution = static_cast<uint32_t>(spv::Scope::Workgroup);
     memory = static_cast<uint32_t>(spv::Scope::Device);
     semantics =
@@ -2514,7 +2513,7 @@
         static_cast<uint32_t>(spv::MemorySemanticsMask::UniformMemory);
   } else {
     error_ = "unexpected barrier intrinsic type ";
-    error_ += semantic::str(intrinsic->Type());
+    error_ += sem::str(intrinsic->Type());
     return false;
   }
 
diff --git a/src/writer/spirv/builder.h b/src/writer/spirv/builder.h
index 16b25e9..d66c4e2 100644
--- a/src/writer/spirv/builder.h
+++ b/src/writer/spirv/builder.h
@@ -42,9 +42,9 @@
 namespace tint {
 
 // Forward declarations
-namespace semantic {
+namespace sem {
 class Call;
-}  // namespace semantic
+}  // namespace sem
 
 namespace writer {
 namespace spirv {
@@ -349,7 +349,7 @@
   /// @param intrinsic the semantic information for the intrinsic
   /// @returns the expression ID on success or 0 otherwise
   uint32_t GenerateIntrinsic(ast::CallExpression* call,
-                             const semantic::Intrinsic* intrinsic);
+                             const sem::Intrinsic* intrinsic);
   /// Generates a texture intrinsic call. Emits an error and returns false if
   /// we're currently outside a function.
   /// @param call the call expression
@@ -359,14 +359,14 @@
   /// parameters
   /// @returns true on success
   bool GenerateTextureIntrinsic(ast::CallExpression* call,
-                                const semantic::Intrinsic* intrinsic,
+                                const sem::Intrinsic* intrinsic,
                                 spirv::Operand result_type,
                                 spirv::Operand result_id);
   /// Generates a control barrier statement.
   /// @param intrinsic the semantic information for the barrier intrinsic
   /// parameters
   /// @returns true on success
-  bool GenerateControlBarrierIntrinsic(const semantic::Intrinsic* intrinsic);
+  bool GenerateControlBarrierIntrinsic(const sem::Intrinsic* intrinsic);
   /// Generates a sampled image
   /// @param texture_type the texture type
   /// @param texture_operand the texture operand
diff --git a/src/writer/spirv/scalar_constant.h b/src/writer/spirv/scalar_constant.h
index 5f4e94b..353c8c8 100644
--- a/src/writer/spirv/scalar_constant.h
+++ b/src/writer/spirv/scalar_constant.h
@@ -25,9 +25,9 @@
 namespace tint {
 
 // Forward declarations
-namespace semantic {
+namespace sem {
 class Call;
-}  // namespace semantic
+}  // namespace sem
 
 namespace writer {
 namespace spirv {
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 5531f1b..156b266 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -32,9 +32,9 @@
 #include "src/ast/uint_literal.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/ast/workgroup_decoration.h"
-#include "src/semantic/function.h"
-#include "src/semantic/struct.h"
-#include "src/semantic/variable.h"
+#include "src/sem/function.h"
+#include "src/sem/struct.h"
+#include "src/sem/variable.h"
 #include "src/type/access_control_type.h"
 #include "src/type/alias_type.h"
 #include "src/type/array_type.h"
diff --git a/src/writer/wgsl/generator_impl_test.cc b/src/writer/wgsl/generator_impl_test.cc
index 7fc0d61..4a6e8c1 100644
--- a/src/writer/wgsl/generator_impl_test.cc
+++ b/src/writer/wgsl/generator_impl_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/semantic/variable.h"
+#include "src/sem/variable.h"
 #include "src/writer/wgsl/test_helper.h"
 
 namespace tint {
diff --git a/test/BUILD.gn b/test/BUILD.gn
index ba99f30..fc6afae 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -190,7 +190,7 @@
     "../src/resolver/type_validation_test.cc",
     "../src/resolver/validation_test.cc",
     "../src/scope_stack_test.cc",
-    "../src/semantic/sem_intrinsic_test.cc",
+    "../src/sem/sem_intrinsic_test.cc",
     "../src/symbol_table_test.cc",
     "../src/symbol_test.cc",
     "../src/traits_test.cc",