xref: /llvm-project/llvm/test/CodeGen/RISCV/reduce-unnecessary-extension.ll (revision eabaee0c59110d0e11b33a69db54ccda526b35fd)
1eaba81fdSZengZhijin; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2eaba81fdSZengZhijin; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \
3eaba81fdSZengZhijin; RUN:   | FileCheck -check-prefix=RV64I %s
4eaba81fdSZengZhijin
5eaba81fdSZengZhijin@PL_reg_match_utf8 = external global i8, align 1
6eaba81fdSZengZhijin
7eaba81fdSZengZhijindeclare signext i32 @test1(i8 signext)
8eaba81fdSZengZhijin
9eaba81fdSZengZhijindeclare signext i32 @test2(i8 signext)
10eaba81fdSZengZhijin
11eaba81fdSZengZhijindeclare signext i32 @test3(i8 signext)
12eaba81fdSZengZhijin
13eaba81fdSZengZhijindefine signext i32 @test() nounwind {
14eaba81fdSZengZhijin; RV64I-LABEL: test:
15eaba81fdSZengZhijin; RV64I:       # %bb.0:
16eaba81fdSZengZhijin; RV64I-NEXT:    addi sp, sp, -16
17eaba81fdSZengZhijin; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
18eaba81fdSZengZhijin; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
19eaba81fdSZengZhijin; RV64I-NEXT:    lui a0, %hi(PL_reg_match_utf8)
20eaba81fdSZengZhijin; RV64I-NEXT:    lb s0, %lo(PL_reg_match_utf8)(a0)
21eaba81fdSZengZhijin; RV64I-NEXT:    beqz s0, .LBB0_2
22eaba81fdSZengZhijin; RV64I-NEXT:  # %bb.1:
23eaba81fdSZengZhijin; RV64I-NEXT:    mv a0, s0
24*eabaee0cSFangrui Song; RV64I-NEXT:    call test1
25eaba81fdSZengZhijin; RV64I-NEXT:    mv a0, s0
26*eabaee0cSFangrui Song; RV64I-NEXT:    call test2
27eaba81fdSZengZhijin; RV64I-NEXT:    mv a0, s0
28*eabaee0cSFangrui Song; RV64I-NEXT:    call test3
29eaba81fdSZengZhijin; RV64I-NEXT:    j .LBB0_3
30eaba81fdSZengZhijin; RV64I-NEXT:  .LBB0_2:
31eaba81fdSZengZhijin; RV64I-NEXT:    li a0, 0
32*eabaee0cSFangrui Song; RV64I-NEXT:    call test2
33eaba81fdSZengZhijin; RV64I-NEXT:  .LBB0_3:
34eaba81fdSZengZhijin; RV64I-NEXT:    li a0, 0
35eaba81fdSZengZhijin; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
36eaba81fdSZengZhijin; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
37eaba81fdSZengZhijin; RV64I-NEXT:    addi sp, sp, 16
38eaba81fdSZengZhijin; RV64I-NEXT:    ret
39eaba81fdSZengZhijin  %1 = load i8, ptr @PL_reg_match_utf8, align 1
40eaba81fdSZengZhijin  %2 = icmp eq i8 %1, 0
41eaba81fdSZengZhijin  br i1 %2, label %7, label %3
42eaba81fdSZengZhijin
43eaba81fdSZengZhijin3:
44eaba81fdSZengZhijin  %4 = tail call signext i32 @test1(i8 signext %1)
45eaba81fdSZengZhijin  %5 = tail call signext i32 @test2(i8 signext %1)
46eaba81fdSZengZhijin  %6 = tail call signext i32 @test3(i8 signext %1)
47eaba81fdSZengZhijin  br label %9
48eaba81fdSZengZhijin
49eaba81fdSZengZhijin7:
50eaba81fdSZengZhijin  %8 = tail call signext i32 @test2(i8 signext 0)
51eaba81fdSZengZhijin  br label %9
52eaba81fdSZengZhijin
53eaba81fdSZengZhijin9:
54eaba81fdSZengZhijin  ret i32 0
55eaba81fdSZengZhijin}
56eaba81fdSZengZhijin
57eaba81fdSZengZhijin
58eaba81fdSZengZhijindefine signext i32 @test_loop() nounwind {
59eaba81fdSZengZhijin; RV64I-LABEL: test_loop:
60eaba81fdSZengZhijin; RV64I:       # %bb.0:
61eaba81fdSZengZhijin; RV64I-NEXT:    addi sp, sp, -32
62eaba81fdSZengZhijin; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
63eaba81fdSZengZhijin; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
64eaba81fdSZengZhijin; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
65eaba81fdSZengZhijin; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
66eaba81fdSZengZhijin; RV64I-NEXT:    li s1, -16
67eaba81fdSZengZhijin; RV64I-NEXT:    lui s2, %hi(PL_reg_match_utf8)
68eaba81fdSZengZhijin; RV64I-NEXT:    j .LBB1_2
69eaba81fdSZengZhijin; RV64I-NEXT:  .LBB1_1: # in Loop: Header=BB1_2 Depth=1
70eaba81fdSZengZhijin; RV64I-NEXT:    mv a0, s0
71*eabaee0cSFangrui Song; RV64I-NEXT:    call test2
72eaba81fdSZengZhijin; RV64I-NEXT:    addiw s1, s1, 1
73eaba81fdSZengZhijin; RV64I-NEXT:    beqz s1, .LBB1_4
74eaba81fdSZengZhijin; RV64I-NEXT:  .LBB1_2: # =>This Inner Loop Header: Depth=1
75eaba81fdSZengZhijin; RV64I-NEXT:    lb s0, %lo(PL_reg_match_utf8)(s2)
76eaba81fdSZengZhijin; RV64I-NEXT:    beqz s0, .LBB1_1
77eaba81fdSZengZhijin; RV64I-NEXT:  # %bb.3: # in Loop: Header=BB1_2 Depth=1
78eaba81fdSZengZhijin; RV64I-NEXT:    mv a0, s0
79*eabaee0cSFangrui Song; RV64I-NEXT:    call test1
80eaba81fdSZengZhijin; RV64I-NEXT:    mv a0, s0
81*eabaee0cSFangrui Song; RV64I-NEXT:    call test2
82eaba81fdSZengZhijin; RV64I-NEXT:    mv a0, s0
83*eabaee0cSFangrui Song; RV64I-NEXT:    call test3
84eaba81fdSZengZhijin; RV64I-NEXT:    addiw s1, s1, 1
85eaba81fdSZengZhijin; RV64I-NEXT:    bnez s1, .LBB1_2
86eaba81fdSZengZhijin; RV64I-NEXT:  .LBB1_4:
87eaba81fdSZengZhijin; RV64I-NEXT:    li a0, 0
88eaba81fdSZengZhijin; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
89eaba81fdSZengZhijin; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
90eaba81fdSZengZhijin; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
91eaba81fdSZengZhijin; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
92eaba81fdSZengZhijin; RV64I-NEXT:    addi sp, sp, 32
93eaba81fdSZengZhijin; RV64I-NEXT:    ret
94eaba81fdSZengZhijin  br label %1
95eaba81fdSZengZhijin
96eaba81fdSZengZhijin1:
97eaba81fdSZengZhijin  %2 = phi i32 [ 16, %0 ], [ %12, %11 ]
98eaba81fdSZengZhijin  %3 = load i8, ptr @PL_reg_match_utf8, align 1
99eaba81fdSZengZhijin  %4 = icmp eq i8 %3, 0
100eaba81fdSZengZhijin  br i1 %4, label %9, label %5
101eaba81fdSZengZhijin
102eaba81fdSZengZhijin5:
103eaba81fdSZengZhijin  %6 = tail call signext i32 @test1(i8 signext %3)
104eaba81fdSZengZhijin  %7 = tail call signext i32 @test2(i8 signext %3)
105eaba81fdSZengZhijin  %8 = tail call signext i32 @test3(i8 signext %3)
106eaba81fdSZengZhijin  br label %11
107eaba81fdSZengZhijin
108eaba81fdSZengZhijin9:
109eaba81fdSZengZhijin  %10 = tail call signext i32 @test2(i8 signext %3)
110eaba81fdSZengZhijin  br label %11
111eaba81fdSZengZhijin
112eaba81fdSZengZhijin11:
113eaba81fdSZengZhijin  %12 = add nsw i32 %2, -1
114eaba81fdSZengZhijin  %13 = icmp eq i32 %12, 0
115eaba81fdSZengZhijin  br i1 %13, label %14, label %1
116eaba81fdSZengZhijin
117eaba81fdSZengZhijin14:
118eaba81fdSZengZhijin  ret i32 0
119eaba81fdSZengZhijin}
120