Home | History | Annotate | Download | only in BasicAA
      1 ; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
      2 
      3 ; BasicAA should detect NoAliases in PHIs and Selects.
      4 
      5 ; CHECK: Function: foo
      6 ; CHECK:  NoAlias: double* %a, double* %b
      7 ; CHECK: Function: bar
      8 ; CHECK:  NoAlias: double* %a, double* %b
      9 ; CHECK: Function: qux
     10 ; CHECK:  NoAlias: double* %a, double* %b
     11 ; CHECK: Function: fin
     12 ; CHECK:  NoAlias: double* %a, double* %b
     13 ; CHECK: ===== Alias Analysis Evaluator Report =====
     14 
     15 ; Two PHIs in the same block.
     16 define void @foo(i1 %m, double* noalias %x, double* noalias %y) {
     17 entry:
     18   br i1 %m, label %true, label %false
     19 
     20 true:
     21   br label %exit
     22 
     23 false:
     24   br label %exit
     25 
     26 exit:
     27   %a = phi double* [ %x, %true ], [ %y, %false ]
     28   %b = phi double* [ %x, %false ], [ %y, %true ]
     29   store volatile double 0.0, double* %a
     30   store volatile double 1.0, double* %b
     31   ret void
     32 }
     33 
     34 ; Two selects with the same condition.
     35 define void @bar(i1 %m, double* noalias %x, double* noalias %y) {
     36 entry:
     37   %a = select i1 %m, double* %x, double* %y
     38   %b = select i1 %m, double* %y, double* %x
     39   store volatile double 0.000000e+00, double* %a
     40   store volatile double 1.000000e+00, double* %b
     41   ret void
     42 }
     43 
     44 ; Two PHIs with disjoint sets of inputs.
     45 define void @qux(i1 %m, double* noalias %x, double* noalias %y,
     46                  i1 %n, double* noalias %v, double* noalias %w) {
     47 entry:
     48   br i1 %m, label %true, label %false
     49 
     50 true:
     51   br label %exit
     52 
     53 false:
     54   br label %exit
     55 
     56 exit:
     57   %a = phi double* [ %x, %true ], [ %y, %false ]
     58   br i1 %n, label %ntrue, label %nfalse
     59 
     60 ntrue:
     61   br label %nexit
     62 
     63 nfalse:
     64   br label %nexit
     65 
     66 nexit:
     67   %b = phi double* [ %v, %ntrue ], [ %w, %nfalse ]
     68   store volatile double 0.0, double* %a
     69   store volatile double 1.0, double* %b
     70   ret void
     71 }
     72 
     73 ; Two selects with disjoint sets of arms.
     74 define void @fin(i1 %m, double* noalias %x, double* noalias %y,
     75                  i1 %n, double* noalias %v, double* noalias %w) {
     76 entry:
     77   %a = select i1 %m, double* %x, double* %y
     78   %b = select i1 %n, double* %v, double* %w
     79   store volatile double 0.000000e+00, double* %a
     80   store volatile double 1.000000e+00, double* %b
     81   ret void
     82 }
     83