[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / widen-narrow-tbz-tbnz.mir
blob2f8409f9fd3e3b39879dba2479e409e9819c161b
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple aarch64-unknown-unknown -run-pass=instruction-select -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s
4 # Test widening and narrowing on test bit operations using subregister copies
5 # or SUBREG_TO_REG.
6 --- |
7  @glob = external dso_local unnamed_addr global i1, align 4
8  define void @p0_no_copy() { ret void }
9  define void @widen_s32_to_s64() { ret void }
10  define void @widen_s16_to_s64() { ret void }
11  define void @narrow_s64_to_s32() { ret void }
13 ...
14 ---
15 name:            p0_no_copy
16 alignment:       4
17 legalized:       true
18 regBankSelected: true
19 tracksRegLiveness: true
20 body:             |
21   ; CHECK-LABEL: name: p0_no_copy
22   ; CHECK: bb.0:
23   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
24   ; CHECK-NEXT: {{  $}}
25   ; CHECK-NEXT:   %glob:gpr64common = MOVaddr target-flags(aarch64-page) @glob, target-flags(aarch64-pageoff, aarch64-nc) @glob
26   ; CHECK-NEXT:   %load:gpr32 = LDRBBui %glob, 0 :: (dereferenceable load (s8) from @glob, align 4)
27   ; CHECK-NEXT:   TBNZW %load, 0, %bb.1
28   ; CHECK-NEXT:   B %bb.0
29   ; CHECK-NEXT: {{  $}}
30   ; CHECK-NEXT: bb.1:
31   ; CHECK-NEXT:   RET_ReallyLR
32   bb.0:
33     successors: %bb.0, %bb.1
34     %glob:gpr(p0) = G_GLOBAL_VALUE @glob
35     %load:gpr(s32) = G_LOAD %glob(p0) :: (dereferenceable load (s8) from @glob, align 4)
37     ; Look through G_TRUNC to get the load. The load is into a s8, which will
38     ; be selected to a GPR32, so we don't need a copy.
39     G_BRCOND %load, %bb.1
40     G_BR %bb.0
41   bb.1:
42     RET_ReallyLR
43 ...
44 ---
45 name:            widen_s32_to_s64
46 alignment:       4
47 legalized:       true
48 regBankSelected: true
49 tracksRegLiveness: true
50 body:             |
51   ; CHECK-LABEL: name: widen_s32_to_s64
52   ; CHECK: bb.0:
53   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
54   ; CHECK-NEXT:   liveins: $w0
55   ; CHECK-NEXT: {{  $}}
56   ; CHECK-NEXT:   %reg:gpr32all = COPY $w0
57   ; CHECK-NEXT:   [[SUBREG_TO_REG:%[0-9]+]]:gpr64all = SUBREG_TO_REG 0, %reg, %subreg.sub_32
58   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64 = COPY [[SUBREG_TO_REG]]
59   ; CHECK-NEXT:   TBZX [[COPY]], 33, %bb.1
60   ; CHECK-NEXT:   B %bb.0
61   ; CHECK-NEXT: {{  $}}
62   ; CHECK-NEXT: bb.1:
63   ; CHECK-NEXT:   RET_ReallyLR
64   bb.0:
65     successors: %bb.0, %bb.1
66     liveins: $w0
67     %reg:gpr(s32) = COPY $w0
68     %zext:gpr(s64) = G_ZEXT %reg(s32)
69     %bit:gpr(s64) = G_CONSTANT i64 8589934592
70     %zero:gpr(s64) = G_CONSTANT i64 0
71     %and:gpr(s64) = G_AND %zext, %bit
72     %cmp:gpr(s32) = G_ICMP intpred(eq), %and(s64), %zero
74     ; We should widen using a SUBREG_TO_REG here, because we need a TBZX to get
75     ; bit 33. The subregister should be sub_32.
76     G_BRCOND %cmp, %bb.1
77     G_BR %bb.0
78   bb.1:
79     RET_ReallyLR
80 ...
81 ---
82 name:            widen_s16_to_s64
83 alignment:       4
84 legalized:       true
85 regBankSelected: true
86 tracksRegLiveness: true
87 body:             |
88   ; CHECK-LABEL: name: widen_s16_to_s64
89   ; CHECK: bb.0:
90   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
91   ; CHECK-NEXT: {{  $}}
92   ; CHECK-NEXT:   %reg:gpr32 = IMPLICIT_DEF
93   ; CHECK-NEXT:   [[SUBREG_TO_REG:%[0-9]+]]:gpr64all = SUBREG_TO_REG 0, %reg, %subreg.sub_32
94   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr64 = COPY [[SUBREG_TO_REG]]
95   ; CHECK-NEXT:   TBZX [[COPY]], 33, %bb.1
96   ; CHECK-NEXT:   B %bb.0
97   ; CHECK-NEXT: {{  $}}
98   ; CHECK-NEXT: bb.1:
99   ; CHECK-NEXT:   RET_ReallyLR
100   bb.0:
101     successors: %bb.0, %bb.1
102     %reg:gpr(s16) = G_IMPLICIT_DEF
103     %zext:gpr(s64) = G_ZEXT %reg(s16)
104     %bit:gpr(s64) = G_CONSTANT i64 8589934592
105     %zero:gpr(s64) = G_CONSTANT i64 0
106     %and:gpr(s64) = G_AND %zext, %bit
107     %cmp:gpr(s32) = G_ICMP intpred(eq), %and(s64), %zero
109     ; We should widen using a SUBREG_TO_REG here, because we need a TBZX to get
110     ; bit 33. The subregister should be sub_32, because s16 will end up on a
111     ; GPR32.
112     G_BRCOND %cmp, %bb.1
113     G_BR %bb.0
114   bb.1:
115     RET_ReallyLR
118 name:            narrow_s64_to_s32
119 alignment:       4
120 legalized:       true
121 regBankSelected: true
122 tracksRegLiveness: true
123 body:             |
124   ; CHECK-LABEL: name: narrow_s64_to_s32
125   ; CHECK: bb.0:
126   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
127   ; CHECK-NEXT:   liveins: $x0
128   ; CHECK-NEXT: {{  $}}
129   ; CHECK-NEXT:   %wide:gpr64all = COPY $x0
130   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr32all = COPY %wide.sub_32
131   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
132   ; CHECK-NEXT:   TBNZW [[COPY1]], 0, %bb.1
133   ; CHECK-NEXT:   B %bb.0
134   ; CHECK-NEXT: {{  $}}
135   ; CHECK-NEXT: bb.1:
136   ; CHECK-NEXT:   RET_ReallyLR
137   bb.0:
138     successors: %bb.0, %bb.1
139     liveins: $x0
140     %wide:gpr(s64) = COPY $x0
142     ; We should narrow using a subregister copy here.
143     %trunc:gpr(s32) = G_TRUNC %wide(s64)
144     G_BRCOND %trunc, %bb.1
145     G_BR %bb.0
146   bb.1:
147     RET_ReallyLR