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