[ir][spirv-writer] Fix binary and|or for bools

These need to use OpLogical{And,Or} instead of OpBitwise{And,Or}.

Bug: tint:1906
Change-Id: Ia45e4386205aa6e231f50e6b24ef31d9db4e7fb5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/141242
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir.cc b/src/tint/writer/spirv/ir/generator_impl_ir.cc
index e906cc7..bae2f8e 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir.cc
@@ -1020,11 +1020,19 @@
         }
 
         case ir::Binary::Kind::kAnd: {
-            op = spv::Op::OpBitwiseAnd;
+            if (ty->is_integer_scalar_or_vector()) {
+                op = spv::Op::OpBitwiseAnd;
+            } else if (ty->is_bool_scalar_or_vector()) {
+                op = spv::Op::OpLogicalAnd;
+            }
             break;
         }
         case ir::Binary::Kind::kOr: {
-            op = spv::Op::OpBitwiseOr;
+            if (ty->is_integer_scalar_or_vector()) {
+                op = spv::Op::OpBitwiseOr;
+            } else if (ty->is_bool_scalar_or_vector()) {
+                op = spv::Op::OpLogicalOr;
+            }
             break;
         }
         case ir::Binary::Kind::kXor: {
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc b/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc
index bdd542c..3a7047d 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc
@@ -108,6 +108,11 @@
                     BinaryTestCase{kF16, ir::Binary::Kind::kMultiply, "OpFMul", "half"},
                     BinaryTestCase{kF16, ir::Binary::Kind::kDivide, "OpFDiv", "half"},
                     BinaryTestCase{kF16, ir::Binary::Kind::kModulo, "OpFRem", "half"}));
+INSTANTIATE_TEST_SUITE_P(
+    SpvGeneratorImplTest_Binary_Bool,
+    Arithmetic_Bitwise,
+    testing::Values(BinaryTestCase{kBool, ir::Binary::Kind::kAnd, "OpLogicalAnd", "bool"},
+                    BinaryTestCase{kBool, ir::Binary::Kind::kOr, "OpLogicalOr", "bool"}));
 
 TEST_F(SpvGeneratorImplTest, Binary_ScalarTimesVector_F32) {
     auto* scalar = b.FunctionParam("scalar", ty.f32());