1# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z14 -start-before=greedy %s -o - \ 2# RUN: | FileCheck %s 3# 4# Test folding of a memory operand into logical compare with an immediate. 5 6--- | 7 define i32 @fun0(ptr %src, i32 %arg) { ret i32 0 } 8 define i64 @fun1(ptr %src, i64 %arg) { ret i64 0 } 9 define i32 @fun2(ptr %src, i32 %arg) { ret i32 0 } 10 define i64 @fun3(ptr %src, i64 %arg) { ret i64 0 } 11... 12 13 14# CHECK-LABEL: fun0: 15# CHECK: mvhi 160(%r15), 0 # 4-byte Folded Spill 16# CHECK: mvc 160(4,%r15), 0(%r2) # 4-byte Folded Spill 17# CHECK-LABEL: .LBB0_2: 18# CHECK: clfhsi 160(%r15), 2 # 4-byte Folded Reload 19--- 20name: fun0 21alignment: 16 22tracksRegLiveness: true 23registers: 24 - { id: 0, class: grx32bit } 25 - { id: 1, class: grx32bit } 26 - { id: 2, class: addr64bit } 27 - { id: 3, class: gr32bit } 28 - { id: 4, class: grx32bit } 29 - { id: 5, class: grx32bit } 30 - { id: 6, class: gr32bit } 31 - { id: 7, class: gr32bit } 32 - { id: 8, class: grx32bit } 33liveins: 34 - { reg: '$r2d', virtual-reg: '%2' } 35 - { reg: '$r3l', virtual-reg: '%3' } 36frameInfo: 37 maxAlignment: 1 38 hasOpaqueSPAdjustment: true 39machineFunctionInfo: {} 40body: | 41 bb.0: 42 successors: %bb.1(0x30000000), %bb.2(0x50000000) 43 liveins: $r2d, $r3l 44 45 %3:gr32bit = COPY $r3l 46 %2:addr64bit = COPY $r2d 47 %6:gr32bit = LHIMux 0 48 CHIMux %3, 0, implicit-def $cc 49 %8:grx32bit = LHIMux 0 50 BRC 14, 6, %bb.2, implicit killed $cc 51 J %bb.1 52 53 bb.1: 54 %8:grx32bit = LMux %2, 0, $noreg :: (load (s32) from %ir.src) 55 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 56 57 bb.2: 58 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 59 CLFIMux %8, 2, implicit-def $cc 60 %6:gr32bit = LOCHIMux %6, 1, 14, 6, implicit killed $cc 61 %7:gr32bit = NRK %3, %6, implicit-def dead $cc 62 $r2l = COPY %7 63 Return implicit $r2l 64 65... 66 67 68# CHECK-LABEL: fun1: 69# CHECK: mvghi 160(%r15), 0 # 8-byte Folded Spill 70# CHECK: mvc 160(8,%r15), 0(%r2) # 8-byte Folded Spill 71# CHECK-LABEL: .LBB1_2: 72# CHECK: clghsi 160(%r15), 2 # 8-byte Folded Reload 73--- 74name: fun1 75alignment: 16 76tracksRegLiveness: true 77registers: 78 - { id: 0, class: gr64bit } 79 - { id: 1, class: gr64bit } 80 - { id: 2, class: addr64bit } 81 - { id: 3, class: gr64bit } 82 - { id: 4, class: gr64bit } 83 - { id: 5, class: gr64bit } 84 - { id: 6, class: gr64bit } 85 - { id: 7, class: gr64bit } 86 - { id: 8, class: gr64bit } 87liveins: 88 - { reg: '$r2d', virtual-reg: '%2' } 89 - { reg: '$r3d', virtual-reg: '%3' } 90frameInfo: 91 maxAlignment: 1 92 hasOpaqueSPAdjustment: true 93machineFunctionInfo: {} 94body: | 95 bb.0: 96 successors: %bb.1(0x30000000), %bb.2(0x50000000) 97 liveins: $r2d, $r3d 98 99 %3:gr64bit = COPY $r3d 100 %2:addr64bit = COPY $r2d 101 %6:gr64bit = LGHI 0 102 CGHI %3, 0, implicit-def $cc 103 %8:gr64bit = LGHI 0 104 BRC 14, 6, %bb.2, implicit killed $cc 105 J %bb.1 106 107 bb.1: 108 %8:gr64bit = LG %2, 0, $noreg :: (load (s64) from %ir.src) 109 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 110 111 bb.2: 112 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 113 CLGFI %8, 2, implicit-def $cc 114 %6:gr64bit = LOCGHI %6, 1, 14, 6, implicit killed $cc 115 %7:gr64bit = NGRK %3, %6, implicit-def dead $cc 116 $r2d = COPY %7 117 Return implicit $r2d 118 119... 120 121 122# 17-bit immediate can not be folded 123 124# CHECK-LABEL: fun2: 125# CHECK: mvhi 160(%r15), 0 # 4-byte Folded Spill 126# CHECK: mvc 160(4,%r15), 0(%r2) # 4-byte Folded Spill 127# CHECK-LABEL: .LBB2_2: 128# CHECK: l %r0, 160(%r15) # 4-byte Folded Reload 129# CHECK: clfi %r0, 65536 130--- 131name: fun2 132alignment: 16 133tracksRegLiveness: true 134registers: 135 - { id: 0, class: grx32bit } 136 - { id: 1, class: grx32bit } 137 - { id: 2, class: addr64bit } 138 - { id: 3, class: gr32bit } 139 - { id: 4, class: grx32bit } 140 - { id: 5, class: grx32bit } 141 - { id: 6, class: gr32bit } 142 - { id: 7, class: gr32bit } 143 - { id: 8, class: grx32bit } 144liveins: 145 - { reg: '$r2d', virtual-reg: '%2' } 146 - { reg: '$r3l', virtual-reg: '%3' } 147frameInfo: 148 maxAlignment: 1 149 hasOpaqueSPAdjustment: true 150machineFunctionInfo: {} 151body: | 152 bb.0: 153 successors: %bb.1(0x30000000), %bb.2(0x50000000) 154 liveins: $r2d, $r3l 155 156 %3:gr32bit = COPY $r3l 157 %2:addr64bit = COPY $r2d 158 %6:gr32bit = LHIMux 0 159 CHIMux %3, 0, implicit-def $cc 160 %8:grx32bit = LHIMux 0 161 BRC 14, 6, %bb.2, implicit killed $cc 162 J %bb.1 163 164 bb.1: 165 %8:grx32bit = LMux %2, 0, $noreg :: (load (s32) from %ir.src) 166 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 167 168 bb.2: 169 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 170 CLFIMux %8, 65536, implicit-def $cc 171 %6:gr32bit = LOCHIMux %6, 1, 14, 6, implicit killed $cc 172 %7:gr32bit = NRK %3, %6, implicit-def dead $cc 173 $r2l = COPY %7 174 Return implicit $r2l 175 176... 177 178 179# 17-bit immediate can not be folded 180 181# CHECK-LABEL: fun3: 182# CHECK: mvghi 160(%r15), 0 # 8-byte Folded Spill 183# CHECK: mvc 160(8,%r15), 0(%r2) # 8-byte Folded Spill 184# CHECK-LABEL: .LBB3_2: 185# CHECK: lg %r0, 160(%r15) # 8-byte Folded Reload 186# CHECK: clgfi %r0, 65536 187--- 188name: fun3 189alignment: 16 190tracksRegLiveness: true 191registers: 192 - { id: 0, class: gr64bit } 193 - { id: 1, class: gr64bit } 194 - { id: 2, class: addr64bit } 195 - { id: 3, class: gr64bit } 196 - { id: 4, class: gr64bit } 197 - { id: 5, class: gr64bit } 198 - { id: 6, class: gr64bit } 199 - { id: 7, class: gr64bit } 200 - { id: 8, class: gr64bit } 201liveins: 202 - { reg: '$r2d', virtual-reg: '%2' } 203 - { reg: '$r3d', virtual-reg: '%3' } 204frameInfo: 205 maxAlignment: 1 206 hasOpaqueSPAdjustment: true 207machineFunctionInfo: {} 208body: | 209 bb.0: 210 successors: %bb.1(0x30000000), %bb.2(0x50000000) 211 liveins: $r2d, $r3d 212 213 %3:gr64bit = COPY $r3d 214 %2:addr64bit = COPY $r2d 215 %6:gr64bit = LGHI 0 216 CGHI %3, 0, implicit-def $cc 217 %8:gr64bit = LGHI 0 218 BRC 14, 6, %bb.2, implicit killed $cc 219 J %bb.1 220 221 bb.1: 222 %8:gr64bit = LG %2, 0, $noreg :: (load (s64) from %ir.src) 223 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 224 225 bb.2: 226 INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d 227 CLGFI %8, 65536, implicit-def $cc 228 %6:gr64bit = LOCGHI %6, 1, 14, 6, implicit killed $cc 229 %7:gr64bit = NGRK %3, %6, implicit-def dead $cc 230 $r2d = COPY %7 231 Return implicit $r2d 232 233... 234