Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc < %s -march=ppc32
      2 target 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"
      3 target 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 
     16 define void @test_op_ignore() nounwind {
     17 entry:
     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 
    104 return:                                           ; preds = %entry
    105   ret void
    106 }
    107 
    108 define void @test_fetch_and_op() nounwind {
    109 entry:
    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 
    244 return:                                           ; preds = %entry
    245   ret void
    246 }
    247 
    248 define void @test_op_and_fetch() nounwind {
    249 entry:
    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 
    524 return:                                           ; preds = %entry
    525   ret void
    526 }
    527 
    528 define void @test_compare_and_swap() nounwind {
    529 entry:
    530   %0 = load i8* @uc, align 1
    531   %1 = load i8* @sc, align 1
    532   %2 = cmpxchg i8* @sc, i8 %0, i8 %1 monotonic
    533   store i8 %2, i8* @sc, align 1
    534   %3 = load i8* @uc, align 1
    535   %4 = load i8* @sc, align 1
    536   %5 = cmpxchg i8* @uc, i8 %3, i8 %4 monotonic
    537   store i8 %5, i8* @uc, align 1
    538   %6 = load i8* @uc, align 1
    539   %7 = zext i8 %6 to i16
    540   %8 = load i8* @sc, align 1
    541   %9 = sext i8 %8 to i16
    542   %10 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
    543   %11 = cmpxchg i16* %10, i16 %7, i16 %9 monotonic
    544   store i16 %11, i16* @ss, align 2
    545   %12 = load i8* @uc, align 1
    546   %13 = zext i8 %12 to i16
    547   %14 = load i8* @sc, align 1
    548   %15 = sext i8 %14 to i16
    549   %16 = bitcast i8* bitcast (i16* @us to i8*) to i16*
    550   %17 = cmpxchg i16* %16, i16 %13, i16 %15 monotonic
    551   store i16 %17, i16* @us, align 2
    552   %18 = load i8* @uc, align 1
    553   %19 = zext i8 %18 to i32
    554   %20 = load i8* @sc, align 1
    555   %21 = sext i8 %20 to i32
    556   %22 = bitcast i8* bitcast (i32* @si to i8*) to i32*
    557   %23 = cmpxchg i32* %22, i32 %19, i32 %21 monotonic
    558   store i32 %23, i32* @si, align 4
    559   %24 = load i8* @uc, align 1
    560   %25 = zext i8 %24 to i32
    561   %26 = load i8* @sc, align 1
    562   %27 = sext i8 %26 to i32
    563   %28 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
    564   %29 = cmpxchg i32* %28, i32 %25, i32 %27 monotonic
    565   store i32 %29, i32* @ui, align 4
    566   %30 = load i8* @uc, align 1
    567   %31 = zext i8 %30 to i32
    568   %32 = load i8* @sc, align 1
    569   %33 = sext i8 %32 to i32
    570   %34 = bitcast i8* bitcast (i32* @sl to i8*) to i32*
    571   %35 = cmpxchg i32* %34, i32 %31, i32 %33 monotonic
    572   store i32 %35, i32* @sl, align 4
    573   %36 = load i8* @uc, align 1
    574   %37 = zext i8 %36 to i32
    575   %38 = load i8* @sc, align 1
    576   %39 = sext i8 %38 to i32
    577   %40 = bitcast i8* bitcast (i32* @ul to i8*) to i32*
    578   %41 = cmpxchg i32* %40, i32 %37, i32 %39 monotonic
    579   store i32 %41, i32* @ul, align 4
    580   %42 = load i8* @uc, align 1
    581   %43 = load i8* @sc, align 1
    582   %44 = cmpxchg i8* @sc, i8 %42, i8 %43 monotonic
    583   %45 = icmp eq i8 %44, %42
    584   %46 = zext i1 %45 to i32
    585   store i32 %46, i32* @ui, align 4
    586   %47 = load i8* @uc, align 1
    587   %48 = load i8* @sc, align 1
    588   %49 = cmpxchg i8* @uc, i8 %47, i8 %48 monotonic
    589   %50 = icmp eq i8 %49, %47
    590   %51 = zext i1 %50 to i32
    591   store i32 %51, i32* @ui, align 4
    592   %52 = load i8* @uc, align 1
    593   %53 = zext i8 %52 to i16
    594   %54 = load i8* @sc, align 1
    595   %55 = sext i8 %54 to i16
    596   %56 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
    597   %57 = cmpxchg i16* %56, i16 %53, i16 %55 monotonic
    598   %58 = icmp eq i16 %57, %53
    599   %59 = zext i1 %58 to i32
    600   store i32 %59, i32* @ui, align 4
    601   %60 = load i8* @uc, align 1
    602   %61 = zext i8 %60 to i16
    603   %62 = load i8* @sc, align 1
    604   %63 = sext i8 %62 to i16
    605   %64 = bitcast i8* bitcast (i16* @us to i8*) to i16*
    606   %65 = cmpxchg i16* %64, i16 %61, i16 %63 monotonic
    607   %66 = icmp eq i16 %65, %61
    608   %67 = zext i1 %66 to i32
    609   store i32 %67, i32* @ui, align 4
    610   %68 = load i8* @uc, align 1
    611   %69 = zext i8 %68 to i32
    612   %70 = load i8* @sc, align 1
    613   %71 = sext i8 %70 to i32
    614   %72 = bitcast i8* bitcast (i32* @si to i8*) to i32*
    615   %73 = cmpxchg i32* %72, i32 %69, i32 %71 monotonic
    616   %74 = icmp eq i32 %73, %69
    617   %75 = zext i1 %74 to i32
    618   store i32 %75, i32* @ui, align 4
    619   %76 = load i8* @uc, align 1
    620   %77 = zext i8 %76 to i32
    621   %78 = load i8* @sc, align 1
    622   %79 = sext i8 %78 to i32
    623   %80 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
    624   %81 = cmpxchg i32* %80, i32 %77, i32 %79 monotonic
    625   %82 = icmp eq i32 %81, %77
    626   %83 = zext i1 %82 to i32
    627   store i32 %83, i32* @ui, align 4
    628   %84 = load i8* @uc, align 1
    629   %85 = zext i8 %84 to i32
    630   %86 = load i8* @sc, align 1
    631   %87 = sext i8 %86 to i32
    632   %88 = bitcast i8* bitcast (i32* @sl to i8*) to i32*
    633   %89 = cmpxchg i32* %88, i32 %85, i32 %87 monotonic
    634   %90 = icmp eq i32 %89, %85
    635   %91 = zext i1 %90 to i32
    636   store i32 %91, i32* @ui, align 4
    637   %92 = load i8* @uc, align 1
    638   %93 = zext i8 %92 to i32
    639   %94 = load i8* @sc, align 1
    640   %95 = sext i8 %94 to i32
    641   %96 = bitcast i8* bitcast (i32* @ul to i8*) to i32*
    642   %97 = cmpxchg i32* %96, i32 %93, i32 %95 monotonic
    643   %98 = icmp eq i32 %97, %93
    644   %99 = zext i1 %98 to i32
    645   store i32 %99, i32* @ui, align 4
    646   br label %return
    647 
    648 return:                                           ; preds = %entry
    649   ret void
    650 }
    651 
    652 define void @test_lock() nounwind {
    653 entry:
    654   %0 = atomicrmw xchg i8* @sc, i8 1 monotonic
    655   store i8 %0, i8* @sc, align 1
    656   %1 = atomicrmw xchg i8* @uc, i8 1 monotonic
    657   store i8 %1, i8* @uc, align 1
    658   %2 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
    659   %3 = atomicrmw xchg i16* %2, i16 1 monotonic
    660   store i16 %3, i16* @ss, align 2
    661   %4 = bitcast i8* bitcast (i16* @us to i8*) to i16*
    662   %5 = atomicrmw xchg i16* %4, i16 1 monotonic
    663   store i16 %5, i16* @us, align 2
    664   %6 = bitcast i8* bitcast (i32* @si to i8*) to i32*
    665   %7 = atomicrmw xchg i32* %6, i32 1 monotonic
    666   store i32 %7, i32* @si, align 4
    667   %8 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
    668   %9 = atomicrmw xchg i32* %8, i32 1 monotonic
    669   store i32 %9, i32* @ui, align 4
    670   %10 = bitcast i8* bitcast (i32* @sl to i8*) to i32*
    671   %11 = atomicrmw xchg i32* %10, i32 1 monotonic
    672   store i32 %11, i32* @sl, align 4
    673   %12 = bitcast i8* bitcast (i32* @ul to i8*) to i32*
    674   %13 = atomicrmw xchg i32* %12, i32 1 monotonic
    675   store i32 %13, i32* @ul, align 4
    676   fence seq_cst
    677   store volatile i8 0, i8* @sc, align 1
    678   store volatile i8 0, i8* @uc, align 1
    679   %14 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
    680   store volatile i16 0, i16* %14, align 2
    681   %15 = bitcast i8* bitcast (i16* @us to i8*) to i16*
    682   store volatile i16 0, i16* %15, align 2
    683   %16 = bitcast i8* bitcast (i32* @si to i8*) to i32*
    684   store volatile i32 0, i32* %16, align 4
    685   %17 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
    686   store volatile i32 0, i32* %17, align 4
    687   %18 = bitcast i8* bitcast (i32* @sl to i8*) to i32*
    688   store volatile i32 0, i32* %18, align 4
    689   %19 = bitcast i8* bitcast (i32* @ul to i8*) to i32*
    690   store volatile i32 0, i32* %19, align 4
    691   %20 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
    692   store volatile i64 0, i64* %20, align 8
    693   %21 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
    694   store volatile i64 0, i64* %21, align 8
    695   br label %return
    696 
    697 return:                                           ; preds = %entry
    698   ret void
    699 }
    700