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