<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Oct 24, 2017, at 8:32 AM, Sam Ding via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class=""><p class=""><font size="2" class="">Hi,</font><br class=""><br class=""><font size="2" class="">It is found that "for" loop iterate and "enum" does not work on s390x.</font><br class=""><font size="2" class="">Here is a sample code:</font><br class="">
</p><ul class=""><ul class=""><font size="2" color="#001FE2" class="">enum IntKey : Int {</font><br class=""><font size="2" color="#001FE2" class="">    case a = 3</font><br class=""><font size="2" color="#001FE2" class="">    case b = 4 // Implicitly 4</font><br class=""><font size="2" color="#001FE2" class="">    case c = 1</font><br class=""><font size="2" color="#001FE2" class="">}</font><br class=""><font size="2" color="#001FE2" class="">for ( a1, a2) in [(IntKey.a, 1)] {</font><br class=""><font size="2" color="#001FE2" class="">   print ("+++++  test \n")</font><br class=""><font size="2" color="#001FE2" class="">} </font></ul></ul><br class=""><font size="2" class="">The for loop  inifinitly iterates on s390x. Note that it works fine if replacing the enum with normal tuple in the above code.</font><br class=""><font size="2" class="">When debugging this code, after one iteration, the logic gets a "nil" in "</font><font size="2" color="#006000" class="">IndexingIterator.next</font><font size="2" class="">()" as follows:</font><br class="">
<ul class=""><font size="2" color="#006000" class="">   ....</font><br class=""><font size="2" color="#006000" class="">    frame #0: 0x000003fffd5b4088 libswiftCore.so`IndexingIterator.next(self=0x000003fffffff460) at </font><b class=""><font size="2" color="#006000" class="">Collection.swift:411</font></b><br class=""><font size="2" color="#006000" class="">   408    @inline(__always)</font><br class=""><font size="2" color="#006000" class="">   409    public mutating func next() -&gt; Elements.Element? {</font><br class=""><font size="2" color="#006000" class="">   410      if _position == _elements.endIndex {</font><br class=""><font size="2" color="#006000" class="">-&gt; 411       </font><b class=""><font size="2" color="#006000" class="">   return nil</font></b><br class=""><font size="2" color="#006000" class="">   412      }</font><br class=""><font size="2" color="#006000" class="">   413      let element = _elements[_position]</font><br class=""><font size="2" class="">..</font></ul><font size="2" class="">Then comes "Enum.cpp:211" (swift::swift_storeEnumTagSinglePayload) and no difference  on both s390x and x86_64.</font><br class=""><font size="2" class="">However, It continues goes into the loop body on s390x, and  terminates  on x86_64, respectively.</font><br class=""><br class=""><font size="2" class="">Have anyones know well this implementation and give us a hint for the problems?</font><br class=""><br class=""><font size="2" class="">Thanks,</font><br class=""><br class=""></div></div></blockquote></div><br class=""><div class="">At a binary level, Swift is going to represent the result of the next() operation as an value of the element type wrapped in an Optional, `(IntKey, Int)?`, and the compiler is going to recognize that it can represent the `nil` case by using unused representations of IntKey. Our code for doing enum layout was originally written in a very little-endian-centric way, and if s390x is big-endian, there's a possibility that the code in IRGen or the runtime that encodes the `nil` result is not correct, or that the runtime and IRGen do not agree on the representation of `nil`. That could lead to the infinite loop you're seeing.</div><div class=""><br class=""></div><div class="">-Joe</div></body></html>