<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Dec 3, 2015 at 8:23 PM, Xinliang David Li via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: davidxl<br>
Date: Thu Dec  3 22:22:59 2015<br>
New Revision: 254701<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=254701&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=254701&view=rev</a><br>
Log:<br>
[PGO] Fix mips test failure with new test case<br>
<br>
cmp&swap is not well supported -- the new test<br>
case triggers some assembler error.<br>
<br>
This is a partial fix to the general problem (lack<br>
of atomics operation support for certain targets).<br></blockquote><div><br></div><div>Can you add a comment near the #ifdef explaining this?</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/profile/InstrProfiling.c<br>
<br>
Modified: compiler-rt/trunk/lib/profile/InstrProfiling.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfiling.c?rev=254701&r1=254700&r2=254701&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfiling.c?rev=254701&r1=254700&r2=254701&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/profile/InstrProfiling.c (original)<br>
+++ compiler-rt/trunk/lib/profile/InstrProfiling.c Thu Dec  3 22:22:59 2015<br>
@@ -23,6 +23,22 @@<br>
     return 0;                                                                  \<br>
   }<br>
<br>
+#ifdef _MIPS_ARCH<br>
+LLVM_LIBRARY_VISIBILITY<br>
+uint32_t BoolCmpXchg(void **Ptr, void *OldV, void *NewV) {<br>
+  void *R = *Ptr;<br>
+  if (R == OldV) {<br>
+    *Ptr = NewV;<br>
+    return 1;<br>
+  }<br>
+  return 0;<br>
+}<br>
+#define BOOL_CMPXCHG(Ptr, OldV, NewV) BoolCmpXchg((void **)Ptr, OldV, NewV)<br>
+#else<br>
+#define BOOL_CMPXCHG(Ptr, OldV, NewV)                                          \<br>
+  __sync_bool_compare_and_swap(Ptr, OldV, NewV)<br>
+#endif<br>
+<br>
 LLVM_LIBRARY_VISIBILITY uint64_t __llvm_profile_get_magic(void) {<br>
   return sizeof(void *) == sizeof(uint64_t) ? (INSTR_PROF_RAW_MAGIC_64)<br>
                                             : (INSTR_PROF_RAW_MAGIC_32);<br>
@@ -106,7 +122,7 @@ static int allocateValueProfileCounters(<br>
       (ValueProfNode **)calloc(NumVSites, sizeof(ValueProfNode *));<br>
   if (!Mem)<br>
     return 0;<br>
-  if (!__sync_bool_compare_and_swap(&Data->Values, 0, Mem)) {<br>
+  if (!BOOL_CMPXCHG(&Data->Values, 0, Mem)) {<br>
     free(Mem);<br>
     return 0;<br>
   }<br>
@@ -171,10 +187,9 @@ __llvm_profile_instrument_target(uint64_<br>
<br>
   uint32_t Success = 0;<br>
   if (!ValueCounters[CounterIndex])<br>
-    Success = __sync_bool_compare_and_swap(&ValueCounters[CounterIndex], 0,<br>
-                                           CurrentVNode);<br>
+    Success = BOOL_CMPXCHG(&ValueCounters[CounterIndex], 0, CurrentVNode);<br>
   else if (PrevVNode && !PrevVNode->Next)<br>
-    Success = __sync_bool_compare_and_swap(&(PrevVNode->Next), 0, CurrentVNode);<br>
+    Success = BOOL_CMPXCHG(&(PrevVNode->Next), 0, CurrentVNode);<br>
<br>
   if (!Success) {<br>
     free(CurrentVNode);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>