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