Strengthen fall-back for mbedtls_ct_compiler_opaque

Signed-off-by: Dave Rodgman <dave.rodgman@arm.com>
diff --git a/library/constant_time_impl.h b/library/constant_time_impl.h
index 44682c0..c490d82 100644
--- a/library/constant_time_impl.h
+++ b/library/constant_time_impl.h
@@ -65,20 +65,29 @@
  * Core const-time primitives
  */
 
-/** Ensure that the compiler cannot know the value of x (i.e., cannot optimise
+/* Ensure that the compiler cannot know the value of x (i.e., cannot optimise
  * based on its value) after this function is called.
  *
  * If we are not using assembly, this will be fairly inefficient, so its use
  * should be minimised.
  */
+
+#if !defined(MBEDTLS_CT_ASM)
+/*
+* Define an object with the value zero, such that the compiler cannot prove that it
+* has the value zero (because it is volatile, it "may be modified in ways unknown to
+* the implementation").
+*/
+static volatile mbedtls_ct_uint_t mbedtls_ct_zero = 0;
+#endif
+
 static inline mbedtls_ct_uint_t mbedtls_ct_compiler_opaque(mbedtls_ct_uint_t x)
 {
 #if defined(MBEDTLS_CT_ASM)
     asm volatile ("" : [x] "+r" (x) :);
     return x;
 #else
-    volatile mbedtls_ct_uint_t result = x;
-    return result;
+    return x ^ mbedtls_ct_zero;
 #endif
 }