|
2 | 2 | ; Test removal of AND operations that don't affect last 6 bits of shift amount
|
3 | 3 | ; operand.
|
4 | 4 | ;
|
5 |
| -; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s |
| 5 | +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s |
6 | 6 |
|
7 | 7 | ; Test that AND is not removed when some lower 6 bits are not set.
|
8 | 8 | define i32 @f1(i32 %a, i32 %sh) {
|
@@ -119,35 +119,91 @@ define i32 @f10(i32 %a, i32 %sh) {
|
119 | 119 | ret i32 %reuse
|
120 | 120 | }
|
121 | 121 |
|
122 |
| -; Test that AND is not removed for i128 (which calls __ashlti3) |
123 | 122 | define i128 @f11(i128 %a, i32 %sh) {
|
124 | 123 | ; CHECK-LABEL: f11:
|
125 | 124 | ; CHECK: # %bb.0:
|
126 |
| -; CHECK-NEXT: stmg %r13, %r15, 104(%r15) |
127 |
| -; CHECK-NEXT: .cfi_offset %r13, -56 |
| 125 | +; CHECK-NEXT: stmg %r14, %r15, 112(%r15) |
128 | 126 | ; CHECK-NEXT: .cfi_offset %r14, -48
|
129 | 127 | ; CHECK-NEXT: .cfi_offset %r15, -40
|
130 |
| -; CHECK-NEXT: aghi %r15, -192 |
131 |
| -; CHECK-NEXT: .cfi_def_cfa_offset 352 |
132 | 128 | ; CHECK-NEXT: lg %r0, 8(%r3)
|
133 |
| -; CHECK-NEXT: # kill: def $r4l killed $r4l def $r4d |
134 |
| -; CHECK-NEXT: lgr %r13, %r2 |
135 | 129 | ; CHECK-NEXT: lg %r1, 0(%r3)
|
136 |
| -; CHECK-NEXT: stg %r0, 168(%r15) |
137 |
| -; CHECK-NEXT: risbg %r4, %r4, 57, 191, 0 |
138 |
| -; CHECK-NEXT: la %r2, 176(%r15) |
139 |
| -; CHECK-NEXT: la %r3, 160(%r15) |
140 |
| -; CHECK-NEXT: stg %r1, 160(%r15) |
141 |
| -; CHECK-NEXT: brasl %r14, __ashlti3@PLT |
142 |
| -; CHECK-NEXT: lg %r0, 184(%r15) |
143 |
| -; CHECK-NEXT: lg %r1, 176(%r15) |
144 |
| -; CHECK-NEXT: stg %r0, 8(%r13) |
145 |
| -; CHECK-NEXT: stg %r1, 0(%r13) |
146 |
| -; CHECK-NEXT: lmg %r13, %r15, 296(%r15) |
| 130 | +; CHECK-NEXT: risblg %r3, %r4, 25, 159, 0 |
| 131 | +; CHECK-NEXT: lcr %r14, %r3 |
| 132 | +; CHECK-NEXT: sllg %r5, %r1, 0(%r4) |
| 133 | +; CHECK-NEXT: srlg %r14, %r0, 0(%r14) |
| 134 | +; CHECK-NEXT: ogr %r5, %r14 |
| 135 | +; CHECK-NEXT: sllg %r3, %r0, -64(%r3) |
| 136 | +; CHECK-NEXT: tmll %r4, 127 |
| 137 | +; CHECK-NEXT: locgrle %r3, %r5 |
| 138 | +; CHECK-NEXT: sllg %r0, %r0, 0(%r4) |
| 139 | +; CHECK-NEXT: locgre %r3, %r1 |
| 140 | +; CHECK-NEXT: locghinle %r0, 0 |
| 141 | +; CHECK-NEXT: stg %r0, 8(%r2) |
| 142 | +; CHECK-NEXT: stg %r3, 0(%r2) |
| 143 | +; CHECK-NEXT: lmg %r14, %r15, 112(%r15) |
147 | 144 | ; CHECK-NEXT: br %r14
|
148 | 145 | %and = and i32 %sh, 127
|
149 | 146 | %ext = zext i32 %and to i128
|
150 | 147 | %shift = shl i128 %a, %ext
|
151 | 148 | ret i128 %shift
|
152 | 149 | }
|
153 | 150 |
|
| 151 | +define i128 @f12(i128 %a, i32 %sh) { |
| 152 | +; CHECK-LABEL: f12: |
| 153 | +; CHECK: # %bb.0: |
| 154 | +; CHECK-NEXT: stmg %r14, %r15, 112(%r15) |
| 155 | +; CHECK-NEXT: .cfi_offset %r14, -48 |
| 156 | +; CHECK-NEXT: .cfi_offset %r15, -40 |
| 157 | +; CHECK-NEXT: lg %r0, 0(%r3) |
| 158 | +; CHECK-NEXT: lg %r1, 8(%r3) |
| 159 | +; CHECK-NEXT: risblg %r3, %r4, 25, 159, 0 |
| 160 | +; CHECK-NEXT: lcr %r14, %r3 |
| 161 | +; CHECK-NEXT: srlg %r5, %r1, 0(%r4) |
| 162 | +; CHECK-NEXT: sllg %r14, %r0, 0(%r14) |
| 163 | +; CHECK-NEXT: ogr %r5, %r14 |
| 164 | +; CHECK-NEXT: srlg %r3, %r0, -64(%r3) |
| 165 | +; CHECK-NEXT: tmll %r4, 127 |
| 166 | +; CHECK-NEXT: locgrle %r3, %r5 |
| 167 | +; CHECK-NEXT: srlg %r0, %r0, 0(%r4) |
| 168 | +; CHECK-NEXT: locgre %r3, %r1 |
| 169 | +; CHECK-NEXT: locghinle %r0, 0 |
| 170 | +; CHECK-NEXT: stg %r0, 0(%r2) |
| 171 | +; CHECK-NEXT: stg %r3, 8(%r2) |
| 172 | +; CHECK-NEXT: lmg %r14, %r15, 112(%r15) |
| 173 | +; CHECK-NEXT: br %r14 |
| 174 | + %and = and i32 %sh, 127 |
| 175 | + %ext = zext i32 %and to i128 |
| 176 | + %shift = lshr i128 %a, %ext |
| 177 | + ret i128 %shift |
| 178 | +} |
| 179 | + |
| 180 | +define i128 @f13(i128 %a, i32 %sh) { |
| 181 | +; CHECK-LABEL: f13: |
| 182 | +; CHECK: # %bb.0: |
| 183 | +; CHECK-NEXT: stmg %r14, %r15, 112(%r15) |
| 184 | +; CHECK-NEXT: .cfi_offset %r14, -48 |
| 185 | +; CHECK-NEXT: .cfi_offset %r15, -40 |
| 186 | +; CHECK-NEXT: lg %r0, 0(%r3) |
| 187 | +; CHECK-NEXT: lg %r1, 8(%r3) |
| 188 | +; CHECK-NEXT: risblg %r3, %r4, 25, 159, 0 |
| 189 | +; CHECK-NEXT: lcr %r14, %r3 |
| 190 | +; CHECK-NEXT: srlg %r5, %r1, 0(%r4) |
| 191 | +; CHECK-NEXT: sllg %r14, %r0, 0(%r14) |
| 192 | +; CHECK-NEXT: ogr %r5, %r14 |
| 193 | +; CHECK-NEXT: srag %r14, %r0, 0(%r4) |
| 194 | +; CHECK-NEXT: srag %r3, %r0, -64(%r3) |
| 195 | +; CHECK-NEXT: srag %r0, %r0, 63 |
| 196 | +; CHECK-NEXT: tmll %r4, 127 |
| 197 | +; CHECK-NEXT: locgrle %r3, %r5 |
| 198 | +; CHECK-NEXT: locgre %r3, %r1 |
| 199 | +; CHECK-NEXT: locgrle %r0, %r14 |
| 200 | +; CHECK-NEXT: stg %r0, 0(%r2) |
| 201 | +; CHECK-NEXT: stg %r3, 8(%r2) |
| 202 | +; CHECK-NEXT: lmg %r14, %r15, 112(%r15) |
| 203 | +; CHECK-NEXT: br %r14 |
| 204 | + %and = and i32 %sh, 127 |
| 205 | + %ext = zext i32 %and to i128 |
| 206 | + %shift = ashr i128 %a, %ext |
| 207 | + ret i128 %shift |
| 208 | +} |
| 209 | + |
0 commit comments