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