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