https://bugs.llvm.org/show_bug.cgi?id=38019

            Bug ID: 38019
           Summary: WebAssembly: Inverting i1 at O0 produces invalid code
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: WebAssembly
          Assignee: unassignedb...@nondot.org
          Reporter: a...@crichton.co
                CC: dan433...@gmail.com, llvm-bugs@lists.llvm.org

Created attachment 20507
  --> https://bugs.llvm.org/attachment.cgi?id=20507&action=edit
IR

First discovered as an innocuous TODO [1] it looks like LLVM's code generation
for i1 may not be valid for WebAssembly when compiling at O0. Starting with
Rust code that looks like:


extern {
    fn return_one() -> u32;
    fn panic() -> !;
}

#[no_mangle]
pub unsafe extern fn test() {
    let tmp: bool = !(return_one() == 1);
    if tmp { panic() }
    if !tmp { panic() }
}


it then generates the attached IR (also linked [2]). When this IR is complied
with:

    llc foo.ll -filetype=obj -o foo.o -O0

it generates this wasm file [3]. The wasm file notably contains:

  (set_local $var$4
   (i32.eq
    (get_local $var$2)
    (get_local $var$3)
   )
  )
  (set_local $var$5
   (i32.const -1)
  )
  (set_local $var$6
   (i32.xor
    (get_local $var$4)
    (get_local $var$5)
   )
  )

which looks like it's equating a variable (correctly) into $var$4, but then it
attempts to invert this variable with an i32.xor instruction which xors either
1 or 0, so the xor of 1 doesn't work (generates 0xfffffffc instead of 0).

I can provide an example running in the browser as well if necessary, but it
may also suffice to say that when run in Firefox the above Rust code executes
successfully! (unexpectedly)

[1]:
https://github.com/rustwasm/wasm-bindgen/blob/dcb3415da8650b918e5b7f6d65ab071fff7aa6fa/tests/all/webidl/simple.rs#L46-L47
[2]:
https://gist.github.com/alexcrichton/2baf6f95f00275858c8b81d6eff25327#file-foo-ll
[3]: https://gist.github.com/alexcrichton/e5cafad8455795aff2c40652fe4d4dc3

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to