1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -O0 -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
--- |
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
define void @xor_s32_gpr() { ret void }
define void @xor_s64_gpr() { ret void }
define void @xor_constant_n1_s32_gpr() { ret void }
define void @xor_constant_n1_s64_gpr() { ret void }
define void @xor_constant_n1_s32_gpr_2bb() { ret void }
...
---
# Check that we select a 32-bit GPR G_XOR into EORWrr on GPR32.
# Also check that we constrain the register class of the COPY to GPR32.
name: xor_s32_gpr
legalized: true
regBankSelected: true
registers:
- { id: 0, class: gpr }
- { id: 1, class: gpr }
- { id: 2, class: gpr }
body: |
bb.0:
liveins: $w0, $w1
; CHECK-LABEL: name: xor_s32_gpr
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
; CHECK: [[EORWrr:%[0-9]+]]:gpr32 = EORWrr [[COPY]], [[COPY1]]
; CHECK: $w0 = COPY [[EORWrr]]
%0(s32) = COPY $w0
%1(s32) = COPY $w1
%2(s32) = G_XOR %0, %1
$w0 = COPY %2(s32)
...
---
# Same as xor_s64_gpr, for 64-bit operations.
name: xor_s64_gpr
legalized: true
regBankSelected: true
registers:
- { id: 0, class: gpr }
- { id: 1, class: gpr }
- { id: 2, class: gpr }
body: |
bb.0:
liveins: $x0, $x1
; CHECK-LABEL: name: xor_s64_gpr
; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
; CHECK: [[EORXrr:%[0-9]+]]:gpr64 = EORXrr [[COPY]], [[COPY1]]
; CHECK: $x0 = COPY [[EORXrr]]
%0(s64) = COPY $x0
%1(s64) = COPY $x1
%2(s64) = G_XOR %0, %1
$x0 = COPY %2(s64)
...
---
# Check that we select a 32-bit GPR G_XOR into EORWrr on GPR32.
# Also check that we constrain the register class of the COPY to GPR32.
name: xor_constant_n1_s32_gpr
legalized: true
regBankSelected: true
registers:
- { id: 0, class: gpr }
- { id: 1, class: gpr }
- { id: 2, class: gpr }
body: |
bb.0:
liveins: $w0
; CHECK-LABEL: name: xor_constant_n1_s32_gpr
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
; CHECK: [[ORNWrr:%[0-9]+]]:gpr32 = ORNWrr $wzr, [[COPY]]
; CHECK: $w0 = COPY [[ORNWrr]]
%0(s32) = COPY $w0
%1(s32) = G_CONSTANT i32 -1
%2(s32) = G_XOR %0, %1
$w0 = COPY %2(s32)
...
---
# Same as xor_constant_n1_s64_gpr, for 64-bit operations.
name: xor_constant_n1_s64_gpr
legalized: true
regBankSelected: true
registers:
- { id: 0, class: gpr }
- { id: 1, class: gpr }
- { id: 2, class: gpr }
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: xor_constant_n1_s64_gpr
; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
; CHECK: [[ORNXrr:%[0-9]+]]:gpr64 = ORNXrr $xzr, [[COPY]]
; CHECK: $x0 = COPY [[ORNXrr]]
%0(s64) = COPY $x0
%1(s64) = G_CONSTANT i64 -1
%2(s64) = G_XOR %0, %1
$x0 = COPY %2(s64)
...
---
# Check that we can obtain constants from other basic blocks.
name: xor_constant_n1_s32_gpr_2bb
legalized: true
regBankSelected: true
registers:
- { id: 0, class: gpr }
- { id: 1, class: gpr }
- { id: 2, class: gpr }
body: |
; CHECK-LABEL: name: xor_constant_n1_s32_gpr_2bb
; CHECK: bb.0:
; CHECK: successors: %bb.1(0x80000000)
; CHECK: B %bb.1
; CHECK: bb.1:
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
; CHECK: [[ORNWrr:%[0-9]+]]:gpr32 = ORNWrr $wzr, [[COPY]]
; CHECK: $w0 = COPY [[ORNWrr]]
bb.0:
liveins: $w0, $w1
successors: %bb.1
%1(s32) = G_CONSTANT i32 -1
G_BR %bb.1
bb.1:
%0(s32) = COPY $w0
%2(s32) = G_XOR %0, %1
$w0 = COPY %2(s32)
...
|