xref: /llvm-project/llvm/test/CodeGen/RISCV/machine-sink-load-immediate.ll (revision 6657d4bd70523e6852f07f64711fb15bdf7b347a)
142835666SMin Hsu; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
242835666SMin Hsu; RUN: llc -mtriple=riscv64 < %s | FileCheck %s
342835666SMin Hsu
442835666SMin Hsudefine i1 @sink_li(ptr %text, ptr %text.addr.0) nounwind {
542835666SMin Hsu; CHECK-LABEL: sink_li:
642835666SMin Hsu; CHECK:       # %bb.0: # %entry
742835666SMin Hsu; CHECK-NEXT:    addi sp, sp, -32
842835666SMin Hsu; CHECK-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
942835666SMin Hsu; CHECK-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1042835666SMin Hsu; CHECK-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1142835666SMin Hsu; CHECK-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
1242835666SMin Hsu; CHECK-NEXT:    mv s1, a1
1342835666SMin Hsu; CHECK-NEXT:    mv s0, a0
1442835666SMin Hsu; CHECK-NEXT:    call toupper
1542835666SMin Hsu; CHECK-NEXT:    li a1, 0
167e2f9619SMin-Yih Hsu; CHECK-NEXT:    beqz s0, .LBB0_26
1742835666SMin Hsu; CHECK-NEXT:  # %bb.1: # %while.body.preheader
1842835666SMin Hsu; CHECK-NEXT:    li a2, 1
1942835666SMin Hsu; CHECK-NEXT:    li a3, 9
2042835666SMin Hsu; CHECK-NEXT:    li a4, 32
2142835666SMin Hsu; CHECK-NEXT:  .LBB0_2: # %while.body
2242835666SMin Hsu; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
2342835666SMin Hsu; CHECK-NEXT:    bnez a2, .LBB0_4
2442835666SMin Hsu; CHECK-NEXT:  # %bb.3: # %while.body
2542835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
2642835666SMin Hsu; CHECK-NEXT:    bne a2, a3, .LBB0_16
2742835666SMin Hsu; CHECK-NEXT:  .LBB0_4: # %while.body.1
2842835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
2942835666SMin Hsu; CHECK-NEXT:    bnez a2, .LBB0_6
3042835666SMin Hsu; CHECK-NEXT:  # %bb.5: # %while.body.1
3142835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
3242835666SMin Hsu; CHECK-NEXT:    bne a2, a3, .LBB0_17
3342835666SMin Hsu; CHECK-NEXT:  .LBB0_6: # %while.body.3
3442835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
3542835666SMin Hsu; CHECK-NEXT:    bnez a2, .LBB0_8
3642835666SMin Hsu; CHECK-NEXT:  # %bb.7: # %while.body.3
3742835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
3842835666SMin Hsu; CHECK-NEXT:    bne a2, a4, .LBB0_19
3942835666SMin Hsu; CHECK-NEXT:  .LBB0_8: # %while.body.4
4042835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
4142835666SMin Hsu; CHECK-NEXT:    bnez a2, .LBB0_10
4242835666SMin Hsu; CHECK-NEXT:  # %bb.9: # %while.body.4
4342835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
4442835666SMin Hsu; CHECK-NEXT:    bne a2, a4, .LBB0_21
4542835666SMin Hsu; CHECK-NEXT:  .LBB0_10: # %while.body.5
4642835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
4742835666SMin Hsu; CHECK-NEXT:    bnez a2, .LBB0_12
4842835666SMin Hsu; CHECK-NEXT:  # %bb.11: # %while.body.5
4942835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
5042835666SMin Hsu; CHECK-NEXT:    bne a2, a3, .LBB0_23
5142835666SMin Hsu; CHECK-NEXT:  .LBB0_12: # %while.body.6
5242835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
5342835666SMin Hsu; CHECK-NEXT:    bnez a2, .LBB0_2
5442835666SMin Hsu; CHECK-NEXT:  # %bb.13: # %while.body.6
5542835666SMin Hsu; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=1
5642835666SMin Hsu; CHECK-NEXT:    beq a2, a3, .LBB0_2
5742835666SMin Hsu; CHECK-NEXT:  # %bb.14: # %while.body.6
587e2f9619SMin-Yih Hsu; CHECK-NEXT:    beqz a2, .LBB0_24
5942835666SMin Hsu; CHECK-NEXT:  # %bb.15: # %strdup.exit.split.loop.exit126
6042835666SMin Hsu; CHECK-NEXT:    addi s0, s1, 7
6142835666SMin Hsu; CHECK-NEXT:    j .LBB0_25
627e2f9619SMin-Yih Hsu; CHECK-NEXT:  .LBB0_16: # %while.body
637e2f9619SMin-Yih Hsu; CHECK-NEXT:    beqz a2, .LBB0_26
647e2f9619SMin-Yih Hsu; CHECK-NEXT:    j .LBB0_18
6542835666SMin Hsu; CHECK-NEXT:  .LBB0_17: # %while.body.1
667e2f9619SMin-Yih Hsu; CHECK-NEXT:    beqz a2, .LBB0_24
6742835666SMin Hsu; CHECK-NEXT:  .LBB0_18: # %strdup.exit.loopexit
6842835666SMin Hsu; CHECK-NEXT:    li s0, 0
697e2f9619SMin-Yih Hsu; CHECK-NEXT:    j .LBB0_25
7042835666SMin Hsu; CHECK-NEXT:  .LBB0_19: # %while.body.3
717e2f9619SMin-Yih Hsu; CHECK-NEXT:    beqz a2, .LBB0_24
7242835666SMin Hsu; CHECK-NEXT:  # %bb.20: # %strdup.exit.split.loop.exit120
7342835666SMin Hsu; CHECK-NEXT:    addi s0, s1, 4
747e2f9619SMin-Yih Hsu; CHECK-NEXT:    j .LBB0_25
7542835666SMin Hsu; CHECK-NEXT:  .LBB0_21: # %while.body.4
767e2f9619SMin-Yih Hsu; CHECK-NEXT:    beqz a2, .LBB0_24
7742835666SMin Hsu; CHECK-NEXT:  # %bb.22: # %strdup.exit.split.loop.exit122
7842835666SMin Hsu; CHECK-NEXT:    addi s0, s1, 5
797e2f9619SMin-Yih Hsu; CHECK-NEXT:    j .LBB0_25
8042835666SMin Hsu; CHECK-NEXT:  .LBB0_23: # %while.body.5
817e2f9619SMin-Yih Hsu; CHECK-NEXT:    bnez a2, .LBB0_25
827e2f9619SMin-Yih Hsu; CHECK-NEXT:  .LBB0_24:
8342835666SMin Hsu; CHECK-NEXT:    li a1, 0
847e2f9619SMin-Yih Hsu; CHECK-NEXT:    j .LBB0_26
857e2f9619SMin-Yih Hsu; CHECK-NEXT:  .LBB0_25: # %strdup.exit
8642835666SMin Hsu; CHECK-NEXT:    li s1, 0
8742835666SMin Hsu; CHECK-NEXT:    mv s2, a0
8842835666SMin Hsu; CHECK-NEXT:    li a0, 0
8942835666SMin Hsu; CHECK-NEXT:    mv a1, s0
9042835666SMin Hsu; CHECK-NEXT:    jalr s1
9142835666SMin Hsu; CHECK-NEXT:    li a0, 0
9242835666SMin Hsu; CHECK-NEXT:    mv a1, s2
9342835666SMin Hsu; CHECK-NEXT:    li a2, 0
9442835666SMin Hsu; CHECK-NEXT:    jalr s1
9542835666SMin Hsu; CHECK-NEXT:    li a1, 1
967e2f9619SMin-Yih Hsu; CHECK-NEXT:  .LBB0_26: # %return
9742835666SMin Hsu; CHECK-NEXT:    mv a0, a1
9842835666SMin Hsu; CHECK-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
9942835666SMin Hsu; CHECK-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
10042835666SMin Hsu; CHECK-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
10142835666SMin Hsu; CHECK-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
10242835666SMin Hsu; CHECK-NEXT:    addi sp, sp, 32
10342835666SMin Hsu; CHECK-NEXT:    ret
10442835666SMin Hsuentry:
10542835666SMin Hsu  %call = call i32 @toupper()
10642835666SMin Hsu  %tobool.not = icmp eq ptr %text, null
10742835666SMin Hsu  br i1 %tobool.not, label %return, label %while.body
10842835666SMin Hsu
10942835666SMin Hsuwhile.body:                                       ; preds = %while.body.6, %while.body.6, %entry
11042835666SMin Hsu  switch i8 1, label %strdup.exit.split.loop.exit114 [
11142835666SMin Hsu    i8 1, label %while.body.1
11242835666SMin Hsu    i8 9, label %while.body.1
11342835666SMin Hsu    i8 0, label %return
11442835666SMin Hsu  ]
11542835666SMin Hsu
11642835666SMin Hsuwhile.body.1:                                     ; preds = %while.body, %while.body
11742835666SMin Hsu  switch i8 1, label %strdup.exit [
11842835666SMin Hsu    i8 1, label %while.body.3
11942835666SMin Hsu    i8 9, label %while.body.3
12042835666SMin Hsu    i8 0, label %return
12142835666SMin Hsu  ]
12242835666SMin Hsu
12342835666SMin Hsuwhile.body.3:                                     ; preds = %while.body.1, %while.body.1
12442835666SMin Hsu  switch i8 1, label %strdup.exit.split.loop.exit120 [
12542835666SMin Hsu    i8 32, label %while.body.4
12642835666SMin Hsu    i8 1, label %while.body.4
12742835666SMin Hsu    i8 0, label %return
12842835666SMin Hsu  ]
12942835666SMin Hsu
13042835666SMin Hsuwhile.body.4:                                     ; preds = %while.body.3, %while.body.3
13142835666SMin Hsu  switch i8 1, label %strdup.exit.split.loop.exit122 [
13242835666SMin Hsu    i8 32, label %while.body.5
13342835666SMin Hsu    i8 1, label %while.body.5
13442835666SMin Hsu    i8 0, label %return
13542835666SMin Hsu  ]
13642835666SMin Hsu
13742835666SMin Hsuwhile.body.5:                                     ; preds = %while.body.4, %while.body.4
13842835666SMin Hsu  switch i8 1, label %strdup.exit.split.loop.exit124 [
13942835666SMin Hsu    i8 1, label %while.body.6
14042835666SMin Hsu    i8 9, label %while.body.6
14142835666SMin Hsu    i8 0, label %return
14242835666SMin Hsu  ]
14342835666SMin Hsu
14442835666SMin Hsuwhile.body.6:                                     ; preds = %while.body.5, %while.body.5
14542835666SMin Hsu  switch i8 1, label %strdup.exit.split.loop.exit126 [
14642835666SMin Hsu    i8 1, label %while.body
14742835666SMin Hsu    i8 9, label %while.body
14842835666SMin Hsu    i8 0, label %return
14942835666SMin Hsu  ]
15042835666SMin Hsu
15142835666SMin Hsustrdup.exit.split.loop.exit114:        ; preds = %while.body
15242835666SMin Hsu  br label %strdup.exit
15342835666SMin Hsu
15442835666SMin Hsustrdup.exit.split.loop.exit120:        ; preds = %while.body.3
15542835666SMin Hsu  %incdec.ptr.3.le = getelementptr i8, ptr %text.addr.0, i64 4
15642835666SMin Hsu  br label %strdup.exit
15742835666SMin Hsu
15842835666SMin Hsustrdup.exit.split.loop.exit122:        ; preds = %while.body.4
15942835666SMin Hsu  %incdec.ptr.4.le = getelementptr i8, ptr %text.addr.0, i64 5
16042835666SMin Hsu  br label %strdup.exit
16142835666SMin Hsu
16242835666SMin Hsustrdup.exit.split.loop.exit124:        ; preds = %while.body.5
16342835666SMin Hsu  br label %strdup.exit
16442835666SMin Hsu
16542835666SMin Hsustrdup.exit.split.loop.exit126:        ; preds = %while.body.6
16642835666SMin Hsu  %incdec.ptr.6.le = getelementptr i8, ptr %text.addr.0, i64 7
16742835666SMin Hsu  br label %strdup.exit
16842835666SMin Hsu
16942835666SMin Hsustrdup.exit:                           ; preds = %strdup.exit.split.loop.exit126, %strdup.exit.split.loop.exit124, %strdup.exit.split.loop.exit122, %strdup.exit.split.loop.exit120, %strdup.exit.split.loop.exit114, %while.body.1
17042835666SMin Hsu  %text.addr.0.lcssa = phi ptr [ null, %strdup.exit.split.loop.exit114 ], [ %incdec.ptr.3.le, %strdup.exit.split.loop.exit120 ], [ %incdec.ptr.4.le, %strdup.exit.split.loop.exit122 ], [ %text, %strdup.exit.split.loop.exit124 ], [ %incdec.ptr.6.le, %strdup.exit.split.loop.exit126 ], [ null, %while.body.1 ]
17142835666SMin Hsu  %call5.i = tail call ptr null(ptr null, ptr %text.addr.0.lcssa)
17242835666SMin Hsu  %memchr64 = tail call ptr null(ptr null, i32 %call, i64 0)
17342835666SMin Hsu  br label %return
17442835666SMin Hsu
17542835666SMin Hsureturn:                                           ; preds = %strdup.exit, %while.body.6, %while.body.5, %while.body.4, %while.body.3, %while.body.1, %while.body, %entry
17642835666SMin Hsu  %retval.1 = phi i1 [ false, %entry ], [ true, %strdup.exit ], [ false, %while.body ], [ false, %while.body.1 ], [ false, %while.body.3 ], [ false, %while.body.4 ], [ false, %while.body.5 ], [ false, %while.body.6 ]
17742835666SMin Hsu  ret i1 %retval.1
17842835666SMin Hsu}
17942835666SMin Hsu
18042835666SMin Hsudeclare i32 @toupper()
1817e56a092SPhilip Reames
1827e56a092SPhilip Reames; In this example, %arg and the return value (13) have overlapping live
1837e56a092SPhilip Reames; intervals because the ABI mandidates they both be placed in a0.
1847e56a092SPhilip Reamesdefine signext i32 @overlap_live_ranges(ptr %arg, i32 signext %arg1) {
1857e56a092SPhilip Reames; CHECK-LABEL: overlap_live_ranges:
1867e56a092SPhilip Reames; CHECK:       # %bb.0: # %bb
187*6657d4bdSPhilip Reames; CHECK-NEXT:    li a2, 1
188*6657d4bdSPhilip Reames; CHECK-NEXT:    bne a1, a2, .LBB1_2
1897e56a092SPhilip Reames; CHECK-NEXT:  # %bb.1: # %bb2
190*6657d4bdSPhilip Reames; CHECK-NEXT:    lw a0, 4(a0)
191*6657d4bdSPhilip Reames; CHECK-NEXT:    ret
192*6657d4bdSPhilip Reames; CHECK-NEXT:  .LBB1_2:
193*6657d4bdSPhilip Reames; CHECK-NEXT:    li a0, 13
1947e56a092SPhilip Reames; CHECK-NEXT:    ret
1957e56a092SPhilip Reamesbb:
1967e56a092SPhilip Reames  %i = icmp eq i32 %arg1, 1
1977e56a092SPhilip Reames  br i1 %i, label %bb2, label %bb5
1987e56a092SPhilip Reames
1997e56a092SPhilip Reamesbb2:                                              ; preds = %bb
2007e56a092SPhilip Reames  %i3 = getelementptr inbounds nuw i8, ptr %arg, i64 4
2017e56a092SPhilip Reames  %i4 = load i32, ptr %i3, align 4
2027e56a092SPhilip Reames  br label %bb5
2037e56a092SPhilip Reames
2047e56a092SPhilip Reamesbb5:                                              ; preds = %bb2, %bb
2057e56a092SPhilip Reames  %i6 = phi i32 [ %i4, %bb2 ], [ 13, %bb ]
2067e56a092SPhilip Reames  ret i32 %i6
2077e56a092SPhilip Reames}
208c94d7158SPhilip Reames
209c94d7158SPhilip Reames
210c94d7158SPhilip Reames; For switches, the values feeding the phi are always sunk into the
211c94d7158SPhilip Reames; target blocks as the IR syntax requires the intermediate block and
212c94d7158SPhilip Reames; DAG lowers it in the immediate predecessor of the phi.
213c94d7158SPhilip Reamesdefine signext i32 @switch_dispatch(i8 %a) {
214c94d7158SPhilip Reames; CHECK-LABEL: switch_dispatch:
215c94d7158SPhilip Reames; CHECK:       # %bb.0: # %bb
216c94d7158SPhilip Reames; CHECK-NEXT:    addi sp, sp, -16
217c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_def_cfa_offset 16
218c94d7158SPhilip Reames; CHECK-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
219c94d7158SPhilip Reames; CHECK-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
220c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_offset ra, -8
221c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_offset s0, -16
222c94d7158SPhilip Reames; CHECK-NEXT:    andi a0, a0, 255
223c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 31
224c94d7158SPhilip Reames; CHECK-NEXT:    blt a1, a0, .LBB2_5
225c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.1: # %bb
226c94d7158SPhilip Reames; CHECK-NEXT:    beqz a0, .LBB2_10
227c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.2: # %bb
228c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 12
229c94d7158SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB2_11
230c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.3: # %bb
231c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 13
232c94d7158SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB2_9
233c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.4: # %case.4
234c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 644
235c94d7158SPhilip Reames; CHECK-NEXT:    j .LBB2_13
236c94d7158SPhilip Reames; CHECK-NEXT:  .LBB2_5: # %bb
237c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 234
238c94d7158SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB2_9
239c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.6: # %bb
240c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 70
241c94d7158SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB2_12
242c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.7: # %bb
243c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 32
244c94d7158SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB2_9
245c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.8: # %case.0
246c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 13
247c94d7158SPhilip Reames; CHECK-NEXT:    j .LBB2_13
248c94d7158SPhilip Reames; CHECK-NEXT:  .LBB2_9: # %case.default
249c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 23
250c94d7158SPhilip Reames; CHECK-NEXT:    j .LBB2_13
251c94d7158SPhilip Reames; CHECK-NEXT:  .LBB2_10: # %case.5
252c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 54
253c94d7158SPhilip Reames; CHECK-NEXT:    j .LBB2_13
254c94d7158SPhilip Reames; CHECK-NEXT:  .LBB2_11: # %case.1
255c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 53
256c94d7158SPhilip Reames; CHECK-NEXT:    j .LBB2_13
257c94d7158SPhilip Reames; CHECK-NEXT:  .LBB2_12: # %case.2
258c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 33
259c94d7158SPhilip Reames; CHECK-NEXT:  .LBB2_13: # %merge
260c94d7158SPhilip Reames; CHECK-NEXT:    mv a0, s0
261c94d7158SPhilip Reames; CHECK-NEXT:    call use
262c94d7158SPhilip Reames; CHECK-NEXT:    mv a0, s0
263c94d7158SPhilip Reames; CHECK-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
264c94d7158SPhilip Reames; CHECK-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
265c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_restore ra
266c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_restore s0
267c94d7158SPhilip Reames; CHECK-NEXT:    addi sp, sp, 16
268c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_def_cfa_offset 0
269c94d7158SPhilip Reames; CHECK-NEXT:    ret
270c94d7158SPhilip Reamesbb:
271c94d7158SPhilip Reames  switch i8 %a, label %case.default [
272c94d7158SPhilip Reames    i8 32, label %case.0
273c94d7158SPhilip Reames    i8 12, label %case.1
274c94d7158SPhilip Reames    i8 70, label %case.2
275c94d7158SPhilip Reames    i8 -22, label %case.3
276c94d7158SPhilip Reames    i8 13, label %case.4
277c94d7158SPhilip Reames    i8 0, label %case.5
278c94d7158SPhilip Reames  ]
279c94d7158SPhilip Reames
280c94d7158SPhilip Reamescase.0:
281c94d7158SPhilip Reames  br label %merge
282c94d7158SPhilip Reamescase.1:
283c94d7158SPhilip Reames  br label %merge
284c94d7158SPhilip Reamescase.2:
285c94d7158SPhilip Reames  br label %merge
286c94d7158SPhilip Reamescase.3:
287c94d7158SPhilip Reames  br label %merge
288c94d7158SPhilip Reamescase.4:
289c94d7158SPhilip Reames  br label %merge
290c94d7158SPhilip Reamescase.5:
291c94d7158SPhilip Reames  br label %merge
292c94d7158SPhilip Reamescase.default:
293c94d7158SPhilip Reames  br label %merge
294c94d7158SPhilip Reames
295c94d7158SPhilip Reamesmerge:
296c94d7158SPhilip Reames  %res = phi i32 [ 23, %case.default ], [ 13, %case.0 ], [ 53, %case.1 ], [ 33, %case.2 ], [ 23, %case.3 ], [ 644, %case.4 ], [ 54, %case.5 ]
297c94d7158SPhilip Reames  call void @use(i32 %res)
298c94d7158SPhilip Reames  ret i32 %res
299c94d7158SPhilip Reames}
300c94d7158SPhilip Reames
301c94d7158SPhilip Reames; Same as for the switch, but written via manual branching.
302c94d7158SPhilip Reamesdefine signext i32 @branch_dispatch(i8 %a) {
303c94d7158SPhilip Reames; CHECK-LABEL: branch_dispatch:
304c94d7158SPhilip Reames; CHECK:       # %bb.0: # %case.0
305c94d7158SPhilip Reames; CHECK-NEXT:    addi sp, sp, -16
306c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_def_cfa_offset 16
307c94d7158SPhilip Reames; CHECK-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
308c94d7158SPhilip Reames; CHECK-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
309c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_offset ra, -8
310c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_offset s0, -16
311*6657d4bdSPhilip Reames; CHECK-NEXT:    .cfi_remember_state
312c94d7158SPhilip Reames; CHECK-NEXT:    andi a0, a0, 255
313c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 32
314*6657d4bdSPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB3_7
315c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.1: # %case.1
316c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 12
317c94d7158SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB3_8
318c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.2: # %case.2
319c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 70
320*6657d4bdSPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB3_9
321c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.3: # %case.3
322c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 234
323c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 23
324*6657d4bdSPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB3_10
325c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.4: # %case.4
326*6657d4bdSPhilip Reames; CHECK-NEXT:    beqz a0, .LBB3_11
327c94d7158SPhilip Reames; CHECK-NEXT:  # %bb.5: # %case.5
328c94d7158SPhilip Reames; CHECK-NEXT:    li a1, 5
329*6657d4bdSPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB3_10
330*6657d4bdSPhilip Reames; CHECK-NEXT:  # %bb.6:
331c94d7158SPhilip Reames; CHECK-NEXT:    li s0, 54
332*6657d4bdSPhilip Reames; CHECK-NEXT:    j .LBB3_10
333c94d7158SPhilip Reames; CHECK-NEXT:  .LBB3_7:
334*6657d4bdSPhilip Reames; CHECK-NEXT:    li s0, 13
335*6657d4bdSPhilip Reames; CHECK-NEXT:    j .LBB3_10
336*6657d4bdSPhilip Reames; CHECK-NEXT:  .LBB3_8:
337*6657d4bdSPhilip Reames; CHECK-NEXT:    li s0, 53
338*6657d4bdSPhilip Reames; CHECK-NEXT:    j .LBB3_10
339*6657d4bdSPhilip Reames; CHECK-NEXT:  .LBB3_9:
340*6657d4bdSPhilip Reames; CHECK-NEXT:    li s0, 33
341*6657d4bdSPhilip Reames; CHECK-NEXT:  .LBB3_10: # %merge
342c94d7158SPhilip Reames; CHECK-NEXT:    mv a0, s0
343c94d7158SPhilip Reames; CHECK-NEXT:    call use
344c94d7158SPhilip Reames; CHECK-NEXT:    mv a0, s0
345c94d7158SPhilip Reames; CHECK-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
346c94d7158SPhilip Reames; CHECK-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
347c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_restore ra
348c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_restore s0
349c94d7158SPhilip Reames; CHECK-NEXT:    addi sp, sp, 16
350c94d7158SPhilip Reames; CHECK-NEXT:    .cfi_def_cfa_offset 0
351c94d7158SPhilip Reames; CHECK-NEXT:    ret
352*6657d4bdSPhilip Reames; CHECK-NEXT:  .LBB3_11:
353*6657d4bdSPhilip Reames; CHECK-NEXT:    .cfi_restore_state
354*6657d4bdSPhilip Reames; CHECK-NEXT:    li s0, 644
355*6657d4bdSPhilip Reames; CHECK-NEXT:    j .LBB3_10
356c94d7158SPhilip Reamescase.0:
357c94d7158SPhilip Reames  %c0 = icmp ne i8 %a, 32
358c94d7158SPhilip Reames  br i1 %c0, label %case.1, label %merge
359c94d7158SPhilip Reamescase.1:
360c94d7158SPhilip Reames  %c1 = icmp ne i8 %a, 12
361c94d7158SPhilip Reames  br i1 %c1, label %case.2, label %merge
362c94d7158SPhilip Reamescase.2:
363c94d7158SPhilip Reames  %c2 = icmp ne i8 %a, 70
364c94d7158SPhilip Reames  br i1 %c2, label %case.3, label %merge
365c94d7158SPhilip Reamescase.3:
366c94d7158SPhilip Reames  %c3 = icmp ne i8 %a, -22
367c94d7158SPhilip Reames  br i1 %c3, label %case.4, label %merge
368c94d7158SPhilip Reamescase.4:
369c94d7158SPhilip Reames  %c4 = icmp ne i8 %a, 0
370c94d7158SPhilip Reames  br i1 %c4, label %case.5, label %merge
371c94d7158SPhilip Reamescase.5:
372c94d7158SPhilip Reames  %c5 = icmp ne i8 %a, 5
373c94d7158SPhilip Reames  br i1 %c5, label %case.default, label %merge
374c94d7158SPhilip Reamescase.default:
375c94d7158SPhilip Reames  br label %merge
376c94d7158SPhilip Reames
377c94d7158SPhilip Reamesmerge:
378c94d7158SPhilip Reames  %res = phi i32 [ 23, %case.default ], [ 13, %case.0 ], [ 53, %case.1 ], [ 33, %case.2 ], [ 23, %case.3 ], [ 644, %case.4 ], [ 54, %case.5 ]
379c94d7158SPhilip Reames  call void @use(i32 %res)
380c94d7158SPhilip Reames  ret i32 %res
381c94d7158SPhilip Reames}
382c94d7158SPhilip Reames
383c94d7158SPhilip Reames
384c94d7158SPhilip Reamesdeclare void @use(i32)
385c94d7158SPhilip Reames
386