1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv64 -mattr=+m -O2 < %s | FileCheck %s --check-prefix=CHECK-O2 3; RUN: llc -mtriple=riscv64 -mattr=+m -O3 < %s | FileCheck %s --check-prefix=CHECK-O3 4 5; RUN: llc -mtriple=riscv64 -mattr=+m -tail-dup-size=2 < %s | FileCheck %s --check-prefix=CHECK-O2 6; RUN: llc -mtriple=riscv64 -mattr=+m -tail-dup-placement-threshold=2 < %s | FileCheck %s --check-prefix=CHECK-O2 7; RUN: llc -mtriple=riscv64 -mattr=+m -tail-dup-placement-threshold=6 < %s | FileCheck %s --check-prefix=CHECK-O3 8 9@a = external global i32 10@b = external global i32 11@c = external global i32 12 13declare i32 @foo(i32) 14 15define i32 @test(i32 %n) { 16; CHECK-O2-LABEL: test: 17; CHECK-O2: # %bb.0: # %entry 18; CHECK-O2-NEXT: sext.w a1, a0 19; CHECK-O2-NEXT: blez a1, .LBB0_2 20; CHECK-O2-NEXT: # %bb.1: # %if.then 21; CHECK-O2-NEXT: lui a1, %hi(a) 22; CHECK-O2-NEXT: lw a1, %lo(a)(a1) 23; CHECK-O2-NEXT: mul a0, a1, a0 24; CHECK-O2-NEXT: j .LBB0_3 25; CHECK-O2-NEXT: .LBB0_2: # %if.else 26; CHECK-O2-NEXT: lui a1, %hi(b) 27; CHECK-O2-NEXT: lw a1, %lo(b)(a1) 28; CHECK-O2-NEXT: divw a0, a1, a0 29; CHECK-O2-NEXT: .LBB0_3: # %if.end 30; CHECK-O2-NEXT: lui a1, %hi(c) 31; CHECK-O2-NEXT: lw a1, %lo(c)(a1) 32; CHECK-O2-NEXT: addi a0, a0, -1 33; CHECK-O2-NEXT: mulw a0, a0, a1 34; CHECK-O2-NEXT: tail foo 35; 36; CHECK-O3-LABEL: test: 37; CHECK-O3: # %bb.0: # %entry 38; CHECK-O3-NEXT: sext.w a1, a0 39; CHECK-O3-NEXT: blez a1, .LBB0_2 40; CHECK-O3-NEXT: # %bb.1: # %if.then 41; CHECK-O3-NEXT: lui a1, %hi(a) 42; CHECK-O3-NEXT: lw a1, %lo(a)(a1) 43; CHECK-O3-NEXT: mul a0, a1, a0 44; CHECK-O3-NEXT: lui a1, %hi(c) 45; CHECK-O3-NEXT: lw a1, %lo(c)(a1) 46; CHECK-O3-NEXT: addi a0, a0, -1 47; CHECK-O3-NEXT: mulw a0, a0, a1 48; CHECK-O3-NEXT: tail foo 49; CHECK-O3-NEXT: .LBB0_2: # %if.else 50; CHECK-O3-NEXT: lui a1, %hi(b) 51; CHECK-O3-NEXT: lw a1, %lo(b)(a1) 52; CHECK-O3-NEXT: divw a0, a1, a0 53; CHECK-O3-NEXT: lui a1, %hi(c) 54; CHECK-O3-NEXT: lw a1, %lo(c)(a1) 55; CHECK-O3-NEXT: addi a0, a0, -1 56; CHECK-O3-NEXT: mulw a0, a0, a1 57; CHECK-O3-NEXT: tail foo 58entry: 59 %cmp = icmp sgt i32 %n, 0 60 br i1 %cmp, label %if.then, label %if.else 61 62if.then: 63 %va = load i32, ptr @a 64 %mul = mul nsw i32 %va, %n 65 br label %if.end 66 67if.else: 68 %vb = load i32, ptr @b 69 %div = sdiv i32 %vb, %n 70 br label %if.end 71 72if.end: 73 %phi = phi i32 [ %mul, %if.then ], [ %div, %if.else ] 74 %vc = load i32, ptr @c 75 %add = add nsw i32 %phi, -1 76 %arg = mul i32 %add, %vc 77 %ret = tail call i32 @foo(i32 %arg) 78 ret i32 %ret 79} 80