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