|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; Simulate register pressure around setjmp call for integer arguments. |
| 3 | +; Test assembly of funtion call foo in func() in setjmp if and else part. |
| 4 | +; extern foo has 20 argument pointer to int. |
| 5 | +; Test setjmp store jmp_buf. |
| 6 | +; Return address in slot 2. |
| 7 | +; Stack Pointer in slot 4. |
| 8 | +; Clobber %r6-%r15, %f8-%f15. |
| 9 | + |
| 10 | +; RUN: llc < %s -mtriple=s390x-linux-gnu -O2 | FileCheck %s |
| 11 | + |
| 12 | +declare i32 @llvm.eh.sjlj.setjmp(ptr) |
| 13 | +declare void @foo(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr |
| 14 | +@buf = global [10 x ptr] zeroinitializer, align 8 |
| 15 | +@t = global i32 0, align 4 |
| 16 | +@s = global i32 0, align 4 |
| 17 | +@r = global i32 0, align 4 |
| 18 | +@q = global i32 0, align 4 |
| 19 | +@p = global i32 0, align 4 |
| 20 | +@o = global i32 0, align 4 |
| 21 | +@n = global i32 0, align 4 |
| 22 | +@m = global i32 0, align 4 |
| 23 | +@l = global i32 0, align 4 |
| 24 | +@k = global i32 0, align 4 |
| 25 | +@j = global i32 0, align 4 |
| 26 | +@i = global i32 0, align 4 |
| 27 | +@h = global i32 0, align 4 |
| 28 | +@g = global i32 0, align 4 |
| 29 | +@f = global i32 0, align 4 |
| 30 | +@e = global i32 0, align 4 |
| 31 | +@d = global i32 0, align 4 |
| 32 | +@c = global i32 0, align 4 |
| 33 | +@b = global i32 0, align 4 |
| 34 | +@a = global i32 0, align 4 |
| 35 | + |
| 36 | +define signext i32 @func() { |
| 37 | +; CHECK-LABEL: func: |
| 38 | +; CHECK: # %bb.0: # %entry |
| 39 | +; CHECK-NEXT: stmg %r6, %r15, 48(%r15) |
| 40 | +; CHECK-NEXT: .cfi_offset %r6, -112 |
| 41 | +; CHECK-NEXT: .cfi_offset %r7, -104 |
| 42 | +; CHECK-NEXT: .cfi_offset %r8, -96 |
| 43 | +; CHECK-NEXT: .cfi_offset %r9, -88 |
| 44 | +; CHECK-NEXT: .cfi_offset %r10, -80 |
| 45 | +; CHECK-NEXT: .cfi_offset %r11, -72 |
| 46 | +; CHECK-NEXT: .cfi_offset %r12, -64 |
| 47 | +; CHECK-NEXT: .cfi_offset %r13, -56 |
| 48 | +; CHECK-NEXT: .cfi_offset %r14, -48 |
| 49 | +; CHECK-NEXT: .cfi_offset %r15, -40 |
| 50 | +; CHECK-NEXT: aghi %r15, -448 |
| 51 | +; CHECK-NEXT: .cfi_def_cfa_offset 608 |
| 52 | +; CHECK-NEXT: std %f8, 440(%r15) # 8-byte Folded Spill |
| 53 | +; CHECK-NEXT: std %f9, 432(%r15) # 8-byte Folded Spill |
| 54 | +; CHECK-NEXT: std %f10, 424(%r15) # 8-byte Folded Spill |
| 55 | +; CHECK-NEXT: std %f11, 416(%r15) # 8-byte Folded Spill |
| 56 | +; CHECK-NEXT: std %f12, 408(%r15) # 8-byte Folded Spill |
| 57 | +; CHECK-NEXT: std %f13, 400(%r15) # 8-byte Folded Spill |
| 58 | +; CHECK-NEXT: std %f14, 392(%r15) # 8-byte Folded Spill |
| 59 | +; CHECK-NEXT: std %f15, 384(%r15) # 8-byte Folded Spill |
| 60 | +; CHECK-NEXT: .cfi_offset %f8, -168 |
| 61 | +; CHECK-NEXT: .cfi_offset %f9, -176 |
| 62 | +; CHECK-NEXT: .cfi_offset %f10, -184 |
| 63 | +; CHECK-NEXT: .cfi_offset %f11, -192 |
| 64 | +; CHECK-NEXT: .cfi_offset %f12, -200 |
| 65 | +; CHECK-NEXT: .cfi_offset %f13, -208 |
| 66 | +; CHECK-NEXT: .cfi_offset %f14, -216 |
| 67 | +; CHECK-NEXT: .cfi_offset %f15, -224 |
| 68 | +; CHECK-NEXT: lgrl %r1, buf@GOT |
| 69 | +; CHECK-NEXT: larl %r0, .LBB0_1 |
| 70 | +; CHECK-NEXT: stg %r0, 8(%r1) |
| 71 | +; CHECK-NEXT: stg %r15, 24(%r1) |
| 72 | +; CHECK-NEXT: .LBB0_1: # Block address taken |
| 73 | +; CHECK-NEXT: # %entry |
| 74 | +; CHECK-NEXT: .LBB0_2: # %entry |
| 75 | +; CHECK-NEXT: lgrl %r1, t@GOT |
| 76 | +; CHECK-NEXT: stg %r1, 312(%r15) # 8-byte Folded Spill |
| 77 | +; CHECK-NEXT: lgrl %r2, s@GOT |
| 78 | +; CHECK-NEXT: stg %r2, 304(%r15) # 8-byte Folded Spill |
| 79 | +; CHECK-NEXT: lgrl %r3, r@GOT |
| 80 | +; CHECK-NEXT: stg %r3, 296(%r15) # 8-byte Folded Spill |
| 81 | +; CHECK-NEXT: lgrl %r4, q@GOT |
| 82 | +; CHECK-NEXT: stg %r4, 288(%r15) # 8-byte Folded Spill |
| 83 | +; CHECK-NEXT: mvhi 0(%r1), 1 |
| 84 | +; CHECK-NEXT: mvhi 0(%r2), 1 |
| 85 | +; CHECK-NEXT: mvhi 0(%r3), 1 |
| 86 | +; CHECK-NEXT: mvhi 0(%r4), 1 |
| 87 | +; CHECK-NEXT: lgrl %r5, p@GOT |
| 88 | +; CHECK-NEXT: lgrl %r14, o@GOT |
| 89 | +; CHECK-NEXT: lgrl %r1, n@GOT |
| 90 | +; CHECK-NEXT: stg %r1, 280(%r15) # 8-byte Folded Spill |
| 91 | +; CHECK-NEXT: lgrl %r9, m@GOT |
| 92 | +; CHECK-NEXT: mvhi 0(%r5), 1 |
| 93 | +; CHECK-NEXT: stg %r5, 376(%r15) # 8-byte Folded Spill |
| 94 | +; CHECK-NEXT: mvhi 0(%r14), 1 |
| 95 | +; CHECK-NEXT: stg %r14, 368(%r15) # 8-byte Folded Spill |
| 96 | +; CHECK-NEXT: mvhi 0(%r1), 1 |
| 97 | +; CHECK-NEXT: mvhi 0(%r9), 1 |
| 98 | +; CHECK-NEXT: stg %r9, 360(%r15) # 8-byte Folded Spill |
| 99 | +; CHECK-NEXT: lgrl %r1, l@GOT |
| 100 | +; CHECK-NEXT: lgrl %r2, k@GOT |
| 101 | +; CHECK-NEXT: lgrl %r3, j@GOT |
| 102 | +; CHECK-NEXT: lgrl %r4, i@GOT |
| 103 | +; CHECK-NEXT: stg %r4, 344(%r15) # 8-byte Folded Spill |
| 104 | +; CHECK-NEXT: mvhi 0(%r1), 1 |
| 105 | +; CHECK-NEXT: stg %r1, 352(%r15) # 8-byte Folded Spill |
| 106 | +; CHECK-NEXT: mvhi 0(%r2), 1 |
| 107 | +; CHECK-NEXT: stg %r2, 336(%r15) # 8-byte Folded Spill |
| 108 | +; CHECK-NEXT: mvhi 0(%r3), 1 |
| 109 | +; CHECK-NEXT: stg %r3, 328(%r15) # 8-byte Folded Spill |
| 110 | +; CHECK-NEXT: mvhi 0(%r4), 1 |
| 111 | +; CHECK-NEXT: lgrl %r4, h@GOT |
| 112 | +; CHECK-NEXT: lgrl %r8, g@GOT |
| 113 | +; CHECK-NEXT: lgrl %r7, f@GOT |
| 114 | +; CHECK-NEXT: lgrl %r6, e@GOT |
| 115 | +; CHECK-NEXT: mvhi 0(%r4), 1 |
| 116 | +; CHECK-NEXT: stg %r4, 320(%r15) # 8-byte Folded Spill |
| 117 | +; CHECK-NEXT: mvhi 0(%r8), 1 |
| 118 | +; CHECK-NEXT: mvhi 0(%r7), 1 |
| 119 | +; CHECK-NEXT: mvhi 0(%r6), 1 |
| 120 | +; CHECK-NEXT: lgrl %r13, d@GOT |
| 121 | +; CHECK-NEXT: lgrl %r12, c@GOT |
| 122 | +; CHECK-NEXT: lgrl %r11, b@GOT |
| 123 | +; CHECK-NEXT: lgrl %r10, a@GOT |
| 124 | +; CHECK-NEXT: mvhi 0(%r13), 1 |
| 125 | +; CHECK-NEXT: mvhi 0(%r12), 1 |
| 126 | +; CHECK-NEXT: mvhi 0(%r11), 1 |
| 127 | +; CHECK-NEXT: mvhi 0(%r10), 1 |
| 128 | +; CHECK-NEXT: mvc 272(8,%r15), 312(%r15) # 8-byte Folded Reload |
| 129 | +; CHECK-NEXT: mvc 264(8,%r15), 304(%r15) # 8-byte Folded Reload |
| 130 | +; CHECK-NEXT: mvc 256(8,%r15), 296(%r15) # 8-byte Folded Reload |
| 131 | +; CHECK-NEXT: mvc 248(8,%r15), 288(%r15) # 8-byte Folded Reload |
| 132 | +; CHECK-NEXT: stg %r5, 240(%r15) |
| 133 | +; CHECK-NEXT: stg %r14, 232(%r15) |
| 134 | +; CHECK-NEXT: mvc 224(8,%r15), 280(%r15) # 8-byte Folded Reload |
| 135 | +; CHECK-NEXT: stg %r9, 216(%r15) |
| 136 | +; CHECK-NEXT: stg %r1, 208(%r15) |
| 137 | +; CHECK-NEXT: stg %r2, 200(%r15) |
| 138 | +; CHECK-NEXT: stg %r3, 192(%r15) |
| 139 | +; CHECK-NEXT: lg %r9, 344(%r15) # 8-byte Folded Reload |
| 140 | +; CHECK-NEXT: stg %r9, 184(%r15) |
| 141 | +; CHECK-NEXT: stg %r4, 176(%r15) |
| 142 | +; CHECK-NEXT: stg %r8, 168(%r15) |
| 143 | +; CHECK-NEXT: stg %r7, 160(%r15) |
| 144 | +; CHECK-NEXT: lgr %r2, %r10 |
| 145 | +; CHECK-NEXT: lgr %r3, %r11 |
| 146 | +; CHECK-NEXT: lgr %r4, %r12 |
| 147 | +; CHECK-NEXT: lgr %r5, %r13 |
| 148 | +; CHECK-NEXT: brasl %r14, foo@PLT |
| 149 | +; CHECK-NEXT: l %r0, 0(%r11) |
| 150 | +; CHECK-NEXT: a %r0, 0(%r10) |
| 151 | +; CHECK-NEXT: a %r0, 0(%r12) |
| 152 | +; CHECK-NEXT: a %r0, 0(%r13) |
| 153 | +; CHECK-NEXT: a %r0, 0(%r6) |
| 154 | +; CHECK-NEXT: a %r0, 0(%r7) |
| 155 | +; CHECK-NEXT: a %r0, 0(%r8) |
| 156 | +; CHECK-NEXT: lg %r1, 320(%r15) # 8-byte Folded Reload |
| 157 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 158 | +; CHECK-NEXT: a %r0, 0(%r9) |
| 159 | +; CHECK-NEXT: lg %r1, 328(%r15) # 8-byte Folded Reload |
| 160 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 161 | +; CHECK-NEXT: lg %r1, 336(%r15) # 8-byte Folded Reload |
| 162 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 163 | +; CHECK-NEXT: lg %r1, 352(%r15) # 8-byte Folded Reload |
| 164 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 165 | +; CHECK-NEXT: lg %r1, 360(%r15) # 8-byte Folded Reload |
| 166 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 167 | +; CHECK-NEXT: lg %r1, 280(%r15) # 8-byte Folded Reload |
| 168 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 169 | +; CHECK-NEXT: lg %r1, 368(%r15) # 8-byte Folded Reload |
| 170 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 171 | +; CHECK-NEXT: lg %r1, 376(%r15) # 8-byte Folded Reload |
| 172 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 173 | +; CHECK-NEXT: lg %r1, 288(%r15) # 8-byte Folded Reload |
| 174 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 175 | +; CHECK-NEXT: lg %r1, 296(%r15) # 8-byte Folded Reload |
| 176 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 177 | +; CHECK-NEXT: lg %r1, 304(%r15) # 8-byte Folded Reload |
| 178 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 179 | +; CHECK-NEXT: lg %r1, 312(%r15) # 8-byte Folded Reload |
| 180 | +; CHECK-NEXT: a %r0, 0(%r1) |
| 181 | +; CHECK-NEXT: lgfr %r2, %r0 |
| 182 | +; CHECK-NEXT: ld %f8, 440(%r15) # 8-byte Folded Reload |
| 183 | +; CHECK-NEXT: ld %f9, 432(%r15) # 8-byte Folded Reload |
| 184 | +; CHECK-NEXT: ld %f10, 424(%r15) # 8-byte Folded Reload |
| 185 | +; CHECK-NEXT: ld %f11, 416(%r15) # 8-byte Folded Reload |
| 186 | +; CHECK-NEXT: ld %f12, 408(%r15) # 8-byte Folded Reload |
| 187 | +; CHECK-NEXT: ld %f13, 400(%r15) # 8-byte Folded Reload |
| 188 | +; CHECK-NEXT: ld %f14, 392(%r15) # 8-byte Folded Reload |
| 189 | +; CHECK-NEXT: ld %f15, 384(%r15) # 8-byte Folded Reload |
| 190 | +; CHECK-NEXT: lmg %r6, %r15, 496(%r15) |
| 191 | +; CHECK-NEXT: br %r14 |
| 192 | +entry: |
| 193 | + %0 = tail call i32 @llvm.eh.sjlj.setjmp(ptr nonnull @buf) |
| 194 | + store i32 1, ptr @t, align 4 |
| 195 | + store i32 1, ptr @s, align 4 |
| 196 | + store i32 1, ptr @r, align 4 |
| 197 | + store i32 1, ptr @q, align 4 |
| 198 | + store i32 1, ptr @p, align 4 |
| 199 | + store i32 1, ptr @o, align 4 |
| 200 | + store i32 1, ptr @n, align 4 |
| 201 | + store i32 1, ptr @m, align 4 |
| 202 | + store i32 1, ptr @l, align 4 |
| 203 | + store i32 1, ptr @k, align 4 |
| 204 | + store i32 1, ptr @j, align 4 |
| 205 | + store i32 1, ptr @i, align 4 |
| 206 | + store i32 1, ptr @h, align 4 |
| 207 | + store i32 1, ptr @g, align 4 |
| 208 | + store i32 1, ptr @f, align 4 |
| 209 | + store i32 1, ptr @e, align 4 |
| 210 | + store i32 1, ptr @d, align 4 |
| 211 | + store i32 1, ptr @c, align 4 |
| 212 | + store i32 1, ptr @b, align 4 |
| 213 | + store i32 1, ptr @a, align 4 |
| 214 | + tail call void @foo(ptr noundef nonnull @a, ptr noundef nonnull @b, ptr noundef nonnull @c, ptr noundef nonnull @d, ptr noundef nonnull @e, ptr noundef nonnull @f, ptr noundef nonnull @g, ptr noundef nonnull @h, ptr noundef nonnull @i, ptr noundef nonnull @j, ptr noundef nonnull @k, ptr noundef nonnull @l, ptr noundef nonnull @m, ptr noundef nonnull @n, ptr noundef nonnull @o, ptr noundef nonnull @p, ptr noundef nonnull @q, ptr noundef nonnull @r, ptr noundef nonnull @s, ptr noundef nonnull @t) |
| 215 | + %1 = load i32, ptr @a, align 4 |
| 216 | + %2 = load i32, ptr @b, align 4 |
| 217 | + %add = add nsw i32 %2, %1 |
| 218 | + %3 = load i32, ptr @c, align 4 |
| 219 | + %add1 = add nsw i32 %add, %3 |
| 220 | + %4 = load i32, ptr @d, align 4 |
| 221 | + %add2 = add nsw i32 %add1, %4 |
| 222 | + %5 = load i32, ptr @e, align 4 |
| 223 | + %add3 = add nsw i32 %add2, %5 |
| 224 | + %6 = load i32, ptr @f, align 4 |
| 225 | + %add4 = add nsw i32 %add3, %6 |
| 226 | + %7 = load i32, ptr @g, align 4 |
| 227 | + %add5 = add nsw i32 %add4, %7 |
| 228 | + %8 = load i32, ptr @h, align 4 |
| 229 | + %add6 = add nsw i32 %add5, %8 |
| 230 | + %9 = load i32, ptr @i, align 4 |
| 231 | + %add7 = add nsw i32 %add6, %9 |
| 232 | + %10 = load i32, ptr @j, align 4 |
| 233 | + %add8 = add nsw i32 %add7, %10 |
| 234 | + %11 = load i32, ptr @k, align 4 |
| 235 | + %add9 = add nsw i32 %add8, %11 |
| 236 | + %12 = load i32, ptr @l, align 4 |
| 237 | + %add10 = add nsw i32 %add9, %12 |
| 238 | + %13 = load i32, ptr @m, align 4 |
| 239 | + %add11 = add nsw i32 %add10, %13 |
| 240 | + %14 = load i32, ptr @n, align 4 |
| 241 | + %add12 = add nsw i32 %add11, %14 |
| 242 | + %15 = load i32, ptr @o, align 4 |
| 243 | + %add13 = add nsw i32 %add12, %15 |
| 244 | + %16 = load i32, ptr @p, align 4 |
| 245 | + %add14 = add nsw i32 %add13, %16 |
| 246 | + %17 = load i32, ptr @q, align 4 |
| 247 | + %add15 = add nsw i32 %add14, %17 |
| 248 | + %18 = load i32, ptr @r, align 4 |
| 249 | + %add16 = add nsw i32 %add15, %18 |
| 250 | + %19 = load i32, ptr @s, align 4 |
| 251 | + %add17 = add nsw i32 %add16, %19 |
| 252 | + %20 = load i32, ptr @t, align 4 |
| 253 | + %add18 = add nsw i32 %add17, %20 |
| 254 | + ret i32 %add18 |
| 255 | +} |
0 commit comments