diff --git a/unix/gccollect.c b/unix/gccollect.c
index 1b5a38ffc6edd8e3f60a26f78fb7a2b214ef18b3..d934f9cae27ab20d27e989f0ef19275cf5790fea 100644
--- a/unix/gccollect.c
+++ b/unix/gccollect.c
@@ -43,17 +43,25 @@ typedef machine_uint_t regs_t[6];
 
 void gc_helper_get_regs(regs_t arr) {
     register long rbx asm ("rbx");
-    asm("" : "=r"(rbx));
     register long rbp asm ("rbp");
-    asm("" : "=r"(rbp));
     register long r12 asm ("r12");
-    asm("" : "=r"(r12));
     register long r13 asm ("r13");
-    asm("" : "=r"(r13));
     register long r14 asm ("r14");
-    asm("" : "=r"(r14));
     register long r15 asm ("r15");
+#ifdef __clang__
+    // TODO:
+    // This is dirty workaround for Clang. It tries to get around
+    // uncompliant (wrt to GCC) behavior of handling register variables.
+    // Application of this patch here is random, and done only to unbreak
+    // MacOS build. Better, cross-arch ways to deal with Clang issues should
+    // be found.
+    asm("" : "=r"(rbx));
+    asm("" : "=r"(rbp));
+    asm("" : "=r"(r12));
+    asm("" : "=r"(r13));
+    asm("" : "=r"(r14));
     asm("" : "=r"(r15));
+#endif
     arr[0] = rbx;
     arr[1] = rbp;
     arr[2] = r12;