135 lines
4.4 KiB
LLVM
135 lines
4.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -verify-machineinstrs -mtriple=wasm32-unknown-unknown < %s | FileCheck -check-prefix=WASM32 %s
|
|
|
|
@"\01LC" = internal constant [11 x i8] c"buf == %s\0A\00" ; <ptr> [#uses=1]
|
|
|
|
define void @test(ptr %a) nounwind ssp {
|
|
; WASM32-LABEL: test:
|
|
; WASM32: .functype test (i32) -> ()
|
|
; WASM32-NEXT: .local i32
|
|
; WASM32-NEXT: # %bb.0: # %entry
|
|
; WASM32-NEXT: global.get __stack_pointer
|
|
; WASM32-NEXT: i32.const 32
|
|
; WASM32-NEXT: i32.sub
|
|
; WASM32-NEXT: local.tee 1
|
|
; WASM32-NEXT: global.set __stack_pointer
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: local.get 0
|
|
; WASM32-NEXT: i32.store 16
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 0
|
|
; WASM32-NEXT: i32.load __stack_chk_guard
|
|
; WASM32-NEXT: i32.store 28
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 20
|
|
; WASM32-NEXT: i32.add
|
|
; WASM32-NEXT: local.get 0
|
|
; WASM32-NEXT: call strcpy
|
|
; WASM32-NEXT: drop
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 20
|
|
; WASM32-NEXT: i32.add
|
|
; WASM32-NEXT: i32.store 0
|
|
; WASM32-NEXT: i32.const LC
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: call printf
|
|
; WASM32-NEXT: drop
|
|
; WASM32-NEXT: block
|
|
; WASM32-NEXT: i32.const 0
|
|
; WASM32-NEXT: i32.load __stack_chk_guard
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.load 28
|
|
; WASM32-NEXT: i32.eq
|
|
; WASM32-NEXT: br_if 0 # 0: down to label0
|
|
; WASM32-NEXT: # %bb.1: # %return
|
|
; WASM32-NEXT: call __stack_chk_fail
|
|
; WASM32-NEXT: unreachable
|
|
; WASM32-NEXT: .LBB0_2: # %return
|
|
; WASM32-NEXT: end_block # label0:
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 32
|
|
; WASM32-NEXT: i32.add
|
|
; WASM32-NEXT: global.set __stack_pointer
|
|
; WASM32-NEXT: # fallthrough-return
|
|
entry:
|
|
%a_addr = alloca ptr ; <ptr> [#uses=2]
|
|
%buf = alloca [8 x i8] ; <ptr> [#uses=2]
|
|
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
|
|
store ptr %a, ptr %a_addr
|
|
%0 = load ptr, ptr %a_addr, align 4 ; <ptr> [#uses=1]
|
|
%1 = call ptr @strcpy(ptr %buf, ptr %0) nounwind ; <ptr> [#uses=0]
|
|
%2 = call i32 (ptr, ...) @printf(ptr @"\01LC", ptr %buf) nounwind ; <i32> [#uses=0]
|
|
br label %return
|
|
|
|
return: ; preds = %entry
|
|
ret void
|
|
}
|
|
|
|
define i32 @test_return_i32(ptr %a) nounwind ssp {
|
|
; WASM32-LABEL: test_return_i32:
|
|
; WASM32: .functype test_return_i32 (i32) -> (i32)
|
|
; WASM32-NEXT: .local i32
|
|
; WASM32-NEXT: # %bb.0: # %entry
|
|
; WASM32-NEXT: global.get __stack_pointer
|
|
; WASM32-NEXT: i32.const 32
|
|
; WASM32-NEXT: i32.sub
|
|
; WASM32-NEXT: local.tee 1
|
|
; WASM32-NEXT: global.set __stack_pointer
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: local.get 0
|
|
; WASM32-NEXT: i32.store 16
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 0
|
|
; WASM32-NEXT: i32.load __stack_chk_guard
|
|
; WASM32-NEXT: i32.store 28
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 20
|
|
; WASM32-NEXT: i32.add
|
|
; WASM32-NEXT: local.get 0
|
|
; WASM32-NEXT: call strcpy
|
|
; WASM32-NEXT: drop
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 20
|
|
; WASM32-NEXT: i32.add
|
|
; WASM32-NEXT: i32.store 0
|
|
; WASM32-NEXT: i32.const LC
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: call printf
|
|
; WASM32-NEXT: drop
|
|
; WASM32-NEXT: block
|
|
; WASM32-NEXT: i32.const 0
|
|
; WASM32-NEXT: i32.load __stack_chk_guard
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.load 28
|
|
; WASM32-NEXT: i32.eq
|
|
; WASM32-NEXT: br_if 0 # 0: down to label1
|
|
; WASM32-NEXT: # %bb.1: # %return
|
|
; WASM32-NEXT: call __stack_chk_fail
|
|
; WASM32-NEXT: unreachable
|
|
; WASM32-NEXT: .LBB1_2: # %return
|
|
; WASM32-NEXT: end_block # label1:
|
|
; WASM32-NEXT: local.get 1
|
|
; WASM32-NEXT: i32.const 32
|
|
; WASM32-NEXT: i32.add
|
|
; WASM32-NEXT: global.set __stack_pointer
|
|
; WASM32-NEXT: i32.const 0
|
|
; WASM32-NEXT: # fallthrough-return
|
|
entry:
|
|
%a_addr = alloca ptr ; <ptr> [#uses=2]
|
|
%buf = alloca [8 x i8] ; <ptr> [#uses=2]
|
|
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
|
|
store ptr %a, ptr %a_addr
|
|
%0 = load ptr, ptr %a_addr, align 4 ; <ptr> [#uses=1]
|
|
%1 = call ptr @strcpy(ptr %buf, ptr %0) nounwind ; <ptr> [#uses=0]
|
|
%2 = call i32 (ptr, ...) @printf(ptr @"\01LC", ptr %buf) nounwind ; <i32> [#uses=0]
|
|
br label %return
|
|
|
|
return: ; preds = %entry
|
|
ret i32 0
|
|
}
|
|
|
|
declare ptr @strcpy(ptr, ptr) nounwind
|
|
|
|
declare i32 @printf(ptr, ...) nounwind
|