xref: /llvm-project/llvm/test/CodeGen/RISCV/machine-pipeliner.ll (revision 2c782ab2718758bd106ad5939adf7cfb6cd9d1e9)
1*2c782ab2SPengcheng Wang; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2*2c782ab2SPengcheng Wang; RUN: llc -mtriple=riscv64 -mcpu=sifive-p670 -O3 -verify-machineinstrs -riscv-enable-pipeliner=false < %s \
3*2c782ab2SPengcheng Wang; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-NOT-PIPELINED
4*2c782ab2SPengcheng Wang; RUN: llc -mtriple=riscv64 -mcpu=sifive-p670 -O3 -verify-machineinstrs -riscv-enable-pipeliner=true < %s \
5*2c782ab2SPengcheng Wang; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-PIPELINED
6*2c782ab2SPengcheng Wang
7*2c782ab2SPengcheng Wang; We shouldn't pipeline this loop as one operand of branch is a PHI.
8*2c782ab2SPengcheng Wangdefine i32 @test_phi() {
9*2c782ab2SPengcheng Wang; CHECK-LABEL: test_phi:
10*2c782ab2SPengcheng Wang; CHECK:       # %bb.0: # %entry
11*2c782ab2SPengcheng Wang; CHECK-NEXT:    li a0, 0
12*2c782ab2SPengcheng Wang; CHECK-NEXT:  .LBB0_1: # %for.body
13*2c782ab2SPengcheng Wang; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
14*2c782ab2SPengcheng Wang; CHECK-NEXT:    mv a1, a0
15*2c782ab2SPengcheng Wang; CHECK-NEXT:    li a0, 1
16*2c782ab2SPengcheng Wang; CHECK-NEXT:    sh a0, 0(zero)
17*2c782ab2SPengcheng Wang; CHECK-NEXT:    bnez a1, .LBB0_1
18*2c782ab2SPengcheng Wang; CHECK-NEXT:  # %bb.2: # %for.cond.cleanup
19*2c782ab2SPengcheng Wang; CHECK-NEXT:    li a0, 0
20*2c782ab2SPengcheng Wang; CHECK-NEXT:    ret
21*2c782ab2SPengcheng Wangentry:
22*2c782ab2SPengcheng Wang  br label %for.body
23*2c782ab2SPengcheng Wang
24*2c782ab2SPengcheng Wangfor.cond.cleanup:                                 ; preds = %for.body
25*2c782ab2SPengcheng Wang  ret i32 0
26*2c782ab2SPengcheng Wang
27*2c782ab2SPengcheng Wangfor.body:                                         ; preds = %for.body, %entry
28*2c782ab2SPengcheng Wang  %indvars.iv1 = phi i64 [ 0, %entry ], [ 1, %for.body ]
29*2c782ab2SPengcheng Wang  store i16 1, ptr null, align 4
30*2c782ab2SPengcheng Wang  %exitcond.not.31 = icmp eq i64 %indvars.iv1, 0
31*2c782ab2SPengcheng Wang  br i1 %exitcond.not.31, label %for.cond.cleanup, label %for.body
32*2c782ab2SPengcheng Wang}
33*2c782ab2SPengcheng Wang
34*2c782ab2SPengcheng Wangdefine void @test_pipelined_1(ptr noalias %in, ptr noalias %out, i32 signext %cnt) {
35*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-LABEL: test_pipelined_1:
36*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED:       # %bb.0: # %entry
37*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    blez a2, .LBB1_3
38*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:  # %bb.1: # %for.body.preheader
39*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    addi a2, a2, -1
40*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    sh2add.uw a2, a2, a1
41*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    addi a2, a2, 4
42*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:  .LBB1_2: # %for.body
43*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    # =>This Inner Loop Header: Depth=1
44*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    lw a3, 0(a1)
45*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    addi a1, a1, 4
46*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    addi a3, a3, 1
47*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    sw a3, 0(a0)
48*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    addi a0, a0, 4
49*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    bne a1, a2, .LBB1_2
50*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:  .LBB1_3: # %for.end
51*2c782ab2SPengcheng Wang; CHECK-NOT-PIPELINED-NEXT:    ret
52*2c782ab2SPengcheng Wang;
53*2c782ab2SPengcheng Wang; CHECK-PIPELINED-LABEL: test_pipelined_1:
54*2c782ab2SPengcheng Wang; CHECK-PIPELINED:       # %bb.0: # %entry
55*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    blez a2, .LBB1_6
56*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:  # %bb.1: # %for.body.preheader
57*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    lw a4, 0(a1)
58*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a2, a2, -1
59*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    sh2add.uw a6, a2, a1
60*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a2, a0, 4
61*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a1, a1, 4
62*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a6, a6, 4
63*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    beq a1, a6, .LBB1_5
64*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:  # %bb.2: # %for.body
65*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    lw a5, 0(a1)
66*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a3, a2, 4
67*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a4, a4, 1
68*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a1, a1, 4
69*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    beq a1, a6, .LBB1_4
70*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:  .LBB1_3: # %for.body
71*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    # =>This Inner Loop Header: Depth=1
72*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    sw a4, 0(a0)
73*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    mv a4, a5
74*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    lw a5, 0(a1)
75*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    mv a0, a2
76*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    mv a2, a3
77*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a3, a3, 4
78*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a4, a4, 1
79*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a1, a1, 4
80*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    bne a1, a6, .LBB1_3
81*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:  .LBB1_4:
82*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    sw a4, 0(a0)
83*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    mv a0, a2
84*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    mv a4, a5
85*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:  .LBB1_5:
86*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    addi a4, a4, 1
87*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    sw a4, 0(a0)
88*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:  .LBB1_6: # %for.end
89*2c782ab2SPengcheng Wang; CHECK-PIPELINED-NEXT:    ret
90*2c782ab2SPengcheng Wangentry:
91*2c782ab2SPengcheng Wang  %cmp = icmp sgt i32 %cnt, 0
92*2c782ab2SPengcheng Wang  br i1 %cmp, label %for.body, label %for.end
93*2c782ab2SPengcheng Wang
94*2c782ab2SPengcheng Wangfor.body:                                         ; preds = %entry, %for.body
95*2c782ab2SPengcheng Wang  %inc.next = phi i32 [ %inc, %for.body ], [ 0, %entry ]
96*2c782ab2SPengcheng Wang  %in.addr.next = phi ptr [ %incdec.in, %for.body ], [ %in, %entry ]
97*2c782ab2SPengcheng Wang  %out.addr.next = phi ptr [ %incdec.out, %for.body ], [ %out, %entry ]
98*2c782ab2SPengcheng Wang  %0 = load i32, ptr %out.addr.next, align 4
99*2c782ab2SPengcheng Wang  %1 = add i32 %0, 1
100*2c782ab2SPengcheng Wang  store i32 %1, ptr %in.addr.next, align 4
101*2c782ab2SPengcheng Wang  %incdec.in = getelementptr inbounds i8, ptr %in.addr.next, i64 4
102*2c782ab2SPengcheng Wang  %incdec.out = getelementptr inbounds i8, ptr %out.addr.next, i64 4
103*2c782ab2SPengcheng Wang  %inc = add nuw nsw i32 %inc.next, 1
104*2c782ab2SPengcheng Wang  %exitcond.not = icmp eq i32 %inc, %cnt
105*2c782ab2SPengcheng Wang  br i1 %exitcond.not, label %for.end, label %for.body
106*2c782ab2SPengcheng Wang
107*2c782ab2SPengcheng Wangfor.end:                                          ; preds = %for.body, %entry
108*2c782ab2SPengcheng Wang  ret void
109*2c782ab2SPengcheng Wang}
110