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 datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 7target triple = "wasm32-unknown-unknown" 8 9; CHECK: i32.const $push0=, 0 10define hidden i32 @a() #0 { 11entry: 12 ret i32 zext (i1 icmp eq (void (...)* inttoptr (i32 10 to void (...)*), void (...)* null) to i32) 13} 14 15; CHECK: i32.const $push0=, 1 16; CHECK: br_if 0, $pop0 17define hidden i32 @b() #0 { 18entry: 19 br i1 icmp eq (void (...)* inttoptr (i32 10 to void (...)*), void (...)* null), label %a, label %b 20a: 21 unreachable 22b: 23 ret i32 0 24} 25 26; CHECK: i32.const $push1=, 0 27; CHECK: i32.const $push2=, 0 28; CHECK: i32.store 0($pop1), $pop2 29define hidden i32 @c() #0 { 30entry: 31 store i32 zext (i1 icmp eq (void (...)* inttoptr (i32 10 to void (...)*), void (...)* null) to i32), i32* inttoptr (i32 0 to i32 *) 32 ret i32 0 33} 34 35; CHECK: i32.const {{.*}}, addr 36; CHECK: i32.const {{.*}}, 24 37; CHECK: i32.shl 38; CHECK: i32.const {{.*}}, 24 39; CHECK: i32.shr_s 40; CHECK: i32.const {{.*}}, 64 41; CHECK: i32.lt_s 42; CHECK: i32.const {{.*}}, 1 43; CHECK: i32.and 44; CHECK: i32.eqz 45; CHECK: br_if 0, $pop{{[0-9]+}} 46define hidden i32 @d() #0 { 47entry: 48 %t = icmp slt i8 ptrtoint (void ()* @addr to i8), 64 49 br i1 %t, label %a, label %b 50a: 51 unreachable 52b: 53 ret i32 0 54} 55 56; CHECK: i32.const {{.*}}, addr 57; CHECK: i32.const {{.*}}, 255 58; CHECK: i32.and 59; CHECK: i32.const {{.*}}, 64 60; CHECK: i32.lt_u 61; CHECK: i32.const {{.*}}, 1 62; CHECK: i32.and 63; CHECK: i32.eqz 64; CHECK: br_if 0, $pop{{[0-9]+}} 65define hidden i32 @e() #0 { 66entry: 67 %t = icmp ult i8 ptrtoint (void ()* @addr to i8), 64 68 br i1 %t, label %a, label %b 69a: 70 unreachable 71b: 72 ret i32 0 73} 74 75; CHECK: i32.const {{.*}}, addr 76; CHECK: i32.const {{.*}}, 24 77; CHECK: i32.shl 78; CHECK: i32.const {{.*}}, 24 79; CHECK: i32.shr_s 80define hidden i32 @f() #0 { 81entry: 82 %t = sext i8 ptrtoint (void ()* @addr to i8) to i32 83 ret i32 %t 84} 85 86; CHECK: i32.const {{.*}}, addr 87; CHECK: i32.const {{.*}}, 255 88; CHECK: i32.and 89define hidden i32 @g() #0 { 90entry: 91 %t = zext i8 ptrtoint (void ()* @addr to i8) to i32 92 ret i32 %t 93} 94 95declare void @addr() 96 97attributes #0 = { noinline optnone } 98