1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple aarch64-unknown-unknown -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s 3# 4# Test that we can produce a tbz when we have a sgt compare against -1. 5# 6# The bit tested should be the size of the test register minus 1. 7# 8 9... 10--- 11name: tbzx_sgt 12alignment: 4 13legalized: true 14regBankSelected: true 15body: | 16 ; CHECK-LABEL: name: tbzx_sgt 17 ; CHECK: bb.0: 18 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000) 19 ; CHECK: %copy:gpr64 = COPY $x0 20 ; CHECK: TBZX %copy, 63, %bb.1 21 ; CHECK: B %bb.0 22 ; CHECK: bb.1: 23 ; CHECK: RET_ReallyLR 24 bb.0: 25 successors: %bb.0, %bb.1 26 liveins: $x0 27 %copy:gpr(s64) = COPY $x0 28 %negative_one:gpr(s64) = G_CONSTANT i64 -1 29 %cmp:gpr(s32) = G_ICMP intpred(sgt), %copy(s64), %negative_one 30 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32) 31 G_BRCOND %cmp_trunc(s1), %bb.1 32 G_BR %bb.0 33 bb.1: 34 RET_ReallyLR 35 36... 37--- 38name: tbzw_sgt 39alignment: 4 40legalized: true 41regBankSelected: true 42body: | 43 ; CHECK-LABEL: name: tbzw_sgt 44 ; CHECK: bb.0: 45 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000) 46 ; CHECK: %copy:gpr32 = COPY $w0 47 ; CHECK: TBZW %copy, 31, %bb.1 48 ; CHECK: B %bb.0 49 ; CHECK: bb.1: 50 ; CHECK: RET_ReallyLR 51 bb.0: 52 successors: %bb.0, %bb.1 53 liveins: $x0 54 %copy:gpr(s32) = COPY $w0 55 %negative_one:gpr(s32) = G_CONSTANT i32 -1 56 %cmp:gpr(s32) = G_ICMP intpred(sgt), %copy(s32), %negative_one 57 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32) 58 G_BRCOND %cmp_trunc(s1), %bb.1 59 G_BR %bb.0 60 bb.1: 61 RET_ReallyLR 62 63... 64--- 65name: no_tbz_not_negative_one 66alignment: 4 67legalized: true 68regBankSelected: true 69body: | 70 ; CHECK-LABEL: name: no_tbz_not_negative_one 71 ; CHECK: bb.0: 72 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000) 73 ; CHECK: %copy:gpr32sp = COPY $w0 74 ; CHECK: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri %copy, 1, 0, implicit-def $nzcv 75 ; CHECK: Bcc 12, %bb.1, implicit $nzcv 76 ; CHECK: B %bb.0 77 ; CHECK: bb.1: 78 ; CHECK: RET_ReallyLR 79 bb.0: 80 successors: %bb.0, %bb.1 81 liveins: $x0 82 %copy:gpr(s32) = COPY $w0 83 %one:gpr(s32) = G_CONSTANT i32 1 84 %cmp:gpr(s32) = G_ICMP intpred(sgt), %copy(s32), %one 85 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32) 86 G_BRCOND %cmp_trunc(s1), %bb.1 87 G_BR %bb.0 88 bb.1: 89 RET_ReallyLR 90 91... 92--- 93name: dont_fold_and 94alignment: 4 95legalized: true 96regBankSelected: true 97body: | 98 ; CHECK-LABEL: name: dont_fold_and 99 ; CHECK: bb.0: 100 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000) 101 ; CHECK: %copy:gpr64 = COPY $x0 102 ; CHECK: %and:gpr64sp = ANDXri %copy, 8000 103 ; CHECK: [[ADDSXri:%[0-9]+]]:gpr64 = ADDSXri %and, 1, 0, implicit-def $nzcv 104 ; CHECK: Bcc 12, %bb.1, implicit $nzcv 105 ; CHECK: B %bb.0 106 ; CHECK: bb.1: 107 ; CHECK: RET_ReallyLR 108 bb.0: 109 successors: %bb.0, %bb.1 110 liveins: $x0 111 %copy:gpr(s64) = COPY $x0 112 %bit:gpr(s64) = G_CONSTANT i64 8 113 %negative_one:gpr(s64) = G_CONSTANT i64 -1 114 %c:gpr(s64) = G_CONSTANT i64 8 115 %and:gpr(s64) = G_AND %copy, %bit 116 %cmp:gpr(s32) = G_ICMP intpred(sgt), %and(s64), %negative_one 117 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32) 118 G_BRCOND %cmp_trunc(s1), %bb.1 119 G_BR %bb.0 120 bb.1: 121 RET_ReallyLR 122 123... 124--- 125name: dont_commute 126alignment: 4 127legalized: true 128regBankSelected: true 129body: | 130 ; CHECK-LABEL: name: dont_commute 131 ; CHECK: bb.0: 132 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000) 133 ; CHECK: %copy:gpr64 = COPY $x0 134 ; CHECK: %negative_one:gpr64 = MOVi64imm -1 135 ; CHECK: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr %negative_one, %copy, implicit-def $nzcv 136 ; CHECK: Bcc 12, %bb.1, implicit $nzcv 137 ; CHECK: B %bb.0 138 ; CHECK: bb.1: 139 ; CHECK: RET_ReallyLR 140 bb.0: 141 successors: %bb.0, %bb.1 142 liveins: $x0 143 %copy:gpr(s64) = COPY $x0 144 %negative_one:gpr(s64) = G_CONSTANT i64 -1 145 %cmp:gpr(s32) = G_ICMP intpred(sgt), %negative_one, %copy(s64) 146 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32) 147 G_BRCOND %cmp_trunc(s1), %bb.1 148 G_BR %bb.0 149 bb.1: 150 RET_ReallyLR 151