119 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple aarch64-unknown-unknown -run-pass=instruction-select -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s3#4# Check folding an AND into a G_BRCOND which has been matched as a TB(N)Z.5...6---7name: fold_and_rhs8alignment: 49legalized: true10regBankSelected: true11body: |12 ; CHECK-LABEL: name: fold_and_rhs13 ; CHECK: bb.0:14 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)15 ; CHECK-NEXT: liveins: $x016 ; CHECK-NEXT: {{ $}}17 ; CHECK-NEXT: %copy:gpr64all = COPY $x018 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_3219 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]20 ; CHECK-NEXT: TBNZW [[COPY1]], 3, %bb.121 ; CHECK-NEXT: B %bb.022 ; CHECK-NEXT: {{ $}}23 ; CHECK-NEXT: bb.1:24 ; CHECK-NEXT: RET_ReallyLR25 bb.0:26 successors: %bb.0, %bb.127 liveins: $x028 %copy:gpr(s64) = COPY $x029 %bit:gpr(s64) = G_CONSTANT i64 830 %zero:gpr(s64) = G_CONSTANT i64 031 %fold_cst:gpr(s64) = G_CONSTANT i64 832 33 ; tbnz (and x, 8), 3 == tbnz x, 3 because the third bit of x & 8 is 1 when34 ; the third bit of x is 1.35 %fold_me:gpr(s64) = G_AND %copy, %fold_cst36 37 %and:gpr(s64) = G_AND %fold_me, %bit38 %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero39 G_BRCOND %cmp, %bb.140 G_BR %bb.041 bb.1:42 RET_ReallyLR43...44---45name: fold_and_lhs46alignment: 447legalized: true48regBankSelected: true49body: |50 ; CHECK-LABEL: name: fold_and_lhs51 ; CHECK: bb.0:52 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)53 ; CHECK-NEXT: liveins: $x054 ; CHECK-NEXT: {{ $}}55 ; CHECK-NEXT: %copy:gpr64all = COPY $x056 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_3257 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]58 ; CHECK-NEXT: TBNZW [[COPY1]], 3, %bb.159 ; CHECK-NEXT: B %bb.060 ; CHECK-NEXT: {{ $}}61 ; CHECK-NEXT: bb.1:62 ; CHECK-NEXT: RET_ReallyLR63 bb.0:64 successors: %bb.0, %bb.165 liveins: $x066 %copy:gpr(s64) = COPY $x067 %bit:gpr(s64) = G_CONSTANT i64 868 %zero:gpr(s64) = G_CONSTANT i64 069 %fold_cst:gpr(s64) = G_CONSTANT i64 870 71 ; Same as above, but with the constant on the other side.72 %fold_me:gpr(s64) = G_AND %fold_cst, %copy73 74 %and:gpr(s64) = G_AND %fold_me, %bit75 %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero76 G_BRCOND %cmp, %bb.177 G_BR %bb.078 bb.1:79 RET_ReallyLR80...81---82name: dont_fold_and83alignment: 484legalized: true85regBankSelected: true86body: |87 ; CHECK-LABEL: name: dont_fold_and88 ; CHECK: bb.0:89 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)90 ; CHECK-NEXT: liveins: $x091 ; CHECK-NEXT: {{ $}}92 ; CHECK-NEXT: %copy:gpr64 = COPY $x093 ; CHECK-NEXT: %fold_me:gpr64sp = ANDXri %copy, 409894 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %fold_me.sub_3295 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]96 ; CHECK-NEXT: TBNZW [[COPY1]], 3, %bb.197 ; CHECK-NEXT: B %bb.098 ; CHECK-NEXT: {{ $}}99 ; CHECK-NEXT: bb.1:100 ; CHECK-NEXT: RET_ReallyLR101 bb.0:102 successors: %bb.0, %bb.1103 liveins: $x0104 %copy:gpr(s64) = COPY $x0105 %bit:gpr(s64) = G_CONSTANT i64 8106 %zero:gpr(s64) = G_CONSTANT i64 0107 108 ; tbnz (and x, 7), 3 != tbnz x, 3, because the third bit of x & 7 is always109 ; zero.110 %fold_cst:gpr(s64) = G_CONSTANT i64 7111 112 %fold_me:gpr(s64) = G_AND %copy, %fold_cst113 %and:gpr(s64) = G_AND %fold_me, %bit114 %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero115 G_BRCOND %cmp, %bb.1116 G_BR %bb.0117 bb.1:118 RET_ReallyLR119