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