Home | History | Annotate | Download | only in GVN
      1 ; RUN: opt -basicaa -gvn -S < %s | FileCheck %s
      2 
      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-n8:16:32:64"
      4 target triple = "x86_64-apple-macosx10.7.0"
      5 
      6 @x = common global i32 0, align 4
      7 @y = common global i32 0, align 4
      8 
      9 ; GVN across unordered store (allowed)
     10 define i32 @test1() nounwind uwtable ssp {
     11 ; CHECK: test1
     12 ; CHECK: add i32 %x, %x
     13 entry:
     14   %x = load i32* @y
     15   store atomic i32 %x, i32* @x unordered, align 4
     16   %y = load i32* @y
     17   %z = add i32 %x, %y
     18   ret i32 %z
     19 }
     20 
     21 ; GVN across seq_cst store (allowed in theory; not implemented ATM)
     22 define i32 @test2() nounwind uwtable ssp {
     23 ; CHECK: test2
     24 ; CHECK: add i32 %x, %y
     25 entry:
     26   %x = load i32* @y
     27   store atomic i32 %x, i32* @x seq_cst, align 4
     28   %y = load i32* @y
     29   %z = add i32 %x, %y
     30   ret i32 %z
     31 }
     32 
     33 ; GVN across unordered load (allowed)
     34 define i32 @test3() nounwind uwtable ssp {
     35 ; CHECK: test3
     36 ; CHECK: add i32 %x, %x
     37 entry:
     38   %x = load i32* @y
     39   %y = load atomic i32* @x unordered, align 4
     40   %z = load i32* @y
     41   %a = add i32 %x, %z
     42   %b = add i32 %y, %a
     43   ret i32 %b
     44 }
     45 
     46 ; GVN across acquire load (load after atomic load must not be removed)
     47 define i32 @test4() nounwind uwtable ssp {
     48 ; CHECK: test4
     49 ; CHECK: load atomic i32* @x
     50 ; CHECK: load i32* @y
     51 entry:
     52   %x = load i32* @y
     53   %y = load atomic i32* @x seq_cst, align 4
     54   %x2 = load i32* @y
     55   %x3 = add i32 %x, %x2
     56   %y2 = add i32 %y, %x3
     57   ret i32 %y2
     58 }
     59 
     60 ; GVN load to unordered load (allowed)
     61 define i32 @test5() nounwind uwtable ssp {
     62 ; CHECK: test5
     63 ; CHECK: add i32 %x, %x
     64 entry:
     65   %x = load atomic i32* @x unordered, align 4
     66   %y = load i32* @x
     67   %z = add i32 %x, %y
     68   ret i32 %z
     69 }
     70 
     71 ; GVN unordered load to load (unordered load must not be removed)
     72 define i32 @test6() nounwind uwtable ssp {
     73 ; CHECK: test6
     74 ; CHECK: load atomic i32* @x unordered
     75 entry:
     76   %x = load i32* @x
     77   %x2 = load atomic i32* @x unordered, align 4
     78   %x3 = add i32 %x, %x2
     79   ret i32 %x3
     80 }
     81