xref: /llvm-project/llvm/test/CodeGen/RISCV/branch-on-zero.ll (revision 5ce067d592b78fd3142364e06bae4da2a3a1e944)
166a30b9fSLiaoChunyu; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
266a30b9fSLiaoChunyu; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
366a30b9fSLiaoChunyu; RUN:   | FileCheck %s -check-prefixes=RV32
466a30b9fSLiaoChunyu; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
566a30b9fSLiaoChunyu; RUN:   | FileCheck %s -check-prefixes=RV64
666a30b9fSLiaoChunyu
766a30b9fSLiaoChunyudefine i32 @optbranch_32(i32 %Arg) {
866a30b9fSLiaoChunyu; RV32-LABEL: optbranch_32:
966a30b9fSLiaoChunyu; RV32:       # %bb.0: # %bb
1066a30b9fSLiaoChunyu; RV32-NEXT:    addi a0, a0, 1
11fbace954SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB0_2
12fbace954SLiaoChunyu; RV32-NEXT:  # %bb.1: # %bb2
1366a30b9fSLiaoChunyu; RV32-NEXT:    li a0, -1
14fbace954SLiaoChunyu; RV32-NEXT:  .LBB0_2: # %bb3
1566a30b9fSLiaoChunyu; RV32-NEXT:    ret
1666a30b9fSLiaoChunyu;
1766a30b9fSLiaoChunyu; RV64-LABEL: optbranch_32:
1866a30b9fSLiaoChunyu; RV64:       # %bb.0: # %bb
1966a30b9fSLiaoChunyu; RV64-NEXT:    addiw a0, a0, 1
20fbace954SLiaoChunyu; RV64-NEXT:    bnez a0, .LBB0_2
21fbace954SLiaoChunyu; RV64-NEXT:  # %bb.1: # %bb2
2266a30b9fSLiaoChunyu; RV64-NEXT:    li a0, -1
23fbace954SLiaoChunyu; RV64-NEXT:  .LBB0_2: # %bb3
2466a30b9fSLiaoChunyu; RV64-NEXT:    ret
2566a30b9fSLiaoChunyubb:
2666a30b9fSLiaoChunyu  %i1 = icmp eq i32 %Arg, -1
2766a30b9fSLiaoChunyu  br i1 %i1, label %bb2, label %bb3
2866a30b9fSLiaoChunyu
2966a30b9fSLiaoChunyubb2:
3066a30b9fSLiaoChunyu  ret i32 -1
3166a30b9fSLiaoChunyu
3266a30b9fSLiaoChunyubb3:
3366a30b9fSLiaoChunyu  %i4 = add nuw i32 %Arg, 1
3466a30b9fSLiaoChunyu  ret i32 %i4
3566a30b9fSLiaoChunyu}
3666a30b9fSLiaoChunyu
3766a30b9fSLiaoChunyudefine i64 @optbranch_64(i64 %Arg) {
3866a30b9fSLiaoChunyu; RV32-LABEL: optbranch_64:
3966a30b9fSLiaoChunyu; RV32:       # %bb.0: # %bb
40230e6165SCraig Topper; RV32-NEXT:    addi a0, a0, 1
41230e6165SCraig Topper; RV32-NEXT:    seqz a2, a0
42230e6165SCraig Topper; RV32-NEXT:    add a1, a1, a2
43fbace954SLiaoChunyu; RV32-NEXT:    or a2, a0, a1
44fbace954SLiaoChunyu; RV32-NEXT:    bnez a2, .LBB1_2
45fbace954SLiaoChunyu; RV32-NEXT:  # %bb.1: # %bb2
4666a30b9fSLiaoChunyu; RV32-NEXT:    li a0, -1
4766a30b9fSLiaoChunyu; RV32-NEXT:    li a1, -1
48fbace954SLiaoChunyu; RV32-NEXT:  .LBB1_2: # %bb3
4966a30b9fSLiaoChunyu; RV32-NEXT:    ret
5066a30b9fSLiaoChunyu;
5166a30b9fSLiaoChunyu; RV64-LABEL: optbranch_64:
5266a30b9fSLiaoChunyu; RV64:       # %bb.0: # %bb
5366a30b9fSLiaoChunyu; RV64-NEXT:    addi a0, a0, 1
54fbace954SLiaoChunyu; RV64-NEXT:    bnez a0, .LBB1_2
55fbace954SLiaoChunyu; RV64-NEXT:  # %bb.1: # %bb2
5666a30b9fSLiaoChunyu; RV64-NEXT:    li a0, -1
57fbace954SLiaoChunyu; RV64-NEXT:  .LBB1_2: # %bb3
5866a30b9fSLiaoChunyu; RV64-NEXT:    ret
5966a30b9fSLiaoChunyubb:
6066a30b9fSLiaoChunyu  %i1 = icmp eq i64 %Arg, -1
6166a30b9fSLiaoChunyu  br i1 %i1, label %bb2, label %bb3
6266a30b9fSLiaoChunyu
6366a30b9fSLiaoChunyubb2:
6466a30b9fSLiaoChunyu  ret i64 -1
6566a30b9fSLiaoChunyu
6666a30b9fSLiaoChunyubb3:
6766a30b9fSLiaoChunyu  %i4 = add nuw i64 %Arg, 1
6866a30b9fSLiaoChunyu  ret i64 %i4
6966a30b9fSLiaoChunyu}
7066a30b9fSLiaoChunyu
7166a30b9fSLiaoChunyudefine i32 @test_lshr(i32 %v) {
7266a30b9fSLiaoChunyu; RV32-LABEL: test_lshr:
7366a30b9fSLiaoChunyu; RV32:       # %bb.0: # %entry
74fbace954SLiaoChunyu; RV32-NEXT:    li a1, 0
75fbace954SLiaoChunyu; RV32-NEXT:    beqz a0, .LBB2_2
76fbace954SLiaoChunyu; RV32-NEXT:  .LBB2_1: # %for.body
7766a30b9fSLiaoChunyu; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
78fbace954SLiaoChunyu; RV32-NEXT:    andi a2, a0, 1
79fbace954SLiaoChunyu; RV32-NEXT:    srli a0, a0, 1
80fbace954SLiaoChunyu; RV32-NEXT:    add a1, a1, a2
81fbace954SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB2_1
82fbace954SLiaoChunyu; RV32-NEXT:  .LBB2_2: # %for.end
83fbace954SLiaoChunyu; RV32-NEXT:    mv a0, a1
8466a30b9fSLiaoChunyu; RV32-NEXT:    ret
8566a30b9fSLiaoChunyu;
8666a30b9fSLiaoChunyu; RV64-LABEL: test_lshr:
8766a30b9fSLiaoChunyu; RV64:       # %bb.0: # %entry
8866a30b9fSLiaoChunyu; RV64-NEXT:    sext.w a1, a0
8966a30b9fSLiaoChunyu; RV64-NEXT:    beqz a1, .LBB2_3
9066a30b9fSLiaoChunyu; RV64-NEXT:  # %bb.1: # %for.body.preheader
9166a30b9fSLiaoChunyu; RV64-NEXT:    li a1, 0
9266a30b9fSLiaoChunyu; RV64-NEXT:  .LBB2_2: # %for.body
9366a30b9fSLiaoChunyu; RV64-NEXT:    # =>This Inner Loop Header: Depth=1
94fbace954SLiaoChunyu; RV64-NEXT:    andi a2, a0, 1
9566a30b9fSLiaoChunyu; RV64-NEXT:    srliw a0, a0, 1
96fbace954SLiaoChunyu; RV64-NEXT:    addw a1, a1, a2
97fbace954SLiaoChunyu; RV64-NEXT:    bnez a0, .LBB2_2
9866a30b9fSLiaoChunyu; RV64-NEXT:  .LBB2_3: # %for.end
9966a30b9fSLiaoChunyu; RV64-NEXT:    mv a0, a1
10066a30b9fSLiaoChunyu; RV64-NEXT:    ret
10166a30b9fSLiaoChunyuentry:
10266a30b9fSLiaoChunyu  %tobool.not4 = icmp eq i32 %v, 0
10366a30b9fSLiaoChunyu  br i1 %tobool.not4, label %for.end, label %for.body
10466a30b9fSLiaoChunyu
10566a30b9fSLiaoChunyufor.body:                                         ; preds = %entry, %for.body
10666a30b9fSLiaoChunyu  %c.06 = phi i32 [ %add, %for.body ], [ 0, %entry ]
10766a30b9fSLiaoChunyu  %v.addr.05 = phi i32 [ %shr, %for.body ], [ %v, %entry ]
10866a30b9fSLiaoChunyu  %and = and i32 %v.addr.05, 1
10966a30b9fSLiaoChunyu  %add = add i32 %c.06, %and
11066a30b9fSLiaoChunyu  %shr = lshr i32 %v.addr.05, 1
11166a30b9fSLiaoChunyu  %tobool.not = icmp ult i32 %v.addr.05, 2
11266a30b9fSLiaoChunyu  br i1 %tobool.not, label %for.end, label %for.body
11366a30b9fSLiaoChunyu
11466a30b9fSLiaoChunyufor.end:                                          ; preds = %for.body, %entry
11566a30b9fSLiaoChunyu  %c.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]
11666a30b9fSLiaoChunyu  ret i32 %c.0.lcssa
11766a30b9fSLiaoChunyu}
11866a30b9fSLiaoChunyu
11966a30b9fSLiaoChunyudefine i32 @test_lshr2(ptr nocapture %x, ptr nocapture readonly %y, i32 %n) {
12066a30b9fSLiaoChunyu; RV32-LABEL: test_lshr2:
12166a30b9fSLiaoChunyu; RV32:       # %bb.0: # %entry
12266a30b9fSLiaoChunyu; RV32-NEXT:    srli a2, a2, 2
123*5ce067d5SPhilip Reames; RV32-NEXT:    beqz a2, .LBB3_3
124*5ce067d5SPhilip Reames; RV32-NEXT:  # %bb.1: # %while.body.preheader
125*5ce067d5SPhilip Reames; RV32-NEXT:    slli a2, a2, 2
126*5ce067d5SPhilip Reames; RV32-NEXT:    add a2, a1, a2
127*5ce067d5SPhilip Reames; RV32-NEXT:  .LBB3_2: # %while.body
12866a30b9fSLiaoChunyu; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
12966a30b9fSLiaoChunyu; RV32-NEXT:    lw a3, 0(a1)
130*5ce067d5SPhilip Reames; RV32-NEXT:    addi a4, a1, 4
13166a30b9fSLiaoChunyu; RV32-NEXT:    slli a3, a3, 1
132*5ce067d5SPhilip Reames; RV32-NEXT:    addi a1, a0, 4
13366a30b9fSLiaoChunyu; RV32-NEXT:    sw a3, 0(a0)
134*5ce067d5SPhilip Reames; RV32-NEXT:    mv a0, a1
135*5ce067d5SPhilip Reames; RV32-NEXT:    mv a1, a4
136*5ce067d5SPhilip Reames; RV32-NEXT:    bne a4, a2, .LBB3_2
137*5ce067d5SPhilip Reames; RV32-NEXT:  .LBB3_3: # %while.end
13866a30b9fSLiaoChunyu; RV32-NEXT:    li a0, 0
13966a30b9fSLiaoChunyu; RV32-NEXT:    ret
14066a30b9fSLiaoChunyu;
14166a30b9fSLiaoChunyu; RV64-LABEL: test_lshr2:
14266a30b9fSLiaoChunyu; RV64:       # %bb.0: # %entry
14366a30b9fSLiaoChunyu; RV64-NEXT:    srliw a2, a2, 2
144*5ce067d5SPhilip Reames; RV64-NEXT:    beqz a2, .LBB3_3
145*5ce067d5SPhilip Reames; RV64-NEXT:  # %bb.1: # %while.body.preheader
146*5ce067d5SPhilip Reames; RV64-NEXT:    addi a2, a2, -1
147*5ce067d5SPhilip Reames; RV64-NEXT:    slli a2, a2, 32
148*5ce067d5SPhilip Reames; RV64-NEXT:    srli a2, a2, 30
149*5ce067d5SPhilip Reames; RV64-NEXT:    add a2, a2, a1
150*5ce067d5SPhilip Reames; RV64-NEXT:    addi a2, a2, 4
151*5ce067d5SPhilip Reames; RV64-NEXT:  .LBB3_2: # %while.body
15266a30b9fSLiaoChunyu; RV64-NEXT:    # =>This Inner Loop Header: Depth=1
15366a30b9fSLiaoChunyu; RV64-NEXT:    lw a3, 0(a1)
154*5ce067d5SPhilip Reames; RV64-NEXT:    addi a4, a1, 4
15566a30b9fSLiaoChunyu; RV64-NEXT:    slli a3, a3, 1
156*5ce067d5SPhilip Reames; RV64-NEXT:    addi a1, a0, 4
15766a30b9fSLiaoChunyu; RV64-NEXT:    sw a3, 0(a0)
158*5ce067d5SPhilip Reames; RV64-NEXT:    mv a0, a1
159*5ce067d5SPhilip Reames; RV64-NEXT:    mv a1, a4
160*5ce067d5SPhilip Reames; RV64-NEXT:    bne a4, a2, .LBB3_2
161*5ce067d5SPhilip Reames; RV64-NEXT:  .LBB3_3: # %while.end
16266a30b9fSLiaoChunyu; RV64-NEXT:    li a0, 0
16366a30b9fSLiaoChunyu; RV64-NEXT:    ret
16466a30b9fSLiaoChunyuentry:
16566a30b9fSLiaoChunyu  %tobool.not4 = icmp ult i32 %n, 4
16666a30b9fSLiaoChunyu  br i1 %tobool.not4, label %while.end, label %while.body.preheader
16766a30b9fSLiaoChunyu
16866a30b9fSLiaoChunyuwhile.body.preheader:                             ; preds = %entry
16966a30b9fSLiaoChunyu  %shr = lshr i32 %n, 2
17066a30b9fSLiaoChunyu  br label %while.body
17166a30b9fSLiaoChunyu
17266a30b9fSLiaoChunyuwhile.body:                                       ; preds = %while.body.preheader, %while.body
17366a30b9fSLiaoChunyu  %c.07 = phi i32 [ %dec, %while.body ], [ %shr, %while.body.preheader ]
17466a30b9fSLiaoChunyu  %x.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %x, %while.body.preheader ]
17566a30b9fSLiaoChunyu  %y.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %y, %while.body.preheader ]
17666a30b9fSLiaoChunyu  %incdec.ptr = getelementptr inbounds i32, ptr %y.addr.05, i32 1
17766a30b9fSLiaoChunyu  %0 = load i32, ptr %y.addr.05, align 4
17866a30b9fSLiaoChunyu  %mul = shl nsw i32 %0, 1
17966a30b9fSLiaoChunyu  %incdec.ptr1 = getelementptr inbounds i32, ptr %x.addr.06, i32 1
18066a30b9fSLiaoChunyu  store i32 %mul, ptr %x.addr.06, align 4
18166a30b9fSLiaoChunyu  %dec = add nsw i32 %c.07, -1
18266a30b9fSLiaoChunyu  %tobool.not = icmp eq i32 %dec, 0
18366a30b9fSLiaoChunyu  br i1 %tobool.not, label %while.end, label %while.body
18466a30b9fSLiaoChunyu
18566a30b9fSLiaoChunyuwhile.end:                                        ; preds = %while.body, %entry
18666a30b9fSLiaoChunyu  ret i32 0
18766a30b9fSLiaoChunyu}
188