1; RUN: llc < %s -verify-machineinstrs 2; 3; This test is disabled until PPCISelLowering learns to insert proper 64-bit 4; code for ATOMIC_CMP_SWAP. Currently, it is inserting 32-bit instructions with 5; 64-bit operands which causes the machine code verifier to throw a tantrum. 6; 7; XFAIL: * 8 9target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128" 10target triple = "powerpc64-unknown-linux-gnu" 11 12@sc = common global i8 0 13@uc = common global i8 0 14@ss = common global i16 0 15@us = common global i16 0 16@si = common global i32 0 17@ui = common global i32 0 18@sl = common global i64 0, align 8 19@ul = common global i64 0, align 8 20@sll = common global i64 0, align 8 21@ull = common global i64 0, align 8 22 23define void @test_op_ignore() nounwind { 24entry: 25 %0 = atomicrmw add ptr @sc, i8 1 monotonic 26 %1 = atomicrmw add ptr @uc, i8 1 monotonic 27 %2 = atomicrmw add ptr @ss, i16 1 monotonic 28 %3 = atomicrmw add ptr @us, i16 1 monotonic 29 %4 = atomicrmw add ptr @si, i32 1 monotonic 30 %5 = atomicrmw add ptr @ui, i32 1 monotonic 31 %6 = atomicrmw add ptr @sl, i64 1 monotonic 32 %7 = atomicrmw add ptr @ul, i64 1 monotonic 33 %8 = atomicrmw sub ptr @sc, i8 1 monotonic 34 %9 = atomicrmw sub ptr @uc, i8 1 monotonic 35 %10 = atomicrmw sub ptr @ss, i16 1 monotonic 36 %11 = atomicrmw sub ptr @us, i16 1 monotonic 37 %12 = atomicrmw sub ptr @si, i32 1 monotonic 38 %13 = atomicrmw sub ptr @ui, i32 1 monotonic 39 %14 = atomicrmw sub ptr @sl, i64 1 monotonic 40 %15 = atomicrmw sub ptr @ul, i64 1 monotonic 41 %16 = atomicrmw or ptr @sc, i8 1 monotonic 42 %17 = atomicrmw or ptr @uc, i8 1 monotonic 43 %18 = atomicrmw or ptr @ss, i16 1 monotonic 44 %19 = atomicrmw or ptr @us, i16 1 monotonic 45 %20 = atomicrmw or ptr @si, i32 1 monotonic 46 %21 = atomicrmw or ptr @ui, i32 1 monotonic 47 %22 = atomicrmw or ptr @sl, i64 1 monotonic 48 %23 = atomicrmw or ptr @ul, i64 1 monotonic 49 %24 = atomicrmw xor ptr @sc, i8 1 monotonic 50 %25 = atomicrmw xor ptr @uc, i8 1 monotonic 51 %26 = atomicrmw xor ptr @ss, i16 1 monotonic 52 %27 = atomicrmw xor ptr @us, i16 1 monotonic 53 %28 = atomicrmw xor ptr @si, i32 1 monotonic 54 %29 = atomicrmw xor ptr @ui, i32 1 monotonic 55 %30 = atomicrmw xor ptr @sl, i64 1 monotonic 56 %31 = atomicrmw xor ptr @ul, i64 1 monotonic 57 %32 = atomicrmw and ptr @sc, i8 1 monotonic 58 %33 = atomicrmw and ptr @uc, i8 1 monotonic 59 %34 = atomicrmw and ptr @ss, i16 1 monotonic 60 %35 = atomicrmw and ptr @us, i16 1 monotonic 61 %36 = atomicrmw and ptr @si, i32 1 monotonic 62 %37 = atomicrmw and ptr @ui, i32 1 monotonic 63 %38 = atomicrmw and ptr @sl, i64 1 monotonic 64 %39 = atomicrmw and ptr @ul, i64 1 monotonic 65 %40 = atomicrmw nand ptr @sc, i8 1 monotonic 66 %41 = atomicrmw nand ptr @uc, i8 1 monotonic 67 %42 = atomicrmw nand ptr @ss, i16 1 monotonic 68 %43 = atomicrmw nand ptr @us, i16 1 monotonic 69 %44 = atomicrmw nand ptr @si, i32 1 monotonic 70 %45 = atomicrmw nand ptr @ui, i32 1 monotonic 71 %46 = atomicrmw nand ptr @sl, i64 1 monotonic 72 %47 = atomicrmw nand ptr @ul, i64 1 monotonic 73 br label %return 74 75return: ; preds = %entry 76 ret void 77} 78 79define void @test_fetch_and_op() nounwind { 80entry: 81 %0 = atomicrmw add ptr @sc, i8 11 monotonic 82 store i8 %0, ptr @sc, align 1 83 %1 = atomicrmw add ptr @uc, i8 11 monotonic 84 store i8 %1, ptr @uc, align 1 85 %2 = atomicrmw add ptr @ss, i16 11 monotonic 86 store i16 %2, ptr @ss, align 2 87 %3 = atomicrmw add ptr @us, i16 11 monotonic 88 store i16 %3, ptr @us, align 2 89 %4 = atomicrmw add ptr @si, i32 11 monotonic 90 store i32 %4, ptr @si, align 4 91 %5 = atomicrmw add ptr @ui, i32 11 monotonic 92 store i32 %5, ptr @ui, align 4 93 %6 = atomicrmw add ptr @sl, i64 11 monotonic 94 store i64 %6, ptr @sl, align 8 95 %7 = atomicrmw add ptr @ul, i64 11 monotonic 96 store i64 %7, ptr @ul, align 8 97 %8 = atomicrmw sub ptr @sc, i8 11 monotonic 98 store i8 %8, ptr @sc, align 1 99 %9 = atomicrmw sub ptr @uc, i8 11 monotonic 100 store i8 %9, ptr @uc, align 1 101 %10 = atomicrmw sub ptr @ss, i16 11 monotonic 102 store i16 %10, ptr @ss, align 2 103 %11 = atomicrmw sub ptr @us, i16 11 monotonic 104 store i16 %11, ptr @us, align 2 105 %12 = atomicrmw sub ptr @si, i32 11 monotonic 106 store i32 %12, ptr @si, align 4 107 %13 = atomicrmw sub ptr @ui, i32 11 monotonic 108 store i32 %13, ptr @ui, align 4 109 %14 = atomicrmw sub ptr @sl, i64 11 monotonic 110 store i64 %14, ptr @sl, align 8 111 %15 = atomicrmw sub ptr @ul, i64 11 monotonic 112 store i64 %15, ptr @ul, align 8 113 %16 = atomicrmw or ptr @sc, i8 11 monotonic 114 store i8 %16, ptr @sc, align 1 115 %17 = atomicrmw or ptr @uc, i8 11 monotonic 116 store i8 %17, ptr @uc, align 1 117 %18 = atomicrmw or ptr @ss, i16 11 monotonic 118 store i16 %18, ptr @ss, align 2 119 %19 = atomicrmw or ptr @us, i16 11 monotonic 120 store i16 %19, ptr @us, align 2 121 %20 = atomicrmw or ptr @si, i32 11 monotonic 122 store i32 %20, ptr @si, align 4 123 %21 = atomicrmw or ptr @ui, i32 11 monotonic 124 store i32 %21, ptr @ui, align 4 125 %22 = atomicrmw or ptr @sl, i64 11 monotonic 126 store i64 %22, ptr @sl, align 8 127 %23 = atomicrmw or ptr @ul, i64 11 monotonic 128 store i64 %23, ptr @ul, align 8 129 %24 = atomicrmw xor ptr @sc, i8 11 monotonic 130 store i8 %24, ptr @sc, align 1 131 %25 = atomicrmw xor ptr @uc, i8 11 monotonic 132 store i8 %25, ptr @uc, align 1 133 %26 = atomicrmw xor ptr @ss, i16 11 monotonic 134 store i16 %26, ptr @ss, align 2 135 %27 = atomicrmw xor ptr @us, i16 11 monotonic 136 store i16 %27, ptr @us, align 2 137 %28 = atomicrmw xor ptr @si, i32 11 monotonic 138 store i32 %28, ptr @si, align 4 139 %29 = atomicrmw xor ptr @ui, i32 11 monotonic 140 store i32 %29, ptr @ui, align 4 141 %30 = atomicrmw xor ptr @sl, i64 11 monotonic 142 store i64 %30, ptr @sl, align 8 143 %31 = atomicrmw xor ptr @ul, i64 11 monotonic 144 store i64 %31, ptr @ul, align 8 145 %32 = atomicrmw and ptr @sc, i8 11 monotonic 146 store i8 %32, ptr @sc, align 1 147 %33 = atomicrmw and ptr @uc, i8 11 monotonic 148 store i8 %33, ptr @uc, align 1 149 %34 = atomicrmw and ptr @ss, i16 11 monotonic 150 store i16 %34, ptr @ss, align 2 151 %35 = atomicrmw and ptr @us, i16 11 monotonic 152 store i16 %35, ptr @us, align 2 153 %36 = atomicrmw and ptr @si, i32 11 monotonic 154 store i32 %36, ptr @si, align 4 155 %37 = atomicrmw and ptr @ui, i32 11 monotonic 156 store i32 %37, ptr @ui, align 4 157 %38 = atomicrmw and ptr @sl, i64 11 monotonic 158 store i64 %38, ptr @sl, align 8 159 %39 = atomicrmw and ptr @ul, i64 11 monotonic 160 store i64 %39, ptr @ul, align 8 161 %40 = atomicrmw nand ptr @sc, i8 11 monotonic 162 store i8 %40, ptr @sc, align 1 163 %41 = atomicrmw nand ptr @uc, i8 11 monotonic 164 store i8 %41, ptr @uc, align 1 165 %42 = atomicrmw nand ptr @ss, i16 11 monotonic 166 store i16 %42, ptr @ss, align 2 167 %43 = atomicrmw nand ptr @us, i16 11 monotonic 168 store i16 %43, ptr @us, align 2 169 %44 = atomicrmw nand ptr @si, i32 11 monotonic 170 store i32 %44, ptr @si, align 4 171 %45 = atomicrmw nand ptr @ui, i32 11 monotonic 172 store i32 %45, ptr @ui, align 4 173 %46 = atomicrmw nand ptr @sl, i64 11 monotonic 174 store i64 %46, ptr @sl, align 8 175 %47 = atomicrmw nand ptr @ul, i64 11 monotonic 176 store i64 %47, ptr @ul, align 8 177 br label %return 178 179return: ; preds = %entry 180 ret void 181} 182 183define void @test_op_and_fetch() nounwind { 184entry: 185 %0 = load i8, ptr @uc, align 1 186 %1 = atomicrmw add ptr @sc, i8 %0 monotonic 187 %2 = add i8 %1, %0 188 store i8 %2, ptr @sc, align 1 189 %3 = load i8, ptr @uc, align 1 190 %4 = atomicrmw add ptr @uc, i8 %3 monotonic 191 %5 = add i8 %4, %3 192 store i8 %5, ptr @uc, align 1 193 %6 = load i8, ptr @uc, align 1 194 %7 = zext i8 %6 to i16 195 %8 = atomicrmw add ptr @ss, i16 %7 monotonic 196 %9 = add i16 %8, %7 197 store i16 %9, ptr @ss, align 2 198 %10 = load i8, ptr @uc, align 1 199 %11 = zext i8 %10 to i16 200 %12 = atomicrmw add ptr @us, i16 %11 monotonic 201 %13 = add i16 %12, %11 202 store i16 %13, ptr @us, align 2 203 %14 = load i8, ptr @uc, align 1 204 %15 = zext i8 %14 to i32 205 %16 = atomicrmw add ptr @si, i32 %15 monotonic 206 %17 = add i32 %16, %15 207 store i32 %17, ptr @si, align 4 208 %18 = load i8, ptr @uc, align 1 209 %19 = zext i8 %18 to i32 210 %20 = atomicrmw add ptr @ui, i32 %19 monotonic 211 %21 = add i32 %20, %19 212 store i32 %21, ptr @ui, align 4 213 %22 = load i8, ptr @uc, align 1 214 %23 = zext i8 %22 to i64 215 %24 = atomicrmw add ptr @sl, i64 %23 monotonic 216 %25 = add i64 %24, %23 217 store i64 %25, ptr @sl, align 8 218 %26 = load i8, ptr @uc, align 1 219 %27 = zext i8 %26 to i64 220 %28 = atomicrmw add ptr @ul, i64 %27 monotonic 221 %29 = add i64 %28, %27 222 store i64 %29, ptr @ul, align 8 223 %30 = load i8, ptr @uc, align 1 224 %31 = atomicrmw sub ptr @sc, i8 %30 monotonic 225 %32 = sub i8 %31, %30 226 store i8 %32, ptr @sc, align 1 227 %33 = load i8, ptr @uc, align 1 228 %34 = atomicrmw sub ptr @uc, i8 %33 monotonic 229 %35 = sub i8 %34, %33 230 store i8 %35, ptr @uc, align 1 231 %36 = load i8, ptr @uc, align 1 232 %37 = zext i8 %36 to i16 233 %38 = atomicrmw sub ptr @ss, i16 %37 monotonic 234 %39 = sub i16 %38, %37 235 store i16 %39, ptr @ss, align 2 236 %40 = load i8, ptr @uc, align 1 237 %41 = zext i8 %40 to i16 238 %42 = atomicrmw sub ptr @us, i16 %41 monotonic 239 %43 = sub i16 %42, %41 240 store i16 %43, ptr @us, align 2 241 %44 = load i8, ptr @uc, align 1 242 %45 = zext i8 %44 to i32 243 %46 = atomicrmw sub ptr @si, i32 %45 monotonic 244 %47 = sub i32 %46, %45 245 store i32 %47, ptr @si, align 4 246 %48 = load i8, ptr @uc, align 1 247 %49 = zext i8 %48 to i32 248 %50 = atomicrmw sub ptr @ui, i32 %49 monotonic 249 %51 = sub i32 %50, %49 250 store i32 %51, ptr @ui, align 4 251 %52 = load i8, ptr @uc, align 1 252 %53 = zext i8 %52 to i64 253 %54 = atomicrmw sub ptr @sl, i64 %53 monotonic 254 %55 = sub i64 %54, %53 255 store i64 %55, ptr @sl, align 8 256 %56 = load i8, ptr @uc, align 1 257 %57 = zext i8 %56 to i64 258 %58 = atomicrmw sub ptr @ul, i64 %57 monotonic 259 %59 = sub i64 %58, %57 260 store i64 %59, ptr @ul, align 8 261 %60 = load i8, ptr @uc, align 1 262 %61 = atomicrmw or ptr @sc, i8 %60 monotonic 263 %62 = or i8 %61, %60 264 store i8 %62, ptr @sc, align 1 265 %63 = load i8, ptr @uc, align 1 266 %64 = atomicrmw or ptr @uc, i8 %63 monotonic 267 %65 = or i8 %64, %63 268 store i8 %65, ptr @uc, align 1 269 %66 = load i8, ptr @uc, align 1 270 %67 = zext i8 %66 to i16 271 %68 = atomicrmw or ptr @ss, i16 %67 monotonic 272 %69 = or i16 %68, %67 273 store i16 %69, ptr @ss, align 2 274 %70 = load i8, ptr @uc, align 1 275 %71 = zext i8 %70 to i16 276 %72 = atomicrmw or ptr @us, i16 %71 monotonic 277 %73 = or i16 %72, %71 278 store i16 %73, ptr @us, align 2 279 %74 = load i8, ptr @uc, align 1 280 %75 = zext i8 %74 to i32 281 %76 = atomicrmw or ptr @si, i32 %75 monotonic 282 %77 = or i32 %76, %75 283 store i32 %77, ptr @si, align 4 284 %78 = load i8, ptr @uc, align 1 285 %79 = zext i8 %78 to i32 286 %80 = atomicrmw or ptr @ui, i32 %79 monotonic 287 %81 = or i32 %80, %79 288 store i32 %81, ptr @ui, align 4 289 %82 = load i8, ptr @uc, align 1 290 %83 = zext i8 %82 to i64 291 %84 = atomicrmw or ptr @sl, i64 %83 monotonic 292 %85 = or i64 %84, %83 293 store i64 %85, ptr @sl, align 8 294 %86 = load i8, ptr @uc, align 1 295 %87 = zext i8 %86 to i64 296 %88 = atomicrmw or ptr @ul, i64 %87 monotonic 297 %89 = or i64 %88, %87 298 store i64 %89, ptr @ul, align 8 299 %90 = load i8, ptr @uc, align 1 300 %91 = atomicrmw xor ptr @sc, i8 %90 monotonic 301 %92 = xor i8 %91, %90 302 store i8 %92, ptr @sc, align 1 303 %93 = load i8, ptr @uc, align 1 304 %94 = atomicrmw xor ptr @uc, i8 %93 monotonic 305 %95 = xor i8 %94, %93 306 store i8 %95, ptr @uc, align 1 307 %96 = load i8, ptr @uc, align 1 308 %97 = zext i8 %96 to i16 309 %98 = atomicrmw xor ptr @ss, i16 %97 monotonic 310 %99 = xor i16 %98, %97 311 store i16 %99, ptr @ss, align 2 312 %100 = load i8, ptr @uc, align 1 313 %101 = zext i8 %100 to i16 314 %102 = atomicrmw xor ptr @us, i16 %101 monotonic 315 %103 = xor i16 %102, %101 316 store i16 %103, ptr @us, align 2 317 %104 = load i8, ptr @uc, align 1 318 %105 = zext i8 %104 to i32 319 %106 = atomicrmw xor ptr @si, i32 %105 monotonic 320 %107 = xor i32 %106, %105 321 store i32 %107, ptr @si, align 4 322 %108 = load i8, ptr @uc, align 1 323 %109 = zext i8 %108 to i32 324 %110 = atomicrmw xor ptr @ui, i32 %109 monotonic 325 %111 = xor i32 %110, %109 326 store i32 %111, ptr @ui, align 4 327 %112 = load i8, ptr @uc, align 1 328 %113 = zext i8 %112 to i64 329 %114 = atomicrmw xor ptr @sl, i64 %113 monotonic 330 %115 = xor i64 %114, %113 331 store i64 %115, ptr @sl, align 8 332 %116 = load i8, ptr @uc, align 1 333 %117 = zext i8 %116 to i64 334 %118 = atomicrmw xor ptr @ul, i64 %117 monotonic 335 %119 = xor i64 %118, %117 336 store i64 %119, ptr @ul, align 8 337 %120 = load i8, ptr @uc, align 1 338 %121 = atomicrmw and ptr @sc, i8 %120 monotonic 339 %122 = and i8 %121, %120 340 store i8 %122, ptr @sc, align 1 341 %123 = load i8, ptr @uc, align 1 342 %124 = atomicrmw and ptr @uc, i8 %123 monotonic 343 %125 = and i8 %124, %123 344 store i8 %125, ptr @uc, align 1 345 %126 = load i8, ptr @uc, align 1 346 %127 = zext i8 %126 to i16 347 %128 = atomicrmw and ptr @ss, i16 %127 monotonic 348 %129 = and i16 %128, %127 349 store i16 %129, ptr @ss, align 2 350 %130 = load i8, ptr @uc, align 1 351 %131 = zext i8 %130 to i16 352 %132 = atomicrmw and ptr @us, i16 %131 monotonic 353 %133 = and i16 %132, %131 354 store i16 %133, ptr @us, align 2 355 %134 = load i8, ptr @uc, align 1 356 %135 = zext i8 %134 to i32 357 %136 = atomicrmw and ptr @si, i32 %135 monotonic 358 %137 = and i32 %136, %135 359 store i32 %137, ptr @si, align 4 360 %138 = load i8, ptr @uc, align 1 361 %139 = zext i8 %138 to i32 362 %140 = atomicrmw and ptr @ui, i32 %139 monotonic 363 %141 = and i32 %140, %139 364 store i32 %141, ptr @ui, align 4 365 %142 = load i8, ptr @uc, align 1 366 %143 = zext i8 %142 to i64 367 %144 = atomicrmw and ptr @sl, i64 %143 monotonic 368 %145 = and i64 %144, %143 369 store i64 %145, ptr @sl, align 8 370 %146 = load i8, ptr @uc, align 1 371 %147 = zext i8 %146 to i64 372 %148 = atomicrmw and ptr @ul, i64 %147 monotonic 373 %149 = and i64 %148, %147 374 store i64 %149, ptr @ul, align 8 375 %150 = load i8, ptr @uc, align 1 376 %151 = atomicrmw nand ptr @sc, i8 %150 monotonic 377 %152 = xor i8 %151, -1 378 %153 = and i8 %152, %150 379 store i8 %153, ptr @sc, align 1 380 %154 = load i8, ptr @uc, align 1 381 %155 = atomicrmw nand ptr @uc, i8 %154 monotonic 382 %156 = xor i8 %155, -1 383 %157 = and i8 %156, %154 384 store i8 %157, ptr @uc, align 1 385 %158 = load i8, ptr @uc, align 1 386 %159 = zext i8 %158 to i16 387 %160 = atomicrmw nand ptr @ss, i16 %159 monotonic 388 %161 = xor i16 %160, -1 389 %162 = and i16 %161, %159 390 store i16 %162, ptr @ss, align 2 391 %163 = load i8, ptr @uc, align 1 392 %164 = zext i8 %163 to i16 393 %165 = atomicrmw nand ptr @us, i16 %164 monotonic 394 %166 = xor i16 %165, -1 395 %167 = and i16 %166, %164 396 store i16 %167, ptr @us, align 2 397 %168 = load i8, ptr @uc, align 1 398 %169 = zext i8 %168 to i32 399 %170 = atomicrmw nand ptr @si, i32 %169 monotonic 400 %171 = xor i32 %170, -1 401 %172 = and i32 %171, %169 402 store i32 %172, ptr @si, align 4 403 %173 = load i8, ptr @uc, align 1 404 %174 = zext i8 %173 to i32 405 %175 = atomicrmw nand ptr @ui, i32 %174 monotonic 406 %176 = xor i32 %175, -1 407 %177 = and i32 %176, %174 408 store i32 %177, ptr @ui, align 4 409 %178 = load i8, ptr @uc, align 1 410 %179 = zext i8 %178 to i64 411 %180 = atomicrmw nand ptr @sl, i64 %179 monotonic 412 %181 = xor i64 %180, -1 413 %182 = and i64 %181, %179 414 store i64 %182, ptr @sl, align 8 415 %183 = load i8, ptr @uc, align 1 416 %184 = zext i8 %183 to i64 417 %185 = atomicrmw nand ptr @ul, i64 %184 monotonic 418 %186 = xor i64 %185, -1 419 %187 = and i64 %186, %184 420 store i64 %187, ptr @ul, align 8 421 br label %return 422 423return: ; preds = %entry 424 ret void 425} 426 427define void @test_compare_and_swap() nounwind { 428entry: 429 %0 = load i8, ptr @uc, align 1 430 %1 = load i8, ptr @sc, align 1 431 %2 = cmpxchg ptr @sc, i8 %0, i8 %1 monotonic monotonic 432 store i8 %2, ptr @sc, align 1 433 %3 = load i8, ptr @uc, align 1 434 %4 = load i8, ptr @sc, align 1 435 %5 = cmpxchg ptr @uc, i8 %3, i8 %4 monotonic monotonic 436 store i8 %5, ptr @uc, align 1 437 %6 = load i8, ptr @uc, align 1 438 %7 = zext i8 %6 to i16 439 %8 = load i8, ptr @sc, align 1 440 %9 = sext i8 %8 to i16 441 %10 = cmpxchg ptr @ss, i16 %7, i16 %9 monotonic monotonic 442 store i16 %10, ptr @ss, align 2 443 %11 = load i8, ptr @uc, align 1 444 %12 = zext i8 %11 to i16 445 %13 = load i8, ptr @sc, align 1 446 %14 = sext i8 %13 to i16 447 %15 = cmpxchg ptr @us, i16 %12, i16 %14 monotonic monotonic 448 store i16 %15, ptr @us, align 2 449 %16 = load i8, ptr @uc, align 1 450 %17 = zext i8 %16 to i32 451 %18 = load i8, ptr @sc, align 1 452 %19 = sext i8 %18 to i32 453 %20 = cmpxchg ptr @si, i32 %17, i32 %19 monotonic monotonic 454 store i32 %20, ptr @si, align 4 455 %21 = load i8, ptr @uc, align 1 456 %22 = zext i8 %21 to i32 457 %23 = load i8, ptr @sc, align 1 458 %24 = sext i8 %23 to i32 459 %25 = cmpxchg ptr @ui, i32 %22, i32 %24 monotonic monotonic 460 store i32 %25, ptr @ui, align 4 461 %26 = load i8, ptr @uc, align 1 462 %27 = zext i8 %26 to i64 463 %28 = load i8, ptr @sc, align 1 464 %29 = sext i8 %28 to i64 465 %30 = cmpxchg ptr @sl, i64 %27, i64 %29 monotonic monotonic 466 store i64 %30, ptr @sl, align 8 467 %31 = load i8, ptr @uc, align 1 468 %32 = zext i8 %31 to i64 469 %33 = load i8, ptr @sc, align 1 470 %34 = sext i8 %33 to i64 471 %35 = cmpxchg ptr @ul, i64 %32, i64 %34 monotonic monotonic 472 store i64 %35, ptr @ul, align 8 473 %36 = load i8, ptr @uc, align 1 474 %37 = load i8, ptr @sc, align 1 475 %38 = cmpxchg ptr @sc, i8 %36, i8 %37 monotonic monotonic 476 %39 = icmp eq i8 %38, %36 477 %40 = zext i1 %39 to i8 478 %41 = zext i8 %40 to i32 479 store i32 %41, ptr @ui, align 4 480 %42 = load i8, ptr @uc, align 1 481 %43 = load i8, ptr @sc, align 1 482 %44 = cmpxchg ptr @uc, i8 %42, i8 %43 monotonic monotonic 483 %45 = icmp eq i8 %44, %42 484 %46 = zext i1 %45 to i8 485 %47 = zext i8 %46 to i32 486 store i32 %47, ptr @ui, align 4 487 %48 = load i8, ptr @uc, align 1 488 %49 = zext i8 %48 to i16 489 %50 = load i8, ptr @sc, align 1 490 %51 = sext i8 %50 to i16 491 %52 = cmpxchg ptr @ss, i16 %49, i16 %51 monotonic monotonic 492 %53 = icmp eq i16 %52, %49 493 %54 = zext i1 %53 to i8 494 %55 = zext i8 %54 to i32 495 store i32 %55, ptr @ui, align 4 496 %56 = load i8, ptr @uc, align 1 497 %57 = zext i8 %56 to i16 498 %58 = load i8, ptr @sc, align 1 499 %59 = sext i8 %58 to i16 500 %60 = cmpxchg ptr @us, i16 %57, i16 %59 monotonic monotonic 501 %61 = icmp eq i16 %60, %57 502 %62 = zext i1 %61 to i8 503 %63 = zext i8 %62 to i32 504 store i32 %63, ptr @ui, align 4 505 %64 = load i8, ptr @uc, align 1 506 %65 = zext i8 %64 to i32 507 %66 = load i8, ptr @sc, align 1 508 %67 = sext i8 %66 to i32 509 %68 = cmpxchg ptr @si, i32 %65, i32 %67 monotonic monotonic 510 %69 = icmp eq i32 %68, %65 511 %70 = zext i1 %69 to i8 512 %71 = zext i8 %70 to i32 513 store i32 %71, ptr @ui, align 4 514 %72 = load i8, ptr @uc, align 1 515 %73 = zext i8 %72 to i32 516 %74 = load i8, ptr @sc, align 1 517 %75 = sext i8 %74 to i32 518 %76 = cmpxchg ptr @ui, i32 %73, i32 %75 monotonic monotonic 519 %77 = icmp eq i32 %76, %73 520 %78 = zext i1 %77 to i8 521 %79 = zext i8 %78 to i32 522 store i32 %79, ptr @ui, align 4 523 %80 = load i8, ptr @uc, align 1 524 %81 = zext i8 %80 to i64 525 %82 = load i8, ptr @sc, align 1 526 %83 = sext i8 %82 to i64 527 %84 = cmpxchg ptr @sl, i64 %81, i64 %83 monotonic monotonic 528 %85 = icmp eq i64 %84, %81 529 %86 = zext i1 %85 to i8 530 %87 = zext i8 %86 to i32 531 store i32 %87, ptr @ui, align 4 532 %88 = load i8, ptr @uc, align 1 533 %89 = zext i8 %88 to i64 534 %90 = load i8, ptr @sc, align 1 535 %91 = sext i8 %90 to i64 536 %92 = cmpxchg ptr @ul, i64 %89, i64 %91 monotonic monotonic 537 %93 = icmp eq i64 %92, %89 538 %94 = zext i1 %93 to i8 539 %95 = zext i8 %94 to i32 540 store i32 %95, ptr @ui, align 4 541 br label %return 542 543return: ; preds = %entry 544 ret void 545} 546 547define void @test_lock() nounwind { 548entry: 549 %0 = atomicrmw xchg ptr @sc, i8 1 monotonic 550 store i8 %0, ptr @sc, align 1 551 %1 = atomicrmw xchg ptr @uc, i8 1 monotonic 552 store i8 %1, ptr @uc, align 1 553 %2 = atomicrmw xchg ptr @ss, i16 1 monotonic 554 store i16 %2, ptr @ss, align 2 555 %3 = atomicrmw xchg ptr @us, i16 1 monotonic 556 store i16 %3, ptr @us, align 2 557 %4 = atomicrmw xchg ptr @si, i32 1 monotonic 558 store i32 %4, ptr @si, align 4 559 %5 = atomicrmw xchg ptr @ui, i32 1 monotonic 560 store i32 %5, ptr @ui, align 4 561 %6 = atomicrmw xchg ptr @sl, i64 1 monotonic 562 store i64 %6, ptr @sl, align 8 563 %7 = atomicrmw xchg ptr @ul, i64 1 monotonic 564 store i64 %7, ptr @ul, align 8 565 fence seq_cst 566 store volatile i8 0, ptr @sc, align 1 567 store volatile i8 0, ptr @uc, align 1 568 store volatile i16 0, ptr @ss, align 2 569 store volatile i16 0, ptr @us, align 2 570 store volatile i32 0, ptr @si, align 4 571 store volatile i32 0, ptr @ui, align 4 572 store volatile i64 0, ptr @sl, align 8 573 store volatile i64 0, ptr @ul, align 8 574 store volatile i64 0, ptr @sll, align 8 575 store volatile i64 0, ptr @ull, align 8 576 br label %return 577 578return: ; preds = %entry 579 ret void 580} 581