1; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -verify-machineinstrs | FileCheck %s 2; RUN: llc < %s -asm-verbose=false -wasm-keep-registers -fast-isel -verify-machineinstrs | FileCheck %s 3 4; Test that FastISel does not generate instructions with NoReg 5 6target triple = "wasm32-unknown-unknown" 7 8; CHECK: i32.const $push0=, 0 9define hidden i32 @a() #0 { 10entry: 11 ret i32 zext (i1 icmp eq (void (...)* inttoptr (i32 10 to void (...)*), void (...)* null) to i32) 12} 13 14; CHECK: i32.const $push0=, 1 15; CHECK: br_if 0, $pop0 16define hidden i32 @b() #0 { 17entry: 18 br i1 icmp eq (void (...)* inttoptr (i32 10 to void (...)*), void (...)* null), label %a, label %b 19a: 20 unreachable 21b: 22 ret i32 0 23} 24 25; CHECK: i32.const $push1=, 0 26; CHECK: i32.const $push2=, 0 27; CHECK: i32.store 0($pop1), $pop2 28define hidden i32 @c() #0 { 29entry: 30 store i32 zext (i1 icmp eq (void (...)* inttoptr (i32 10 to void (...)*), void (...)* null) to i32), i32* inttoptr (i32 0 to i32 *) 31 ret i32 0 32} 33 34; CHECK: i32.const {{.*}}, addr 35; CHECK: i32.const {{.*}}, 24 36; CHECK: i32.shl 37; CHECK: i32.const {{.*}}, 24 38; CHECK: i32.shr_s 39; CHECK: i32.const {{.*}}, 64 40; CHECK: i32.lt_s 41; CHECK: i32.const {{.*}}, 1 42; CHECK: i32.and 43; CHECK: i32.eqz 44; CHECK: br_if 0, $pop{{[0-9]+}} 45define hidden i32 @d() #0 { 46entry: 47 %t = icmp slt i8 ptrtoint (void ()* @addr to i8), 64 48 br i1 %t, label %a, label %b 49a: 50 unreachable 51b: 52 ret i32 0 53} 54 55; CHECK: i32.const {{.*}}, addr 56; CHECK: i32.const {{.*}}, 255 57; CHECK: i32.and 58; CHECK: i32.const {{.*}}, 64 59; CHECK: i32.lt_u 60; CHECK: i32.const {{.*}}, 1 61; CHECK: i32.and 62; CHECK: i32.eqz 63; CHECK: br_if 0, $pop{{[0-9]+}} 64define hidden i32 @e() #0 { 65entry: 66 %t = icmp ult i8 ptrtoint (void ()* @addr to i8), 64 67 br i1 %t, label %a, label %b 68a: 69 unreachable 70b: 71 ret i32 0 72} 73 74; CHECK: i32.const {{.*}}, addr 75; CHECK: i32.const {{.*}}, 24 76; CHECK: i32.shl 77; CHECK: i32.const {{.*}}, 24 78; CHECK: i32.shr_s 79define hidden i32 @f() #0 { 80entry: 81 %t = sext i8 ptrtoint (void ()* @addr to i8) to i32 82 ret i32 %t 83} 84 85; CHECK: i32.const {{.*}}, addr 86; CHECK: i32.const {{.*}}, 255 87; CHECK: i32.and 88define hidden i32 @g() #0 { 89entry: 90 %t = zext i8 ptrtoint (void ()* @addr to i8) to i32 91 ret i32 %t 92} 93 94declare void @addr() 95 96attributes #0 = { noinline optnone } 97