|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 |
1 | 2 | ; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs < %s | FileCheck %s
|
2 | 3 | ; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=aarch64-linux %s | FileCheck --check-prefix=CHECK-CGP %s
|
3 | 4 | ; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -cgpp-huge-func=0 -mtriple=aarch64-linux %s | FileCheck --check-prefix=CHECK-CGP %s
|
|
9 | 10 | ; Test that and is sunk into cmp block to form tbz.
|
10 | 11 | define dso_local i32 @and_sink1(i32 %a, i1 %c) {
|
11 | 12 | ; CHECK-LABEL: and_sink1:
|
12 |
| -; CHECK: tbz w1, #0 |
13 |
| -; CHECK: str wzr, [x{{[0-9]+}}, :lo12:A] |
14 |
| -; CHECK: tbnz {{w[0-9]+}}, #2 |
| 13 | +; CHECK: // %bb.0: |
| 14 | +; CHECK-NEXT: tbz w1, #0, .LBB0_3 |
| 15 | +; CHECK-NEXT: // %bb.1: // %bb0 |
| 16 | +; CHECK-NEXT: adrp x8, A |
| 17 | +; CHECK-NEXT: str wzr, [x8, :lo12:A] |
| 18 | +; CHECK-NEXT: tbnz w0, #2, .LBB0_3 |
| 19 | +; CHECK-NEXT: // %bb.2: |
| 20 | +; CHECK-NEXT: mov w0, #1 // =0x1 |
| 21 | +; CHECK-NEXT: ret |
| 22 | +; CHECK-NEXT: .LBB0_3: // %bb2 |
| 23 | +; CHECK-NEXT: mov w0, wzr |
| 24 | +; CHECK-NEXT: ret |
15 | 25 |
|
16 | 26 | ; CHECK-CGP-LABEL: @and_sink1(
|
17 | 27 | ; CHECK-CGP-NOT: and i32
|
|
35 | 45 | ; Test that both 'and' and cmp get sunk to form tbz.
|
36 | 46 | define dso_local i32 @and_sink2(i32 %a, i1 %c, i1 %c2) {
|
37 | 47 | ; CHECK-LABEL: and_sink2:
|
38 |
| -; CHECK: str wzr, [x{{[0-9]+}}, :lo12:A] |
39 |
| -; CHECK: tbz w1, #0 |
40 |
| -; CHECK: str wzr, [x{{[0-9]+}}, :lo12:B] |
41 |
| -; CHECK: tbz w2, #0 |
42 |
| -; CHECK: str wzr, [x{{[0-9]+}}, :lo12:C] |
43 |
| -; CHECK: tbnz {{w[0-9]+}}, #2 |
| 48 | +; CHECK: // %bb.0: |
| 49 | +; CHECK-NEXT: mov w8, wzr |
| 50 | +; CHECK-NEXT: adrp x9, A |
| 51 | +; CHECK-NEXT: str wzr, [x9, :lo12:A] |
| 52 | +; CHECK-NEXT: tbz w1, #0, .LBB1_5 |
| 53 | +; CHECK-NEXT: // %bb.1: // %bb0.preheader |
| 54 | +; CHECK-NEXT: adrp x8, B |
| 55 | +; CHECK-NEXT: adrp x9, C |
| 56 | +; CHECK-NEXT: .LBB1_2: // %bb0 |
| 57 | +; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 |
| 58 | +; CHECK-NEXT: str wzr, [x8, :lo12:B] |
| 59 | +; CHECK-NEXT: tbz w2, #0, .LBB1_6 |
| 60 | +; CHECK-NEXT: // %bb.3: // %bb1 |
| 61 | +; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=1 |
| 62 | +; CHECK-NEXT: str wzr, [x9, :lo12:C] |
| 63 | +; CHECK-NEXT: tbnz w0, #2, .LBB1_2 |
| 64 | +; CHECK-NEXT: // %bb.4: |
| 65 | +; CHECK-NEXT: mov w8, #1 // =0x1 |
| 66 | +; CHECK-NEXT: .LBB1_5: // %common.ret |
| 67 | +; CHECK-NEXT: mov w0, w8 |
| 68 | +; CHECK-NEXT: ret |
| 69 | +; CHECK-NEXT: .LBB1_6: |
| 70 | +; CHECK-NEXT: mov w0, wzr |
| 71 | +; CHECK-NEXT: ret |
44 | 72 |
|
45 | 73 | ; CHECK-CGP-LABEL: @and_sink2(
|
46 | 74 | ; CHECK-CGP-NOT: and i32
|
|
71 | 99 | ; Test that 'and' is not sunk since cbz is a better alternative.
|
72 | 100 | define dso_local i32 @and_sink3(i32 %a) {
|
73 | 101 | ; CHECK-LABEL: and_sink3:
|
74 |
| -; CHECK: and [[REG:w[0-9]+]], w0, #0x3 |
75 |
| -; CHECK: [[LOOP:.L[A-Z0-9_]+]]: |
76 |
| -; CHECK: str wzr, [x{{[0-9]+}}, :lo12:A] |
77 |
| -; CHECK: cbz [[REG]], [[LOOP]] |
| 102 | +; CHECK: // %bb.0: |
| 103 | +; CHECK-NEXT: adrp x8, A |
| 104 | +; CHECK-NEXT: and w9, w0, #0x3 |
| 105 | +; CHECK-NEXT: .LBB2_1: // %bb0 |
| 106 | +; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 |
| 107 | +; CHECK-NEXT: str wzr, [x8, :lo12:A] |
| 108 | +; CHECK-NEXT: cbz w9, .LBB2_1 |
| 109 | +; CHECK-NEXT: // %bb.2: // %bb2 |
| 110 | +; CHECK-NEXT: mov w0, wzr |
| 111 | +; CHECK-NEXT: ret |
78 | 112 |
|
79 | 113 | ; CHECK-CGP-LABEL: @and_sink3(
|
80 | 114 | ; CHECK-CGP-NEXT: and i32
|
|
0 commit comments