<div dir="ltr">We could maybe work around this after/during cfg-stackification by looking for block/loop fallthrough-returns and fabricating some value to make it typecheck. Could this also happen with an infinite loop inside some other construct?</div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 16, 2016 at 3:04 PM Derek Schuff <<a href="mailto:dschuff@google.com">dschuff@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Hm, didn't realize that it was valid. Although I put that workaround in my local git the other day and just today realized that there are other C tests that result in the same kind of IR, so yes, I was probably about to discover that :)<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Anyway yes, if you have:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><div class="gmail_msg">target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"</div><div class="gmail_msg">target triple = "wasm32-unknown-unknown"</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">define i32 @minimal_loop(i32* %p) {</div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">entry:</div><div class="gmail_msg">  store volatile i32 0, i32* %p</div><div class="gmail_msg">  br label %loop</div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">loop:</div><div class="gmail_msg">  store volatile i32 1, i32* %p</div><div class="gmail_msg">  br label %loop</div><div class="gmail_msg">}</div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">You get:</div><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">  </span>.text</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>.file<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">   </span>"infloop.ll"</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">       </span>.globl<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">  </span>minimal_loop</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap"> </span>.type<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">   </span>minimal_loop,@function</div><div class="gmail_msg">minimal_loop:                           # @minimal_loop</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>.param  <span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">       </span>i32</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">  </span>.result <span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>i32</div><div class="gmail_msg"># BB#0:                                 # %entry</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">       </span>i32.const<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">       </span>$push0=, 0</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">   </span>i32.store<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">       </span>$drop=, 0($0), $pop0</div><div class="gmail_msg">.LBB0_1:                                # %loop</div><div class="gmail_msg">                                        # =>This Inner Loop Header: Depth=1</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">  </span>loop                            # label0:</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">      </span>i32.const<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">       </span>$push1=, 1</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">   </span>i32.store<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">       </span>$drop=, 0($0), $pop1</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap"> </span>br      <span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">     </span>0               # 0: up to label0</div><div class="gmail_msg">.LBB0_2:</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">  </span>end_loop                        # label1:</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">        </span>.endfunc</div><div class="gmail_msg">.Lfunc_end0:</div><div class="gmail_msg"><span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">      </span>.size<span class="m_6101843070092953747Apple-tab-span gmail_msg" style="white-space:pre-wrap">   </span>minimal_loop, .Lfunc_end0-minimal_loop</div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">which is the following (bearing in mind Binaryen's current almost-but-not-quite-0xc state):</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><div class="gmail_msg">(module</div><div class="gmail_msg">  (memory 1)</div><div class="gmail_msg">  (export "memory" (memory $0))</div><div class="gmail_msg">  (export "minimal_loop" (func $minimal_loop))</div><div class="gmail_msg">  (func $minimal_loop (param $0 i32) (result i32)</div><div class="gmail_msg">    (drop</div><div class="gmail_msg">      (i32.store</div><div class="gmail_msg">        (get_local $0)</div><div class="gmail_msg">        (i32.const 0)</div><div class="gmail_msg">      )</div><div class="gmail_msg">    )</div><div class="gmail_msg">    (block $label$1</div><div class="gmail_msg">      (loop $label$0</div><div class="gmail_msg">        (drop</div><div class="gmail_msg">          (i32.store</div><div class="gmail_msg">            (get_local $0)</div><div class="gmail_msg">            (i32.const 1)</div><div class="gmail_msg">          )</div><div class="gmail_msg">        )</div><div class="gmail_msg">        (br $label$0)</div><div class="gmail_msg">      )</div><div class="gmail_msg">    )</div><div class="gmail_msg">  )</div><div class="gmail_msg">)</div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Which you could simplify to</div><div class="gmail_msg"><div class="gmail_msg">(module</div><div class="gmail_msg">  (func $minimal_loop (param $0 i32) (result i32)</div><div class="gmail_msg">    (block $label$1</div><div class="gmail_msg">      (loop $label$0</div><div class="gmail_msg">        (br $label$0)</div><div class="gmail_msg">      )</div><div class="gmail_msg">    )</div><div class="gmail_msg">  )</div><div class="gmail_msg">)</div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Which is a type check failure because the loop/block structure yields/pushes no value but the function expects an i32 return.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div></div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Fri, Sep 16, 2016 at 2:38 PM Dan Gohman <<a href="mailto:sunfish@mozilla.com" class="gmail_msg" target="_blank">sunfish@mozilla.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg">On Fri, Sep 16, 2016 at 1:58 PM, Derek Schuff via llvm-commits <span dir="ltr" class="gmail_msg"><<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dschuff<br class="gmail_msg">
Date: Fri Sep 16 15:58:31 2016<br class="gmail_msg">
New Revision: 281773<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=281773&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=281773&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[WebAssembly] Fix function types of CFGStackify tests<br class="gmail_msg">
<br class="gmail_msg">
Make the function's declared type match its (lack of) return type<br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll?rev=281773&r1=281772&r2=281773&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll?rev=281773&r1=281772&r2=281773&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll (original)<br class="gmail_msg">
+++ llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll Fri Sep 16 15:58:31 2016<br class="gmail_msg">
@@ -284,7 +284,7 @@ entry:<br class="gmail_msg">
 ; OPT: i32.store $drop=, 0($0), $pop{{[0-9]+}}{{$}}<br class="gmail_msg">
 ; OPT: br 0{{$}}<br class="gmail_msg">
 ; OPT: .LBB7_2:<br class="gmail_msg">
-define i32 @minimal_loop(i32* %p) {<br class="gmail_msg">
+define void @minimal_loop(i32* %p) {<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">The previous code with a non-void return type and an infinite loop instead of a return is valid in LLVM IR, so the backend should be able to handle it. Was this code triggering a bug?<br class="gmail_msg"><br class="gmail_msg"></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">Dan<br class="gmail_msg"><br class="gmail_msg"></div></div></div></div></blockquote></div></blockquote></div>