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