xref: /llvm-project/llvm/test/CodeGen/RISCV/macro-fusion-lui-addi.ll (revision aa34a6ab299027ac31929173287e42db0dbdb06b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2;RUN: llc < %s -mtriple=riscv64 -mattr=+f -mcpu=sifive-u74 -target-abi=lp64f \
3;RUN:   | FileCheck %s --check-prefix=NOFUSION
4;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion -mcpu=sifive-u74 \
5;RUN:   -target-abi=lp64f | FileCheck %s --check-prefix=FUSION
6;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion,+use-postra-scheduler -mcpu=sifive-u74 \
7;RUN:   -misched-postra-direction=topdown -target-abi=lp64f \
8;RUN:   | FileCheck %s --check-prefixes=FUSION-POSTRA,FUSION-POSTRA-TOPDOWN
9;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion,+use-postra-scheduler -mcpu=sifive-u74 \
10;RUN:   -misched-postra-direction=bottomup -target-abi=lp64f \
11;RUN:   | FileCheck %s --check-prefixes=FUSION-POSTRA,FUSION-POSTRA-BOTTOMUP
12;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion,+use-postra-scheduler -mcpu=sifive-u74 \
13;RUN:   -misched-postra-direction=bidirectional -target-abi=lp64f \
14;RUN:   | FileCheck %s --check-prefixes=FUSION-POSTRA,FUSION-POSTRA-BIDIRECTIONAL
15;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion -target-abi=lp64f \
16;RUN:   | FileCheck %s --check-prefix=FUSION-GENERIC
17
18@.str = private constant [4 x i8] c"%f\0A\00", align 1
19
20define void @foo(i32 signext %0, i32 signext %1) {
21; NOFUSION-LABEL: foo:
22; NOFUSION:       # %bb.0:
23; NOFUSION-NEXT:    lui a0, %hi(.L.str)
24; NOFUSION-NEXT:    fcvt.s.w fa0, a1
25; NOFUSION-NEXT:    addi a0, a0, %lo(.L.str)
26; NOFUSION-NEXT:    tail bar
27;
28; FUSION-LABEL: foo:
29; FUSION:       # %bb.0:
30; FUSION-NEXT:    lui a0, %hi(.L.str)
31; FUSION-NEXT:    addi a0, a0, %lo(.L.str)
32; FUSION-NEXT:    fcvt.s.w fa0, a1
33; FUSION-NEXT:    tail bar
34;
35; FUSION-POSTRA-TOPDOWN-LABEL: foo:
36; FUSION-POSTRA-TOPDOWN:       # %bb.0:
37; FUSION-POSTRA-TOPDOWN-NEXT:    lui a0, %hi(.L.str)
38; FUSION-POSTRA-TOPDOWN-NEXT:    addi a0, a0, %lo(.L.str)
39; FUSION-POSTRA-TOPDOWN-NEXT:    fcvt.s.w fa0, a1
40; FUSION-POSTRA-TOPDOWN-NEXT:    tail bar
41;
42; FUSION-POSTRA-BOTTOMUP-LABEL: foo:
43; FUSION-POSTRA-BOTTOMUP:       # %bb.0:
44; FUSION-POSTRA-BOTTOMUP-NEXT:    fcvt.s.w fa0, a1
45; FUSION-POSTRA-BOTTOMUP-NEXT:    lui a0, %hi(.L.str)
46; FUSION-POSTRA-BOTTOMUP-NEXT:    addi a0, a0, %lo(.L.str)
47; FUSION-POSTRA-BOTTOMUP-NEXT:    tail bar
48;
49; FUSION-POSTRA-BIDIRECTIONAL-LABEL: foo:
50; FUSION-POSTRA-BIDIRECTIONAL:       # %bb.0:
51; FUSION-POSTRA-BIDIRECTIONAL-NEXT:    lui a0, %hi(.L.str)
52; FUSION-POSTRA-BIDIRECTIONAL-NEXT:    addi a0, a0, %lo(.L.str)
53; FUSION-POSTRA-BIDIRECTIONAL-NEXT:    fcvt.s.w fa0, a1
54; FUSION-POSTRA-BIDIRECTIONAL-NEXT:    tail bar
55;
56; FUSION-GENERIC-LABEL: foo:
57; FUSION-GENERIC:       # %bb.0:
58; FUSION-GENERIC-NEXT:    fcvt.s.w fa0, a1
59; FUSION-GENERIC-NEXT:    lui a0, %hi(.L.str)
60; FUSION-GENERIC-NEXT:    addi a0, a0, %lo(.L.str)
61; FUSION-GENERIC-NEXT:    tail bar
62  %3 = sitofp i32 %1 to float
63  tail call void @bar(ptr @.str, float %3)
64  ret void
65}
66
67declare void @bar(ptr, float)
68
69; Test that we prefer lui+addiw over li+slli.
70define i32 @test_matint() {
71; NOFUSION-LABEL: test_matint:
72; NOFUSION:       # %bb.0:
73; NOFUSION-NEXT:    li a0, 1
74; NOFUSION-NEXT:    slli a0, a0, 11
75; NOFUSION-NEXT:    ret
76;
77; FUSION-LABEL: test_matint:
78; FUSION:       # %bb.0:
79; FUSION-NEXT:    lui a0, 1
80; FUSION-NEXT:    addiw a0, a0, -2048
81; FUSION-NEXT:    ret
82;
83; FUSION-POSTRA-LABEL: test_matint:
84; FUSION-POSTRA:       # %bb.0:
85; FUSION-POSTRA-NEXT:    lui a0, 1
86; FUSION-POSTRA-NEXT:    addiw a0, a0, -2048
87; FUSION-POSTRA-NEXT:    ret
88;
89; FUSION-GENERIC-LABEL: test_matint:
90; FUSION-GENERIC:       # %bb.0:
91; FUSION-GENERIC-NEXT:    lui a0, 1
92; FUSION-GENERIC-NEXT:    addiw a0, a0, -2048
93; FUSION-GENERIC-NEXT:    ret
94  ret i32 2048
95}
96
97define void @test_regalloc_hint(i32 noundef signext %0, i32 noundef signext %1) {
98; NOFUSION-LABEL: test_regalloc_hint:
99; NOFUSION:       # %bb.0:
100; NOFUSION-NEXT:    mv a0, a1
101; NOFUSION-NEXT:    lui a1, 3014
102; NOFUSION-NEXT:    addiw a1, a1, 334
103; NOFUSION-NEXT:    tail bar
104;
105; FUSION-LABEL: test_regalloc_hint:
106; FUSION:       # %bb.0:
107; FUSION-NEXT:    mv a0, a1
108; FUSION-NEXT:    lui a1, 3014
109; FUSION-NEXT:    addiw a1, a1, 334
110; FUSION-NEXT:    tail bar
111;
112; FUSION-POSTRA-LABEL: test_regalloc_hint:
113; FUSION-POSTRA:       # %bb.0:
114; FUSION-POSTRA-NEXT:    mv a0, a1
115; FUSION-POSTRA-NEXT:    lui a1, 3014
116; FUSION-POSTRA-NEXT:    addiw a1, a1, 334
117; FUSION-POSTRA-NEXT:    tail bar
118;
119; FUSION-GENERIC-LABEL: test_regalloc_hint:
120; FUSION-GENERIC:       # %bb.0:
121; FUSION-GENERIC-NEXT:    lui a2, 3014
122; FUSION-GENERIC-NEXT:    addiw a2, a2, 334
123; FUSION-GENERIC-NEXT:    mv a0, a1
124; FUSION-GENERIC-NEXT:    mv a1, a2
125; FUSION-GENERIC-NEXT:    tail bar
126  tail call void @bar(i32 noundef signext %1, i32 noundef signext 12345678)
127  ret void
128}
129