<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/138394>138394</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[WebAssembly] Loop that shouldn't be given a return type
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Photosounder
</td>
</tr>
</table>
<pre>
I could be wrong about this one because Wasm control flow is confusing, but I'm 85% sure this C function compiles to something it shouldn't:
```c
intmax_t make_power_of_10_int(int p)
{
intmax_t v = 1;
while (p >= 5) { v *= 100000; p -= 5; }
while (p >= 1) { v *= 10; p -= 1; }
return v;
}
```
Using `-Oz` this compiles to:
```
make_power_of_10_int:
i64.const 1
local.set 1
loop i64
block
local.get 0
i32.const 4
i32.gt_s
br_if 0
block
loop
local.get 0
i32.const 1
i32.lt_s
br_if 1
local.get 0
i32.const -1
i32.add
local.set 0
local.get 1
i64.const 10
i64.mul
local.set 1
br 0
end_loop
end_block
local.get 1
return
end_block
local.get 0
i32.const -5
i32.add
local.set 0
local.get 1
i64.const 100000
i64.mul
local.set 1
br 0
end_loop
end_function
```
The problem is that:
- The first (outermost) loop has a `i64` return type, but at the 4th line from the bottom `local.set 1` empties the stack.
- This loop branches unconditionally with `br 0`, so even if there was something in the stack it could never be used.
- This loop and the whole function can only end through `return`.
- The result is stored in `local1` anyway, I can't see why the loop would need a return type.
Therefore the most immediately obvious conclusion is that giving that loop a return type is a mistake because it doesn't actually return anything (due to empty stack) and it can never exit normally anyway.
This problem seems specific to `-Oz` as the other optimisation settings produce totally different Wasm.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVk2P4zYP_jXKhUhgy_k85DCz8w6wwAu0hxZ7DGSbsdWRJUOikk1_fUHZ-ZzJokCFADO2yIcPH8qkVAi6sYhbsXgVi7eJitQ6v_29deSCi7ZGPyldfdp-h8pFU0OJcPTONqBKFwmo1QGcRSixUjEg_FChg8pZ8s7A3rgj6MDP-xi0bYT8BmUk-C7kqoP1QsgFhOhxwPkG-2gr0s5C5bpeGwxADoLrkFptG9AEoWUaVsgVieJFZOm3zIZfJbIXbalTP3cEnfrAXe-O6Hduv8uznbYk5Fpbgl7IDfutXhPA5uJzAFG8QS6K1xE52xxbbRCEXPcgiv_x9kLIDYjVK1vLl-SQ8RLFK_QwHUyKVxCrt2cQ-RcQ7MJrhMhvIRjFI0Vv4TCSG3bOmQ9Wf7LGIJbZ9Le_xTIbVL2R8rNiInv5UqdkyGz0cj6rnA0E-fjGuEqZWUCC88oH0POjca6Hu6WXc94vjas-7m2vgM0FMHvY14UcKQwrYfHLhnbhwbb0O72_ec4-h0tmI5PE9WuTp8we6eRPnNnOfGZ4zzT_j8Gnv4qu6nrI8b5gTzT5KmZCvx6B8eVjgS4xl_NZF81XMX-RZ-nvnxM62no31ubRnrf-5UlK9Ifv5rPxE5xHjCfCA0wXN143ct_hhAecqzbNwwd0K-J9oLG73Js80fmT0o_q3n9eNzKfVT-34M_d5Y8WofeuNNhxU6dWjX1iCry11z4QdzkXCX3nAnGTS82gVQEU9yVuBMtsLAnQqcfzRFA8SxDm1ILRFmHvXZfelI7Idex8zTVnEOx60tzWWoRAqvqYjVR0GKKWXtmqxQDRVs7WmrNSxpzgqKllwNJDyk5-g-AAD2hB7xnPIxxVuB089hqGp9AwCy0e0PNEjAHrx-jK1snn2DqDN4NNWXDWnFhroNa72CQu4yldZrOLoB5DNMRSB3Iea2ZxliEpoOzpqE5M_zvj8kyEgBzylEInHseRKtagboWfXYrqce_SCEbgqoHuOqy1IjQncOVBu5gmeGVi4AzG0kOjDyxN-n_I-BaezRR0OpD6uN4ONEHtMAxUVUUx1WN0U_Y0qC3kuo7Io59rfBpk58PEmrL6yo7a409NYJ3vEs6gxyUxHS7HNSB2AUKPld7ripGvQ1INR8hx3cH1pDsdVKpVQCJtmwRTx4oZUQpU6_0ePVpK153ZpN4W9abYqAlu89V8KVeLRZ5P2m22yVZyhXOl6s26ynAu5_VmnRW5wjyf1zjRW5nJRbbIilwW-SKfFaUsN_sMi7lcr6o6F_MMO6XNzJhDN3O-megQIm7zYl1s5hOjSjQhXd6ktMiXrRBRSMl3Ob9lp2kZmyDmmdGBwhWGNJl06_uB5UsI2JXmJBZv8H-uZKrpzU2Lz3ij-fu4q_EkerNtifrAfUC-C_neaGpjOatcJ-Q7Bxv_THvv_sKKhHxPFIOQ72MOh638JwAA__-z1QqK">