Home | History | Annotate | Download | only in BasicAA
      1 ; Test that GCSE uses basicaa to do alias analysis, which is capable of 
      2 ; disambiguating some obvious cases.  All loads should be removable in 
      3 ; this testcase.
      4 
      5 ; RUN: opt < %s -basicaa -gvn -instcombine -dce -S | FileCheck %s
      6 
      7 @A = global i32 7
      8 @B = global i32 8
      9 
     10 ; CHECK:      define i32 @test()
     11 ; CHECK-NEXT:   store i32 123, i32* @B
     12 ; CHECK-NEXT:   ret i32 0
     13 
     14 define i32 @test() {
     15 	%A1 = load i32* @A
     16 
     17 	store i32 123, i32* @B  ; Store cannot alias @A
     18 
     19 	%A2 = load i32* @A
     20 	%X = sub i32 %A1, %A2
     21 	ret i32 %X
     22 }
     23 
     24 ; CHECK:      define i32 @test2()
     25 ; CHECK-NEXT:   br label %Loop
     26 ; CHECK:      Loop:
     27 ; CHECK-NEXT:   store i32 0, i32* @B
     28 ; CHECK-NEXT:   br i1 true, label %out, label %Loop
     29 ; CHECK:      out:
     30 ; CHECK-NEXT:   ret i32 0
     31 
     32 define i32 @test2() {
     33         %A1 = load i32* @A
     34         br label %Loop
     35 Loop:
     36         %AP = phi i32 [0, %0], [%X, %Loop]
     37         store i32 %AP, i32* @B  ; Store cannot alias @A
     38 
     39         %A2 = load i32* @A
     40         %X = sub i32 %A1, %A2
     41         %c = icmp eq i32 %X, 0
     42         br i1 %c, label %out, label %Loop
     43 
     44 out:
     45         ret i32 %X
     46 }
     47 
     48 declare void @external()
     49 
     50 ; CHECK:      define i32 @test3()
     51 ; CHECK-NEXT:   call void @external()
     52 ; CHECK-NEXT:   ret i32 7
     53 
     54 define i32 @test3() {
     55 	%X = alloca i32
     56 	store i32 7, i32* %X
     57 	call void @external()
     58 	%V = load i32* %X
     59 	ret i32 %V
     60 }
     61 
     62