blob: 3fba88dc45ddd0afa2a55ff58b0d374591b8d20f [file] [log] [blame]
Alex Bradburya3376752017-11-08 13:41:21 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3; RUN: | FileCheck -check-prefix=RV32I %s
4
5declare i32 @external_function(i32)
6
7define i32 @test_call_external(i32 %a) nounwind {
8; RV32I-LABEL: test_call_external:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +00009; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000010; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000011; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000012; RV32I-NEXT: sw s0, 8(sp)
13; RV32I-NEXT: addi s0, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000014; RV32I-NEXT: lui a1, %hi(external_function)
15; RV32I-NEXT: addi a1, a1, %lo(external_function)
16; RV32I-NEXT: jalr ra, a1, 0
Alex Bradburyb014e3d2017-12-11 12:34:11 +000017; RV32I-NEXT: lw s0, 8(sp)
Alex Bradbury660bcce2017-12-11 11:53:54 +000018; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000019; RV32I-NEXT: addi sp, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000020; RV32I-NEXT: jalr zero, ra, 0
21 %1 = call i32 @external_function(i32 %a)
22 ret i32 %1
23}
24
25define i32 @defined_function(i32 %a) nounwind {
26; RV32I-LABEL: defined_function:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000027; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000028; RV32I-NEXT: addi sp, sp, -16
29; RV32I-NEXT: sw ra, 12(sp)
30; RV32I-NEXT: sw s0, 8(sp)
31; RV32I-NEXT: addi s0, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000032; RV32I-NEXT: addi a0, a0, 1
Alex Bradburyb014e3d2017-12-11 12:34:11 +000033; RV32I-NEXT: lw s0, 8(sp)
34; RV32I-NEXT: lw ra, 12(sp)
35; RV32I-NEXT: addi sp, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000036; RV32I-NEXT: jalr zero, ra, 0
37 %1 = add i32 %a, 1
38 ret i32 %1
39}
40
41define i32 @test_call_defined(i32 %a) nounwind {
42; RV32I-LABEL: test_call_defined:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000043; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000044; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000045; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000046; RV32I-NEXT: sw s0, 8(sp)
47; RV32I-NEXT: addi s0, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000048; RV32I-NEXT: lui a1, %hi(defined_function)
49; RV32I-NEXT: addi a1, a1, %lo(defined_function)
50; RV32I-NEXT: jalr ra, a1, 0
Alex Bradburyb014e3d2017-12-11 12:34:11 +000051; RV32I-NEXT: lw s0, 8(sp)
Alex Bradbury660bcce2017-12-11 11:53:54 +000052; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000053; RV32I-NEXT: addi sp, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000054; RV32I-NEXT: jalr zero, ra, 0
55 %1 = call i32 @defined_function(i32 %a) nounwind
56 ret i32 %1
57}
58
59define i32 @test_call_indirect(i32 (i32)* %a, i32 %b) nounwind {
60; RV32I-LABEL: test_call_indirect:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000061; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000062; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000063; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000064; RV32I-NEXT: sw s0, 8(sp)
65; RV32I-NEXT: addi s0, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000066; RV32I-NEXT: addi a2, a0, 0
67; RV32I-NEXT: addi a0, a1, 0
68; RV32I-NEXT: jalr ra, a2, 0
Alex Bradburyb014e3d2017-12-11 12:34:11 +000069; RV32I-NEXT: lw s0, 8(sp)
Alex Bradbury660bcce2017-12-11 11:53:54 +000070; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000071; RV32I-NEXT: addi sp, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000072; RV32I-NEXT: jalr zero, ra, 0
73 %1 = call i32 %a(i32 %b)
74 ret i32 %1
75}
76
77; Ensure that calls to fastcc functions aren't rejected. Such calls may be
78; introduced when compiling with optimisation.
79
80define fastcc i32 @fastcc_function(i32 %a, i32 %b) nounwind {
81; RV32I-LABEL: fastcc_function:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000082; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000083; RV32I-NEXT: addi sp, sp, -16
84; RV32I-NEXT: sw ra, 12(sp)
85; RV32I-NEXT: sw s0, 8(sp)
86; RV32I-NEXT: addi s0, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000087; RV32I-NEXT: add a0, a0, a1
Alex Bradburyb014e3d2017-12-11 12:34:11 +000088; RV32I-NEXT: lw s0, 8(sp)
89; RV32I-NEXT: lw ra, 12(sp)
90; RV32I-NEXT: addi sp, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +000091; RV32I-NEXT: jalr zero, ra, 0
92 %1 = add i32 %a, %b
93 ret i32 %1
94}
95
96define i32 @test_call_fastcc(i32 %a, i32 %b) nounwind {
97; RV32I-LABEL: test_call_fastcc:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000098; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000099; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +0000100; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000101; RV32I-NEXT: sw s0, 8(sp)
102; RV32I-NEXT: sw s1, 4(sp)
103; RV32I-NEXT: addi s0, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +0000104; RV32I-NEXT: addi s1, a0, 0
105; RV32I-NEXT: lui a0, %hi(fastcc_function)
106; RV32I-NEXT: addi a2, a0, %lo(fastcc_function)
107; RV32I-NEXT: addi a0, s1, 0
108; RV32I-NEXT: jalr ra, a2, 0
109; RV32I-NEXT: addi a0, s1, 0
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000110; RV32I-NEXT: lw s1, 4(sp)
111; RV32I-NEXT: lw s0, 8(sp)
Alex Bradbury660bcce2017-12-11 11:53:54 +0000112; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000113; RV32I-NEXT: addi sp, sp, 16
Alex Bradburya3376752017-11-08 13:41:21 +0000114; RV32I-NEXT: jalr zero, ra, 0
115 %1 = call fastcc i32 @fastcc_function(i32 %a, i32 %b)
116 ret i32 %a
117}