Home | History | Annotate | Download | only in LICM
      1 ; RUN: opt -S -basicaa -licm %s | FileCheck %s
      2 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,loop(licm)' < %s -S | FileCheck %s
      3 declare i32 @foo() readonly argmemonly nounwind
      4 declare i32 @foo2() readonly nounwind
      5 declare i32 @bar(i32* %loc2) readonly argmemonly nounwind
      6 
      7 define void @test(i32* %loc) {
      8 ; CHECK-LABEL: @test
      9 ; CHECK: @foo
     10 ; CHECK-LABEL: loop:
     11   br label %loop
     12 
     13 loop:
     14   %res = call i32 @foo()
     15   store i32 %res, i32* %loc
     16   br label %loop
     17 }
     18 
     19 ; Negative test: show argmemonly is required
     20 define void @test_neg(i32* %loc) {
     21 ; CHECK-LABEL: @test_neg
     22 ; CHECK-LABEL: loop:
     23 ; CHECK: @foo
     24   br label %loop
     25 
     26 loop:
     27   %res = call i32 @foo2()
     28   store i32 %res, i32* %loc
     29   br label %loop
     30 }
     31 
     32 define void @test2(i32* noalias %loc, i32* noalias %loc2) {
     33 ; CHECK-LABEL: @test2
     34 ; CHECK: @bar
     35 ; CHECK-LABEL: loop:
     36   br label %loop
     37 
     38 loop:
     39   %res = call i32 @bar(i32* %loc2)
     40   store i32 %res, i32* %loc
     41   br label %loop
     42 }
     43 
     44 ; Negative test: %might clobber gep
     45 define void @test3(i32* %loc) {
     46 ; CHECK-LABEL: @test3
     47 ; CHECK-LABEL: loop:
     48 ; CHECK: @bar
     49   br label %loop
     50 
     51 loop:
     52   %res = call i32 @bar(i32* %loc)
     53   %gep = getelementptr i32, i32 *%loc, i64 1000000
     54   store i32 %res, i32* %gep
     55   br label %loop
     56 }
     57 
     58 
     59 ; Negative test: %loc might alias %loc2
     60 define void @test4(i32* %loc, i32* %loc2) {
     61 ; CHECK-LABEL: @test4
     62 ; CHECK-LABEL: loop:
     63 ; CHECK: @bar
     64   br label %loop
     65 
     66 loop:
     67   %res = call i32 @bar(i32* %loc2)
     68   store i32 %res, i32* %loc
     69   br label %loop
     70 }
     71