xref: /llvm-project/llvm/test/CodeGen/RISCV/vlenb.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -O3 < %s -mtriple=riscv32 | FileCheck %s
3
4; These tests demonstrate optimizations involving copies from VLENB.
5
6define void @unused_copy_is_dead() {
7; CHECK-LABEL: unused_copy_is_dead:
8; CHECK:       # %bb.0: # %entry
9; CHECK-NEXT:    ret
10entry:
11  call i32 @llvm.read_register.i32(metadata !0)
12  ret void
13}
14
15define i32 @simple_cse() {
16; CHECK-LABEL: simple_cse:
17; CHECK:       # %bb.0: # %entry
18; CHECK-NEXT:    csrr a0, vlenb
19; CHECK-NEXT:    sub a0, a0, a0
20; CHECK-NEXT:    ret
21entry:
22  %v1 = call i32 @llvm.read_register.i32(metadata !0)
23  %v2 = call i32 @llvm.read_register.i32(metadata !0)
24  %sub = sub i32 %v1, %v2
25  ret i32 %sub
26}
27
28define i32 @sink_to_use_branch(i1 %c) {
29; CHECK-LABEL: sink_to_use_branch:
30; CHECK:       # %bb.0: # %entry
31; CHECK-NEXT:    andi a0, a0, 1
32; CHECK-NEXT:    beqz a0, .LBB2_2
33; CHECK-NEXT:  # %bb.1: # %used
34; CHECK-NEXT:    csrr a0, vlenb
35; CHECK-NEXT:  .LBB2_2: # %unused
36; CHECK-NEXT:    ret
37entry:
38  %v1 = call i32 @llvm.read_register.i32(metadata !0)
39  br i1 %c, label %used, label %unused
40used:
41  ret i32 %v1
42unused:
43  ret i32 0
44}
45
46define i32 @sink_to_use_call() {
47; CHECK-LABEL: sink_to_use_call:
48; CHECK:       # %bb.0: # %entry
49; CHECK-NEXT:    addi sp, sp, -16
50; CHECK-NEXT:    .cfi_def_cfa_offset 16
51; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
52; CHECK-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
53; CHECK-NEXT:    .cfi_offset ra, -4
54; CHECK-NEXT:    .cfi_offset s0, -8
55; CHECK-NEXT:    csrr s0, vlenb
56; CHECK-NEXT:    call unknown
57; CHECK-NEXT:    mv a0, s0
58; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
59; CHECK-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
60; CHECK-NEXT:    .cfi_restore ra
61; CHECK-NEXT:    .cfi_restore s0
62; CHECK-NEXT:    addi sp, sp, 16
63; CHECK-NEXT:    .cfi_def_cfa_offset 0
64; CHECK-NEXT:    ret
65entry:
66  %v1 = call i32 @llvm.read_register.i32(metadata !0)
67  call void @unknown() ; maythrow
68  ret i32 %v1
69}
70
71define void @machine_licm() {
72; CHECK-LABEL: machine_licm:
73; CHECK:       # %bb.0: # %entry
74; CHECK-NEXT:    addi sp, sp, -16
75; CHECK-NEXT:    .cfi_def_cfa_offset 16
76; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
77; CHECK-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
78; CHECK-NEXT:    .cfi_offset ra, -4
79; CHECK-NEXT:    .cfi_offset s0, -8
80; CHECK-NEXT:    csrr s0, vlenb
81; CHECK-NEXT:  .LBB4_1: # %loop
82; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
83; CHECK-NEXT:    mv a0, s0
84; CHECK-NEXT:    call use
85; CHECK-NEXT:    j .LBB4_1
86entry:
87  br label %loop
88
89loop:
90  %v1 = call i32 @llvm.read_register.i32(metadata !0)
91  call void @use(i32 %v1)
92  br label %loop
93}
94
95
96declare i32 @llvm.read_register.i32(metadata) nounwind
97declare void @unknown()
98declare void @use(i32)
99
100!0 = !{!"vlenb"}
101