diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py
index bd5a74782dc5dce7bf82985bea3a7c77404d9d26..e4845e425a468491a26d0887a970fd2d53febdfe 100644
--- a/loopy/target/c/codegen/expression.py
+++ b/loopy/target/c/codegen/expression.py
@@ -685,6 +685,10 @@ class CExpressionToCodeMapper(RecursiveMapper):
         return f % tuple(
                 self.rec(i, prec) for i in iterable)
 
+    def join(self, joiner, iterable):
+        f = joiner.join("%s" for i in iterable)
+        return f % tuple(iterable)
+
     # }}}
 
     def map_constant(self, expr, prec):
@@ -779,9 +783,16 @@ class CExpressionToCodeMapper(RecursiveMapper):
                 enclosing_prec, PREC_LOGICAL_AND)
 
     def map_logical_or(self, expr, enclosing_prec):
-        return self.parenthesize_if_needed(
-                self.join_rec(" || ", expr.children, PREC_LOGICAL_OR),
-                enclosing_prec, PREC_LOGICAL_OR)
+        mapped_children = []
+        from pymbolic.primitives import LogicalAnd
+        for child in expr.children:
+            mapped_child = self.rec(child, PREC_LOGICAL_OR)
+            # clang warns on unparenthesized && within ||
+            if isinstance(child, LogicalAnd):
+                mapped_child = "(%s)" % mapped_child
+            mapped_children.append(mapped_child)
+
+        return self.join(" || ", mapped_children)
 
     def map_sum(self, expr, enclosing_prec):
         from pymbolic.mapper.stringifier import PREC_SUM