[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / opt-fold-and-tbz-tbnz.mir
blobc9749b84d8a5a32d3099701eede9d15464d7fdec
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 # Check folding an AND into a G_BRCOND which has been matched as a TB(N)Z.
5 ...
6 ---
7 name:            fold_and_rhs
8 alignment:       4
9 legalized:       true
10 regBankSelected: true
11 body:             |
12   ; CHECK-LABEL: name: fold_and_rhs
13   ; CHECK: bb.0:
14   ; CHECK:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
15   ; CHECK:   %copy:gpr64all = COPY $x0
16   ; CHECK:   [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_32
17   ; CHECK:   [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
18   ; CHECK:   TBNZW [[COPY1]], 3, %bb.1
19   ; CHECK:   B %bb.0
20   ; CHECK: bb.1:
21   ; CHECK:   RET_ReallyLR
22   bb.0:
23     successors: %bb.0, %bb.1
24     liveins: $x0
25     %copy:gpr(s64) = COPY $x0
26     %bit:gpr(s64) = G_CONSTANT i64 8
27     %zero:gpr(s64) = G_CONSTANT i64 0
28     %fold_cst:gpr(s64) = G_CONSTANT i64 8
30     ; tbnz (and x, 8), 3 == tbnz x, 3 because the third bit of x & 8 is 1 when
31     ; the third bit of x is 1.
32     %fold_me:gpr(s64) = G_AND %copy, %fold_cst
34     %and:gpr(s64) = G_AND %fold_me, %bit
35     %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero
36     G_BRCOND %cmp, %bb.1
37     G_BR %bb.0
38   bb.1:
39     RET_ReallyLR
40 ...
41 ---
42 name:            fold_and_lhs
43 alignment:       4
44 legalized:       true
45 regBankSelected: true
46 body:             |
47   ; CHECK-LABEL: name: fold_and_lhs
48   ; CHECK: bb.0:
49   ; CHECK:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
50   ; CHECK:   %copy:gpr64all = COPY $x0
51   ; CHECK:   [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_32
52   ; CHECK:   [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
53   ; CHECK:   TBNZW [[COPY1]], 3, %bb.1
54   ; CHECK:   B %bb.0
55   ; CHECK: bb.1:
56   ; CHECK:   RET_ReallyLR
57   bb.0:
58     successors: %bb.0, %bb.1
59     liveins: $x0
60     %copy:gpr(s64) = COPY $x0
61     %bit:gpr(s64) = G_CONSTANT i64 8
62     %zero:gpr(s64) = G_CONSTANT i64 0
63     %fold_cst:gpr(s64) = G_CONSTANT i64 8
65     ; Same as above, but with the constant on the other side.
66     %fold_me:gpr(s64) = G_AND %fold_cst, %copy
68     %and:gpr(s64) = G_AND %fold_me, %bit
69     %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero
70     G_BRCOND %cmp, %bb.1
71     G_BR %bb.0
72   bb.1:
73     RET_ReallyLR
74 ...
75 ---
76 name:            dont_fold_and
77 alignment:       4
78 legalized:       true
79 regBankSelected: true
80 body:             |
81   ; CHECK-LABEL: name: dont_fold_and
82   ; CHECK: bb.0:
83   ; CHECK:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
84   ; CHECK:   %copy:gpr64 = COPY $x0
85   ; CHECK:   %fold_me:gpr64sp = ANDXri %copy, 4098
86   ; CHECK:   [[COPY:%[0-9]+]]:gpr32all = COPY %fold_me.sub_32
87   ; CHECK:   [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
88   ; CHECK:   TBNZW [[COPY1]], 3, %bb.1
89   ; CHECK:   B %bb.0
90   ; CHECK: bb.1:
91   ; CHECK:   RET_ReallyLR
92   bb.0:
93     successors: %bb.0, %bb.1
94     liveins: $x0
95     %copy:gpr(s64) = COPY $x0
96     %bit:gpr(s64) = G_CONSTANT i64 8
97     %zero:gpr(s64) = G_CONSTANT i64 0
99     ; tbnz (and x, 7), 3 != tbnz x, 3, because the third bit of x & 7 is always
100     ; zero.
101     %fold_cst:gpr(s64) = G_CONSTANT i64 7
103     %fold_me:gpr(s64) = G_AND %copy, %fold_cst
104     %and:gpr(s64) = G_AND %fold_me, %bit
105     %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero
106     G_BRCOND %cmp, %bb.1
107     G_BR %bb.0
108   bb.1:
109     RET_ReallyLR