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: csrr a1, vlenb 20; CHECK-NEXT: sub a0, a0, a1 21; CHECK-NEXT: ret 22entry: 23 %v1 = call i32 @llvm.read_register.i32(metadata !0) 24 %v2 = call i32 @llvm.read_register.i32(metadata !0) 25 %sub = sub i32 %v1, %v2 26 ret i32 %sub 27} 28 29define i32 @sink_to_use_branch(i1 %c) { 30; CHECK-LABEL: sink_to_use_branch: 31; CHECK: # %bb.0: # %entry 32; CHECK-NEXT: andi a0, a0, 1 33; CHECK-NEXT: beqz a0, .LBB2_2 34; CHECK-NEXT: # %bb.1: # %used 35; CHECK-NEXT: csrr a0, vlenb 36; CHECK-NEXT: .LBB2_2: # %unused 37; CHECK-NEXT: ret 38entry: 39 %v1 = call i32 @llvm.read_register.i32(metadata !0) 40 br i1 %c, label %used, label %unused 41used: 42 ret i32 %v1 43unused: 44 ret i32 0 45} 46 47define i32 @sink_to_use_call() { 48; CHECK-LABEL: sink_to_use_call: 49; CHECK: # %bb.0: # %entry 50; CHECK-NEXT: addi sp, sp, -16 51; CHECK-NEXT: .cfi_def_cfa_offset 16 52; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 53; CHECK-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 54; CHECK-NEXT: .cfi_offset ra, -4 55; CHECK-NEXT: .cfi_offset s0, -8 56; CHECK-NEXT: csrr s0, vlenb 57; CHECK-NEXT: call unknown@plt 58; CHECK-NEXT: mv a0, s0 59; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 60; CHECK-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 61; CHECK-NEXT: addi sp, sp, 16 62; CHECK-NEXT: ret 63entry: 64 %v1 = call i32 @llvm.read_register.i32(metadata !0) 65 call void @unknown() ; maythrow 66 ret i32 %v1 67} 68 69define void @machine_licm() { 70; CHECK-LABEL: machine_licm: 71; CHECK: # %bb.0: # %entry 72; CHECK-NEXT: addi sp, sp, -16 73; CHECK-NEXT: .cfi_def_cfa_offset 16 74; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 75; CHECK-NEXT: .cfi_offset ra, -4 76; CHECK-NEXT: .LBB4_1: # %loop 77; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 78; CHECK-NEXT: csrr a0, vlenb 79; CHECK-NEXT: call use@plt 80; CHECK-NEXT: j .LBB4_1 81entry: 82 br label %loop 83 84loop: 85 %v1 = call i32 @llvm.read_register.i32(metadata !0) 86 call void @use(i32 %v1) 87 br label %loop 88} 89 90 91declare i32 @llvm.read_register.i32(metadata) nounwind 92declare void @unknown() 93declare void @use(i32) 94 95!0 = !{!"vlenb"} 96