1; RUN: llc < %s -mtriple=x86_64-apple-darwin8 > %t.x86-64 2; RUN: llc < %s -mtriple=i686-apple-darwin8 -mattr=cx16 > %t.x86 3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" 4 5@sc = common global i8 0 6@uc = common global i8 0 7@ss = common global i16 0 8@us = common global i16 0 9@si = common global i32 0 10@ui = common global i32 0 11@sl = common global i64 0 12@ul = common global i64 0 13@sll = common global i64 0 14@ull = common global i64 0 15 16define void @test_op_ignore() nounwind { 17entry: 18 %0 = atomicrmw add ptr @sc, i8 1 monotonic 19 %1 = atomicrmw add ptr @uc, i8 1 monotonic 20 %2 = atomicrmw add ptr @ss, i16 1 monotonic 21 %3 = atomicrmw add ptr @us, i16 1 monotonic 22 %4 = atomicrmw add ptr @si, i32 1 monotonic 23 %5 = atomicrmw add ptr @ui, i32 1 monotonic 24 %6 = atomicrmw add ptr @sl, i64 1 monotonic 25 %7 = atomicrmw add ptr @ul, i64 1 monotonic 26 %8 = atomicrmw add ptr @sll, i64 1 monotonic 27 %9 = atomicrmw add ptr @ull, i64 1 monotonic 28 %10 = atomicrmw sub ptr @sc, i8 1 monotonic 29 %11 = atomicrmw sub ptr @uc, i8 1 monotonic 30 %12 = atomicrmw sub ptr @ss, i16 1 monotonic 31 %13 = atomicrmw sub ptr @us, i16 1 monotonic 32 %14 = atomicrmw sub ptr @si, i32 1 monotonic 33 %15 = atomicrmw sub ptr @ui, i32 1 monotonic 34 %16 = atomicrmw sub ptr @sl, i64 1 monotonic 35 %17 = atomicrmw sub ptr @ul, i64 1 monotonic 36 %18 = atomicrmw sub ptr @sll, i64 1 monotonic 37 %19 = atomicrmw sub ptr @ull, i64 1 monotonic 38 %20 = atomicrmw or ptr @sc, i8 1 monotonic 39 %21 = atomicrmw or ptr @uc, i8 1 monotonic 40 %22 = atomicrmw or ptr @ss, i16 1 monotonic 41 %23 = atomicrmw or ptr @us, i16 1 monotonic 42 %24 = atomicrmw or ptr @si, i32 1 monotonic 43 %25 = atomicrmw or ptr @ui, i32 1 monotonic 44 %26 = atomicrmw or ptr @sl, i64 1 monotonic 45 %27 = atomicrmw or ptr @ul, i64 1 monotonic 46 %28 = atomicrmw or ptr @sll, i64 1 monotonic 47 %29 = atomicrmw or ptr @ull, i64 1 monotonic 48 %30 = atomicrmw xor ptr @sc, i8 1 monotonic 49 %31 = atomicrmw xor ptr @uc, i8 1 monotonic 50 %32 = atomicrmw xor ptr @ss, i16 1 monotonic 51 %33 = atomicrmw xor ptr @us, i16 1 monotonic 52 %34 = atomicrmw xor ptr @si, i32 1 monotonic 53 %35 = atomicrmw xor ptr @ui, i32 1 monotonic 54 %36 = atomicrmw xor ptr @sl, i64 1 monotonic 55 %37 = atomicrmw xor ptr @ul, i64 1 monotonic 56 %38 = atomicrmw xor ptr @sll, i64 1 monotonic 57 %39 = atomicrmw xor ptr @ull, i64 1 monotonic 58 %40 = atomicrmw and ptr @sc, i8 1 monotonic 59 %41 = atomicrmw and ptr @uc, i8 1 monotonic 60 %42 = atomicrmw and ptr @ss, i16 1 monotonic 61 %43 = atomicrmw and ptr @us, i16 1 monotonic 62 %44 = atomicrmw and ptr @si, i32 1 monotonic 63 %45 = atomicrmw and ptr @ui, i32 1 monotonic 64 %46 = atomicrmw and ptr @sl, i64 1 monotonic 65 %47 = atomicrmw and ptr @ul, i64 1 monotonic 66 %48 = atomicrmw and ptr @sll, i64 1 monotonic 67 %49 = atomicrmw and ptr @ull, i64 1 monotonic 68 %50 = atomicrmw nand ptr @sc, i8 1 monotonic 69 %51 = atomicrmw nand ptr @uc, i8 1 monotonic 70 %52 = atomicrmw nand ptr @ss, i16 1 monotonic 71 %53 = atomicrmw nand ptr @us, i16 1 monotonic 72 %54 = atomicrmw nand ptr @si, i32 1 monotonic 73 %55 = atomicrmw nand ptr @ui, i32 1 monotonic 74 %56 = atomicrmw nand ptr @sl, i64 1 monotonic 75 %57 = atomicrmw nand ptr @ul, i64 1 monotonic 76 %58 = atomicrmw nand ptr @sll, i64 1 monotonic 77 %59 = atomicrmw nand ptr @ull, i64 1 monotonic 78 br label %return 79 80return: ; preds = %entry 81 ret void 82} 83 84define void @test_fetch_and_op() nounwind { 85entry: 86 %0 = atomicrmw add ptr @sc, i8 11 monotonic 87 store i8 %0, ptr @sc, align 1 88 %1 = atomicrmw add ptr @uc, i8 11 monotonic 89 store i8 %1, ptr @uc, align 1 90 %2 = atomicrmw add ptr @ss, i16 11 monotonic 91 store i16 %2, ptr @ss, align 2 92 %3 = atomicrmw add ptr @us, i16 11 monotonic 93 store i16 %3, ptr @us, align 2 94 %4 = atomicrmw add ptr @si, i32 11 monotonic 95 store i32 %4, ptr @si, align 4 96 %5 = atomicrmw add ptr @ui, i32 11 monotonic 97 store i32 %5, ptr @ui, align 4 98 %6 = atomicrmw add ptr @sl, i64 11 monotonic 99 store i64 %6, ptr @sl, align 8 100 %7 = atomicrmw add ptr @ul, i64 11 monotonic 101 store i64 %7, ptr @ul, align 8 102 %8 = atomicrmw add ptr @sll, i64 11 monotonic 103 store i64 %8, ptr @sll, align 8 104 %9 = atomicrmw add ptr @ull, i64 11 monotonic 105 store i64 %9, ptr @ull, align 8 106 %10 = atomicrmw sub ptr @sc, i8 11 monotonic 107 store i8 %10, ptr @sc, align 1 108 %11 = atomicrmw sub ptr @uc, i8 11 monotonic 109 store i8 %11, ptr @uc, align 1 110 %12 = atomicrmw sub ptr @ss, i16 11 monotonic 111 store i16 %12, ptr @ss, align 2 112 %13 = atomicrmw sub ptr @us, i16 11 monotonic 113 store i16 %13, ptr @us, align 2 114 %14 = atomicrmw sub ptr @si, i32 11 monotonic 115 store i32 %14, ptr @si, align 4 116 %15 = atomicrmw sub ptr @ui, i32 11 monotonic 117 store i32 %15, ptr @ui, align 4 118 %16 = atomicrmw sub ptr @sl, i64 11 monotonic 119 store i64 %16, ptr @sl, align 8 120 %17 = atomicrmw sub ptr @ul, i64 11 monotonic 121 store i64 %17, ptr @ul, align 8 122 %18 = atomicrmw sub ptr @sll, i64 11 monotonic 123 store i64 %18, ptr @sll, align 8 124 %19 = atomicrmw sub ptr @ull, i64 11 monotonic 125 store i64 %19, ptr @ull, align 8 126 %20 = atomicrmw or ptr @sc, i8 11 monotonic 127 store i8 %20, ptr @sc, align 1 128 %21 = atomicrmw or ptr @uc, i8 11 monotonic 129 store i8 %21, ptr @uc, align 1 130 %22 = atomicrmw or ptr @ss, i16 11 monotonic 131 store i16 %22, ptr @ss, align 2 132 %23 = atomicrmw or ptr @us, i16 11 monotonic 133 store i16 %23, ptr @us, align 2 134 %24 = atomicrmw or ptr @si, i32 11 monotonic 135 store i32 %24, ptr @si, align 4 136 %25 = atomicrmw or ptr @ui, i32 11 monotonic 137 store i32 %25, ptr @ui, align 4 138 %26 = atomicrmw or ptr @sl, i64 11 monotonic 139 store i64 %26, ptr @sl, align 8 140 %27 = atomicrmw or ptr @ul, i64 11 monotonic 141 store i64 %27, ptr @ul, align 8 142 %28 = atomicrmw or ptr @sll, i64 11 monotonic 143 store i64 %28, ptr @sll, align 8 144 %29 = atomicrmw or ptr @ull, i64 11 monotonic 145 store i64 %29, ptr @ull, align 8 146 %30 = atomicrmw xor ptr @sc, i8 11 monotonic 147 store i8 %30, ptr @sc, align 1 148 %31 = atomicrmw xor ptr @uc, i8 11 monotonic 149 store i8 %31, ptr @uc, align 1 150 %32 = atomicrmw xor ptr @ss, i16 11 monotonic 151 store i16 %32, ptr @ss, align 2 152 %33 = atomicrmw xor ptr @us, i16 11 monotonic 153 store i16 %33, ptr @us, align 2 154 %34 = atomicrmw xor ptr @si, i32 11 monotonic 155 store i32 %34, ptr @si, align 4 156 %35 = atomicrmw xor ptr @ui, i32 11 monotonic 157 store i32 %35, ptr @ui, align 4 158 %36 = atomicrmw xor ptr @sl, i64 11 monotonic 159 store i64 %36, ptr @sl, align 8 160 %37 = atomicrmw xor ptr @ul, i64 11 monotonic 161 store i64 %37, ptr @ul, align 8 162 %38 = atomicrmw xor ptr @sll, i64 11 monotonic 163 store i64 %38, ptr @sll, align 8 164 %39 = atomicrmw xor ptr @ull, i64 11 monotonic 165 store i64 %39, ptr @ull, align 8 166 %40 = atomicrmw and ptr @sc, i8 11 monotonic 167 store i8 %40, ptr @sc, align 1 168 %41 = atomicrmw and ptr @uc, i8 11 monotonic 169 store i8 %41, ptr @uc, align 1 170 %42 = atomicrmw and ptr @ss, i16 11 monotonic 171 store i16 %42, ptr @ss, align 2 172 %43 = atomicrmw and ptr @us, i16 11 monotonic 173 store i16 %43, ptr @us, align 2 174 %44 = atomicrmw and ptr @si, i32 11 monotonic 175 store i32 %44, ptr @si, align 4 176 %45 = atomicrmw and ptr @ui, i32 11 monotonic 177 store i32 %45, ptr @ui, align 4 178 %46 = atomicrmw and ptr @sl, i64 11 monotonic 179 store i64 %46, ptr @sl, align 8 180 %47 = atomicrmw and ptr @ul, i64 11 monotonic 181 store i64 %47, ptr @ul, align 8 182 %48 = atomicrmw and ptr @sll, i64 11 monotonic 183 store i64 %48, ptr @sll, align 8 184 %49 = atomicrmw and ptr @ull, i64 11 monotonic 185 store i64 %49, ptr @ull, align 8 186 %50 = atomicrmw nand ptr @sc, i8 11 monotonic 187 store i8 %50, ptr @sc, align 1 188 %51 = atomicrmw nand ptr @uc, i8 11 monotonic 189 store i8 %51, ptr @uc, align 1 190 %52 = atomicrmw nand ptr @ss, i16 11 monotonic 191 store i16 %52, ptr @ss, align 2 192 %53 = atomicrmw nand ptr @us, i16 11 monotonic 193 store i16 %53, ptr @us, align 2 194 %54 = atomicrmw nand ptr @si, i32 11 monotonic 195 store i32 %54, ptr @si, align 4 196 %55 = atomicrmw nand ptr @ui, i32 11 monotonic 197 store i32 %55, ptr @ui, align 4 198 %56 = atomicrmw nand ptr @sl, i64 11 monotonic 199 store i64 %56, ptr @sl, align 8 200 %57 = atomicrmw nand ptr @ul, i64 11 monotonic 201 store i64 %57, ptr @ul, align 8 202 %58 = atomicrmw nand ptr @sll, i64 11 monotonic 203 store i64 %58, ptr @sll, align 8 204 %59 = atomicrmw nand ptr @ull, i64 11 monotonic 205 store i64 %59, ptr @ull, align 8 206 br label %return 207 208return: ; preds = %entry 209 ret void 210} 211 212define void @test_op_and_fetch() nounwind { 213entry: 214 %0 = load i8, ptr @uc, align 1 215 %1 = zext i8 %0 to i32 216 %2 = trunc i32 %1 to i8 217 %3 = atomicrmw add ptr @sc, i8 %2 monotonic 218 %4 = add i8 %3, %2 219 store i8 %4, ptr @sc, align 1 220 %5 = load i8, ptr @uc, align 1 221 %6 = zext i8 %5 to i32 222 %7 = trunc i32 %6 to i8 223 %8 = atomicrmw add ptr @uc, i8 %7 monotonic 224 %9 = add i8 %8, %7 225 store i8 %9, ptr @uc, align 1 226 %10 = load i8, ptr @uc, align 1 227 %11 = zext i8 %10 to i32 228 %12 = trunc i32 %11 to i16 229 %13 = atomicrmw add ptr @ss, i16 %12 monotonic 230 %14 = add i16 %13, %12 231 store i16 %14, ptr @ss, align 2 232 %15 = load i8, ptr @uc, align 1 233 %16 = zext i8 %15 to i32 234 %17 = trunc i32 %16 to i16 235 %18 = atomicrmw add ptr @us, i16 %17 monotonic 236 %19 = add i16 %18, %17 237 store i16 %19, ptr @us, align 2 238 %20 = load i8, ptr @uc, align 1 239 %21 = zext i8 %20 to i32 240 %22 = atomicrmw add ptr @si, i32 %21 monotonic 241 %23 = add i32 %22, %21 242 store i32 %23, ptr @si, align 4 243 %24 = load i8, ptr @uc, align 1 244 %25 = zext i8 %24 to i32 245 %26 = atomicrmw add ptr @ui, i32 %25 monotonic 246 %27 = add i32 %26, %25 247 store i32 %27, ptr @ui, align 4 248 %28 = load i8, ptr @uc, align 1 249 %29 = zext i8 %28 to i64 250 %30 = atomicrmw add ptr @sl, i64 %29 monotonic 251 %31 = add i64 %30, %29 252 store i64 %31, ptr @sl, align 8 253 %32 = load i8, ptr @uc, align 1 254 %33 = zext i8 %32 to i64 255 %34 = atomicrmw add ptr @ul, i64 %33 monotonic 256 %35 = add i64 %34, %33 257 store i64 %35, ptr @ul, align 8 258 %36 = load i8, ptr @uc, align 1 259 %37 = zext i8 %36 to i64 260 %38 = atomicrmw add ptr @sll, i64 %37 monotonic 261 %39 = add i64 %38, %37 262 store i64 %39, ptr @sll, align 8 263 %40 = load i8, ptr @uc, align 1 264 %41 = zext i8 %40 to i64 265 %42 = atomicrmw add ptr @ull, i64 %41 monotonic 266 %43 = add i64 %42, %41 267 store i64 %43, ptr @ull, align 8 268 %44 = load i8, ptr @uc, align 1 269 %45 = zext i8 %44 to i32 270 %46 = trunc i32 %45 to i8 271 %47 = atomicrmw sub ptr @sc, i8 %46 monotonic 272 %48 = sub i8 %47, %46 273 store i8 %48, ptr @sc, align 1 274 %49 = load i8, ptr @uc, align 1 275 %50 = zext i8 %49 to i32 276 %51 = trunc i32 %50 to i8 277 %52 = atomicrmw sub ptr @uc, i8 %51 monotonic 278 %53 = sub i8 %52, %51 279 store i8 %53, ptr @uc, align 1 280 %54 = load i8, ptr @uc, align 1 281 %55 = zext i8 %54 to i32 282 %56 = trunc i32 %55 to i16 283 %57 = atomicrmw sub ptr @ss, i16 %56 monotonic 284 %58 = sub i16 %57, %56 285 store i16 %58, ptr @ss, align 2 286 %59 = load i8, ptr @uc, align 1 287 %60 = zext i8 %59 to i32 288 %61 = trunc i32 %60 to i16 289 %62 = atomicrmw sub ptr @us, i16 %61 monotonic 290 %63 = sub i16 %62, %61 291 store i16 %63, ptr @us, align 2 292 %64 = load i8, ptr @uc, align 1 293 %65 = zext i8 %64 to i32 294 %66 = atomicrmw sub ptr @si, i32 %65 monotonic 295 %67 = sub i32 %66, %65 296 store i32 %67, ptr @si, align 4 297 %68 = load i8, ptr @uc, align 1 298 %69 = zext i8 %68 to i32 299 %70 = atomicrmw sub ptr @ui, i32 %69 monotonic 300 %71 = sub i32 %70, %69 301 store i32 %71, ptr @ui, align 4 302 %72 = load i8, ptr @uc, align 1 303 %73 = zext i8 %72 to i64 304 %74 = atomicrmw sub ptr @sl, i64 %73 monotonic 305 %75 = sub i64 %74, %73 306 store i64 %75, ptr @sl, align 8 307 %76 = load i8, ptr @uc, align 1 308 %77 = zext i8 %76 to i64 309 %78 = atomicrmw sub ptr @ul, i64 %77 monotonic 310 %79 = sub i64 %78, %77 311 store i64 %79, ptr @ul, align 8 312 %80 = load i8, ptr @uc, align 1 313 %81 = zext i8 %80 to i64 314 %82 = atomicrmw sub ptr @sll, i64 %81 monotonic 315 %83 = sub i64 %82, %81 316 store i64 %83, ptr @sll, align 8 317 %84 = load i8, ptr @uc, align 1 318 %85 = zext i8 %84 to i64 319 %86 = atomicrmw sub ptr @ull, i64 %85 monotonic 320 %87 = sub i64 %86, %85 321 store i64 %87, ptr @ull, align 8 322 %88 = load i8, ptr @uc, align 1 323 %89 = zext i8 %88 to i32 324 %90 = trunc i32 %89 to i8 325 %91 = atomicrmw or ptr @sc, i8 %90 monotonic 326 %92 = or i8 %91, %90 327 store i8 %92, ptr @sc, align 1 328 %93 = load i8, ptr @uc, align 1 329 %94 = zext i8 %93 to i32 330 %95 = trunc i32 %94 to i8 331 %96 = atomicrmw or ptr @uc, i8 %95 monotonic 332 %97 = or i8 %96, %95 333 store i8 %97, ptr @uc, align 1 334 %98 = load i8, ptr @uc, align 1 335 %99 = zext i8 %98 to i32 336 %100 = trunc i32 %99 to i16 337 %101 = atomicrmw or ptr @ss, i16 %100 monotonic 338 %102 = or i16 %101, %100 339 store i16 %102, ptr @ss, align 2 340 %103 = load i8, ptr @uc, align 1 341 %104 = zext i8 %103 to i32 342 %105 = trunc i32 %104 to i16 343 %106 = atomicrmw or ptr @us, i16 %105 monotonic 344 %107 = or i16 %106, %105 345 store i16 %107, ptr @us, align 2 346 %108 = load i8, ptr @uc, align 1 347 %109 = zext i8 %108 to i32 348 %110 = atomicrmw or ptr @si, i32 %109 monotonic 349 %111 = or i32 %110, %109 350 store i32 %111, ptr @si, align 4 351 %112 = load i8, ptr @uc, align 1 352 %113 = zext i8 %112 to i32 353 %114 = atomicrmw or ptr @ui, i32 %113 monotonic 354 %115 = or i32 %114, %113 355 store i32 %115, ptr @ui, align 4 356 %116 = load i8, ptr @uc, align 1 357 %117 = zext i8 %116 to i64 358 %118 = atomicrmw or ptr @sl, i64 %117 monotonic 359 %119 = or i64 %118, %117 360 store i64 %119, ptr @sl, align 8 361 %120 = load i8, ptr @uc, align 1 362 %121 = zext i8 %120 to i64 363 %122 = atomicrmw or ptr @ul, i64 %121 monotonic 364 %123 = or i64 %122, %121 365 store i64 %123, ptr @ul, align 8 366 %124 = load i8, ptr @uc, align 1 367 %125 = zext i8 %124 to i64 368 %126 = atomicrmw or ptr @sll, i64 %125 monotonic 369 %127 = or i64 %126, %125 370 store i64 %127, ptr @sll, align 8 371 %128 = load i8, ptr @uc, align 1 372 %129 = zext i8 %128 to i64 373 %130 = atomicrmw or ptr @ull, i64 %129 monotonic 374 %131 = or i64 %130, %129 375 store i64 %131, ptr @ull, align 8 376 %132 = load i8, ptr @uc, align 1 377 %133 = zext i8 %132 to i32 378 %134 = trunc i32 %133 to i8 379 %135 = atomicrmw xor ptr @sc, i8 %134 monotonic 380 %136 = xor i8 %135, %134 381 store i8 %136, ptr @sc, align 1 382 %137 = load i8, ptr @uc, align 1 383 %138 = zext i8 %137 to i32 384 %139 = trunc i32 %138 to i8 385 %140 = atomicrmw xor ptr @uc, i8 %139 monotonic 386 %141 = xor i8 %140, %139 387 store i8 %141, ptr @uc, align 1 388 %142 = load i8, ptr @uc, align 1 389 %143 = zext i8 %142 to i32 390 %144 = trunc i32 %143 to i16 391 %145 = atomicrmw xor ptr @ss, i16 %144 monotonic 392 %146 = xor i16 %145, %144 393 store i16 %146, ptr @ss, align 2 394 %147 = load i8, ptr @uc, align 1 395 %148 = zext i8 %147 to i32 396 %149 = trunc i32 %148 to i16 397 %150 = atomicrmw xor ptr @us, i16 %149 monotonic 398 %151 = xor i16 %150, %149 399 store i16 %151, ptr @us, align 2 400 %152 = load i8, ptr @uc, align 1 401 %153 = zext i8 %152 to i32 402 %154 = atomicrmw xor ptr @si, i32 %153 monotonic 403 %155 = xor i32 %154, %153 404 store i32 %155, ptr @si, align 4 405 %156 = load i8, ptr @uc, align 1 406 %157 = zext i8 %156 to i32 407 %158 = atomicrmw xor ptr @ui, i32 %157 monotonic 408 %159 = xor i32 %158, %157 409 store i32 %159, ptr @ui, align 4 410 %160 = load i8, ptr @uc, align 1 411 %161 = zext i8 %160 to i64 412 %162 = atomicrmw xor ptr @sl, i64 %161 monotonic 413 %163 = xor i64 %162, %161 414 store i64 %163, ptr @sl, align 8 415 %164 = load i8, ptr @uc, align 1 416 %165 = zext i8 %164 to i64 417 %166 = atomicrmw xor ptr @ul, i64 %165 monotonic 418 %167 = xor i64 %166, %165 419 store i64 %167, ptr @ul, align 8 420 %168 = load i8, ptr @uc, align 1 421 %169 = zext i8 %168 to i64 422 %170 = atomicrmw xor ptr @sll, i64 %169 monotonic 423 %171 = xor i64 %170, %169 424 store i64 %171, ptr @sll, align 8 425 %172 = load i8, ptr @uc, align 1 426 %173 = zext i8 %172 to i64 427 %174 = atomicrmw xor ptr @ull, i64 %173 monotonic 428 %175 = xor i64 %174, %173 429 store i64 %175, ptr @ull, align 8 430 %176 = load i8, ptr @uc, align 1 431 %177 = zext i8 %176 to i32 432 %178 = trunc i32 %177 to i8 433 %179 = atomicrmw and ptr @sc, i8 %178 monotonic 434 %180 = and i8 %179, %178 435 store i8 %180, ptr @sc, align 1 436 %181 = load i8, ptr @uc, align 1 437 %182 = zext i8 %181 to i32 438 %183 = trunc i32 %182 to i8 439 %184 = atomicrmw and ptr @uc, i8 %183 monotonic 440 %185 = and i8 %184, %183 441 store i8 %185, ptr @uc, align 1 442 %186 = load i8, ptr @uc, align 1 443 %187 = zext i8 %186 to i32 444 %188 = trunc i32 %187 to i16 445 %189 = atomicrmw and ptr @ss, i16 %188 monotonic 446 %190 = and i16 %189, %188 447 store i16 %190, ptr @ss, align 2 448 %191 = load i8, ptr @uc, align 1 449 %192 = zext i8 %191 to i32 450 %193 = trunc i32 %192 to i16 451 %194 = atomicrmw and ptr @us, i16 %193 monotonic 452 %195 = and i16 %194, %193 453 store i16 %195, ptr @us, align 2 454 %196 = load i8, ptr @uc, align 1 455 %197 = zext i8 %196 to i32 456 %198 = atomicrmw and ptr @si, i32 %197 monotonic 457 %199 = and i32 %198, %197 458 store i32 %199, ptr @si, align 4 459 %200 = load i8, ptr @uc, align 1 460 %201 = zext i8 %200 to i32 461 %202 = atomicrmw and ptr @ui, i32 %201 monotonic 462 %203 = and i32 %202, %201 463 store i32 %203, ptr @ui, align 4 464 %204 = load i8, ptr @uc, align 1 465 %205 = zext i8 %204 to i64 466 %206 = atomicrmw and ptr @sl, i64 %205 monotonic 467 %207 = and i64 %206, %205 468 store i64 %207, ptr @sl, align 8 469 %208 = load i8, ptr @uc, align 1 470 %209 = zext i8 %208 to i64 471 %210 = atomicrmw and ptr @ul, i64 %209 monotonic 472 %211 = and i64 %210, %209 473 store i64 %211, ptr @ul, align 8 474 %212 = load i8, ptr @uc, align 1 475 %213 = zext i8 %212 to i64 476 %214 = atomicrmw and ptr @sll, i64 %213 monotonic 477 %215 = and i64 %214, %213 478 store i64 %215, ptr @sll, align 8 479 %216 = load i8, ptr @uc, align 1 480 %217 = zext i8 %216 to i64 481 %218 = atomicrmw and ptr @ull, i64 %217 monotonic 482 %219 = and i64 %218, %217 483 store i64 %219, ptr @ull, align 8 484 %220 = load i8, ptr @uc, align 1 485 %221 = zext i8 %220 to i32 486 %222 = trunc i32 %221 to i8 487 %223 = atomicrmw nand ptr @sc, i8 %222 monotonic 488 %224 = xor i8 %223, -1 489 %225 = and i8 %224, %222 490 store i8 %225, ptr @sc, align 1 491 %226 = load i8, ptr @uc, align 1 492 %227 = zext i8 %226 to i32 493 %228 = trunc i32 %227 to i8 494 %229 = atomicrmw nand ptr @uc, i8 %228 monotonic 495 %230 = xor i8 %229, -1 496 %231 = and i8 %230, %228 497 store i8 %231, ptr @uc, align 1 498 %232 = load i8, ptr @uc, align 1 499 %233 = zext i8 %232 to i32 500 %234 = trunc i32 %233 to i16 501 %235 = atomicrmw nand ptr @ss, i16 %234 monotonic 502 %236 = xor i16 %235, -1 503 %237 = and i16 %236, %234 504 store i16 %237, ptr @ss, align 2 505 %238 = load i8, ptr @uc, align 1 506 %239 = zext i8 %238 to i32 507 %240 = trunc i32 %239 to i16 508 %241 = atomicrmw nand ptr @us, i16 %240 monotonic 509 %242 = xor i16 %241, -1 510 %243 = and i16 %242, %240 511 store i16 %243, ptr @us, align 2 512 %244 = load i8, ptr @uc, align 1 513 %245 = zext i8 %244 to i32 514 %246 = atomicrmw nand ptr @si, i32 %245 monotonic 515 %247 = xor i32 %246, -1 516 %248 = and i32 %247, %245 517 store i32 %248, ptr @si, align 4 518 %249 = load i8, ptr @uc, align 1 519 %250 = zext i8 %249 to i32 520 %251 = atomicrmw nand ptr @ui, i32 %250 monotonic 521 %252 = xor i32 %251, -1 522 %253 = and i32 %252, %250 523 store i32 %253, ptr @ui, align 4 524 %254 = load i8, ptr @uc, align 1 525 %255 = zext i8 %254 to i64 526 %256 = atomicrmw nand ptr @sl, i64 %255 monotonic 527 %257 = xor i64 %256, -1 528 %258 = and i64 %257, %255 529 store i64 %258, ptr @sl, align 8 530 %259 = load i8, ptr @uc, align 1 531 %260 = zext i8 %259 to i64 532 %261 = atomicrmw nand ptr @ul, i64 %260 monotonic 533 %262 = xor i64 %261, -1 534 %263 = and i64 %262, %260 535 store i64 %263, ptr @ul, align 8 536 %264 = load i8, ptr @uc, align 1 537 %265 = zext i8 %264 to i64 538 %266 = atomicrmw nand ptr @sll, i64 %265 monotonic 539 %267 = xor i64 %266, -1 540 %268 = and i64 %267, %265 541 store i64 %268, ptr @sll, align 8 542 %269 = load i8, ptr @uc, align 1 543 %270 = zext i8 %269 to i64 544 %271 = atomicrmw nand ptr @ull, i64 %270 monotonic 545 %272 = xor i64 %271, -1 546 %273 = and i64 %272, %270 547 store i64 %273, ptr @ull, align 8 548 br label %return 549 550return: ; preds = %entry 551 ret void 552} 553 554define void @test_compare_and_swap() nounwind { 555entry: 556 %0 = load i8, ptr @sc, align 1 557 %1 = zext i8 %0 to i32 558 %2 = load i8, ptr @uc, align 1 559 %3 = zext i8 %2 to i32 560 %4 = trunc i32 %3 to i8 561 %5 = trunc i32 %1 to i8 562 %pair6 = cmpxchg ptr @sc, i8 %4, i8 %5 monotonic monotonic 563 %6 = extractvalue { i8, i1 } %pair6, 0 564 store i8 %6, ptr @sc, align 1 565 %7 = load i8, ptr @sc, align 1 566 %8 = zext i8 %7 to i32 567 %9 = load i8, ptr @uc, align 1 568 %10 = zext i8 %9 to i32 569 %11 = trunc i32 %10 to i8 570 %12 = trunc i32 %8 to i8 571 %pair13 = cmpxchg ptr @uc, i8 %11, i8 %12 monotonic monotonic 572 %13 = extractvalue { i8, i1 } %pair13, 0 573 store i8 %13, ptr @uc, align 1 574 %14 = load i8, ptr @sc, align 1 575 %15 = sext i8 %14 to i16 576 %16 = zext i16 %15 to i32 577 %17 = load i8, ptr @uc, align 1 578 %18 = zext i8 %17 to i32 579 %19 = trunc i32 %18 to i16 580 %20 = trunc i32 %16 to i16 581 %pair22 = cmpxchg ptr @ss, i16 %19, i16 %20 monotonic monotonic 582 %21 = extractvalue { i16, i1 } %pair22, 0 583 store i16 %21, ptr @ss, align 2 584 %22 = load i8, ptr @sc, align 1 585 %23 = sext i8 %22 to i16 586 %24 = zext i16 %23 to i32 587 %25 = load i8, ptr @uc, align 1 588 %26 = zext i8 %25 to i32 589 %27 = trunc i32 %26 to i16 590 %28 = trunc i32 %24 to i16 591 %pair31 = cmpxchg ptr @us, i16 %27, i16 %28 monotonic monotonic 592 %29 = extractvalue { i16, i1 } %pair31, 0 593 store i16 %29, ptr @us, align 2 594 %30 = load i8, ptr @sc, align 1 595 %31 = sext i8 %30 to i32 596 %32 = load i8, ptr @uc, align 1 597 %33 = zext i8 %32 to i32 598 %pair37 = cmpxchg ptr @si, i32 %33, i32 %31 monotonic monotonic 599 %34 = extractvalue { i32, i1 } %pair37, 0 600 store i32 %34, ptr @si, align 4 601 %35 = load i8, ptr @sc, align 1 602 %36 = sext i8 %35 to i32 603 %37 = load i8, ptr @uc, align 1 604 %38 = zext i8 %37 to i32 605 %pair43 = cmpxchg ptr @ui, i32 %38, i32 %36 monotonic monotonic 606 %39 = extractvalue { i32, i1 } %pair43, 0 607 store i32 %39, ptr @ui, align 4 608 %40 = load i8, ptr @sc, align 1 609 %41 = sext i8 %40 to i64 610 %42 = load i8, ptr @uc, align 1 611 %43 = zext i8 %42 to i64 612 %pair49 = cmpxchg ptr @sl, i64 %43, i64 %41 monotonic monotonic 613 %44 = extractvalue { i64, i1 } %pair49, 0 614 store i64 %44, ptr @sl, align 8 615 %45 = load i8, ptr @sc, align 1 616 %46 = sext i8 %45 to i64 617 %47 = load i8, ptr @uc, align 1 618 %48 = zext i8 %47 to i64 619 %pair55 = cmpxchg ptr @ul, i64 %48, i64 %46 monotonic monotonic 620 %49 = extractvalue { i64, i1 } %pair55, 0 621 store i64 %49, ptr @ul, align 8 622 %50 = load i8, ptr @sc, align 1 623 %51 = sext i8 %50 to i64 624 %52 = load i8, ptr @uc, align 1 625 %53 = zext i8 %52 to i64 626 %pair61 = cmpxchg ptr @sll, i64 %53, i64 %51 monotonic monotonic 627 %54 = extractvalue { i64, i1 } %pair61, 0 628 store i64 %54, ptr @sll, align 8 629 %55 = load i8, ptr @sc, align 1 630 %56 = sext i8 %55 to i64 631 %57 = load i8, ptr @uc, align 1 632 %58 = zext i8 %57 to i64 633 %pair67 = cmpxchg ptr @ull, i64 %58, i64 %56 monotonic monotonic 634 %59 = extractvalue { i64, i1 } %pair67, 0 635 store i64 %59, ptr @ull, align 8 636 %60 = load i8, ptr @sc, align 1 637 %61 = zext i8 %60 to i32 638 %62 = load i8, ptr @uc, align 1 639 %63 = zext i8 %62 to i32 640 %64 = trunc i32 %63 to i8 641 %65 = trunc i32 %61 to i8 642 %pair74 = cmpxchg ptr @sc, i8 %64, i8 %65 monotonic monotonic 643 %66 = extractvalue { i8, i1 } %pair74, 0 644 %67 = icmp eq i8 %66, %64 645 %68 = zext i1 %67 to i8 646 %69 = zext i8 %68 to i32 647 store i32 %69, ptr @ui, align 4 648 %70 = load i8, ptr @sc, align 1 649 %71 = zext i8 %70 to i32 650 %72 = load i8, ptr @uc, align 1 651 %73 = zext i8 %72 to i32 652 %74 = trunc i32 %73 to i8 653 %75 = trunc i32 %71 to i8 654 %pair84 = cmpxchg ptr @uc, i8 %74, i8 %75 monotonic monotonic 655 %76 = extractvalue { i8, i1 } %pair84, 0 656 %77 = icmp eq i8 %76, %74 657 %78 = zext i1 %77 to i8 658 %79 = zext i8 %78 to i32 659 store i32 %79, ptr @ui, align 4 660 %80 = load i8, ptr @sc, align 1 661 %81 = sext i8 %80 to i16 662 %82 = zext i16 %81 to i32 663 %83 = load i8, ptr @uc, align 1 664 %84 = zext i8 %83 to i32 665 %85 = trunc i32 %84 to i8 666 %86 = trunc i32 %82 to i8 667 %pair95 = cmpxchg ptr @ss, i8 %85, i8 %86 monotonic monotonic 668 %87 = extractvalue { i8, i1 } %pair95, 0 669 %88 = icmp eq i8 %87, %85 670 %89 = zext i1 %88 to i8 671 %90 = zext i8 %89 to i32 672 store i32 %90, ptr @ui, align 4 673 %91 = load i8, ptr @sc, align 1 674 %92 = sext i8 %91 to i16 675 %93 = zext i16 %92 to i32 676 %94 = load i8, ptr @uc, align 1 677 %95 = zext i8 %94 to i32 678 %96 = trunc i32 %95 to i8 679 %97 = trunc i32 %93 to i8 680 %pair106 = cmpxchg ptr @us, i8 %96, i8 %97 monotonic monotonic 681 %98 = extractvalue { i8, i1 } %pair106, 0 682 %99 = icmp eq i8 %98, %96 683 %100 = zext i1 %99 to i8 684 %101 = zext i8 %100 to i32 685 store i32 %101, ptr @ui, align 4 686 %102 = load i8, ptr @sc, align 1 687 %103 = sext i8 %102 to i32 688 %104 = load i8, ptr @uc, align 1 689 %105 = zext i8 %104 to i32 690 %106 = trunc i32 %105 to i8 691 %107 = trunc i32 %103 to i8 692 %pair116 = cmpxchg ptr @si, i8 %106, i8 %107 monotonic monotonic 693 %108 = extractvalue { i8, i1 } %pair116, 0 694 %109 = icmp eq i8 %108, %106 695 %110 = zext i1 %109 to i8 696 %111 = zext i8 %110 to i32 697 store i32 %111, ptr @ui, align 4 698 %112 = load i8, ptr @sc, align 1 699 %113 = sext i8 %112 to i32 700 %114 = load i8, ptr @uc, align 1 701 %115 = zext i8 %114 to i32 702 %116 = trunc i32 %115 to i8 703 %117 = trunc i32 %113 to i8 704 %pair126 = cmpxchg ptr @ui, i8 %116, i8 %117 monotonic monotonic 705 %118 = extractvalue { i8, i1 } %pair126, 0 706 %119 = icmp eq i8 %118, %116 707 %120 = zext i1 %119 to i8 708 %121 = zext i8 %120 to i32 709 store i32 %121, ptr @ui, align 4 710 %122 = load i8, ptr @sc, align 1 711 %123 = sext i8 %122 to i64 712 %124 = load i8, ptr @uc, align 1 713 %125 = zext i8 %124 to i64 714 %126 = trunc i64 %125 to i8 715 %127 = trunc i64 %123 to i8 716 %pair136 = cmpxchg ptr @sl, i8 %126, i8 %127 monotonic monotonic 717 %128 = extractvalue { i8, i1 } %pair136, 0 718 %129 = icmp eq i8 %128, %126 719 %130 = zext i1 %129 to i8 720 %131 = zext i8 %130 to i32 721 store i32 %131, ptr @ui, align 4 722 %132 = load i8, ptr @sc, align 1 723 %133 = sext i8 %132 to i64 724 %134 = load i8, ptr @uc, align 1 725 %135 = zext i8 %134 to i64 726 %136 = trunc i64 %135 to i8 727 %137 = trunc i64 %133 to i8 728 %pair146 = cmpxchg ptr @ul, i8 %136, i8 %137 monotonic monotonic 729 %138 = extractvalue { i8, i1 } %pair146, 0 730 %139 = icmp eq i8 %138, %136 731 %140 = zext i1 %139 to i8 732 %141 = zext i8 %140 to i32 733 store i32 %141, ptr @ui, align 4 734 %142 = load i8, ptr @sc, align 1 735 %143 = sext i8 %142 to i64 736 %144 = load i8, ptr @uc, align 1 737 %145 = zext i8 %144 to i64 738 %146 = trunc i64 %145 to i8 739 %147 = trunc i64 %143 to i8 740 %pair156 = cmpxchg ptr @sll, i8 %146, i8 %147 monotonic monotonic 741 %148 = extractvalue { i8, i1 } %pair156, 0 742 %149 = icmp eq i8 %148, %146 743 %150 = zext i1 %149 to i8 744 %151 = zext i8 %150 to i32 745 store i32 %151, ptr @ui, align 4 746 %152 = load i8, ptr @sc, align 1 747 %153 = sext i8 %152 to i64 748 %154 = load i8, ptr @uc, align 1 749 %155 = zext i8 %154 to i64 750 %156 = trunc i64 %155 to i8 751 %157 = trunc i64 %153 to i8 752 %pair166 = cmpxchg ptr @ull, i8 %156, i8 %157 monotonic monotonic 753 %158 = extractvalue { i8, i1 } %pair166, 0 754 %159 = icmp eq i8 %158, %156 755 %160 = zext i1 %159 to i8 756 %161 = zext i8 %160 to i32 757 store i32 %161, ptr @ui, align 4 758 br label %return 759 760return: ; preds = %entry 761 ret void 762} 763 764define void @test_lock() nounwind { 765entry: 766 %0 = atomicrmw xchg ptr @sc, i8 1 monotonic 767 store i8 %0, ptr @sc, align 1 768 %1 = atomicrmw xchg ptr @uc, i8 1 monotonic 769 store i8 %1, ptr @uc, align 1 770 %2 = atomicrmw xchg ptr @ss, i16 1 monotonic 771 store i16 %2, ptr @ss, align 2 772 %3 = atomicrmw xchg ptr @us, i16 1 monotonic 773 store i16 %3, ptr @us, align 2 774 %4 = atomicrmw xchg ptr @si, i32 1 monotonic 775 store i32 %4, ptr @si, align 4 776 %5 = atomicrmw xchg ptr @ui, i32 1 monotonic 777 store i32 %5, ptr @ui, align 4 778 %6 = atomicrmw xchg ptr @sl, i64 1 monotonic 779 store i64 %6, ptr @sl, align 8 780 %7 = atomicrmw xchg ptr @ul, i64 1 monotonic 781 store i64 %7, ptr @ul, align 8 782 %8 = atomicrmw xchg ptr @sll, i64 1 monotonic 783 store i64 %8, ptr @sll, align 8 784 %9 = atomicrmw xchg ptr @ull, i64 1 monotonic 785 store i64 %9, ptr @ull, align 8 786 fence seq_cst 787 store volatile i8 0, ptr @sc, align 1 788 store volatile i8 0, ptr @uc, align 1 789 store volatile i16 0, ptr @ss, align 2 790 store volatile i16 0, ptr @us, align 2 791 store volatile i32 0, ptr @si, align 4 792 store volatile i32 0, ptr @ui, align 4 793 store volatile i64 0, ptr @sl, align 8 794 store volatile i64 0, ptr @ul, align 8 795 store volatile i64 0, ptr @sll, align 8 796 store volatile i64 0, ptr @ull, align 8 797 br label %return 798 799return: ; preds = %entry 800 ret void 801} 802