<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 28, 2016, at 9:35 AM, Johan Wehrli via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class="">I have implemented a recursive loop to go through all the user of a global variable but I have one issue left.</div><div class=""><br class=""></div><div class="">Depending the code, the global variable is using itself: </div><div class=""><br class=""></div><div class=""><i class="">@sSelectedAccount = internal constant %struct.KVObserver { %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.744 to %0*), i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*), i32 3 }, align 4</i></div><div class=""><br class=""></div><div class="">With the IR code above, I am stuck in an infinite loop:</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">  </span>1) The global <i class="">sSelectedAccount</i> has the following user: "<i class="">i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*)</i>"</div><div class=""><span class="Apple-tab-span" style="white-space:pre"> </span>2) The bit cast has the following user: "<i class="">%struct.KVObserver { %"type 0x7ff164027360"* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.744 to %"type 0x7ff164027360"*), i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*), i32 3 }</i>"</div><div class=""><span class="Apple-tab-span" style="white-space:pre">      </span>3) The previous has the user <i class="">sSelectedAccount</i> -> so this create the infinite loop.</div><div class=""><br class=""></div><div class="">I was looking for a way to detect the loop and I think there is two possibilities:</div><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>- from the global value, iterate through all the element and find the loop, but this need a lot of cast and another recursive loop (need to handle ConstantStruct, ConstantExpr, ConstantArray, etc.) Does anyone know if there is an easier way to do this?</div><div class=""><span class="Apple-tab-span" style="white-space:pre">      </span>-during the recursive loop, can I find the “main” global value? e.g: when I am on "<i class="">i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*)</i>”, how can I get the global variable <i class="">sSelectedAccount </i>?</div></div></div></blockquote><div><br class=""></div></div><br class=""><div class="">What about keeping track of “visited” global in a side structure (hash map…) and skip these?</div><div class=""><br class=""></div><div class="">Note also that only GlobalValue can create cycles, so you’d need only to track these, not all constant.</div><div class=""><br class=""></div><div class="">— </div><div class="">Mehdi</div><div class=""><br class=""></div></body></html>