1; RUN: opt < %s -aa-pipeline=basic-aa -passes=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; Two PHIs in the same block. 6; CHECK-LABEL: Function: foo 7; CHECK: NoAlias: double* %a, double* %b 8define void @foo(i1 %m, ptr noalias %x, ptr noalias %y) { 9entry: 10 br i1 %m, label %true, label %false 11 12true: 13 br label %exit 14 15false: 16 br label %exit 17 18exit: 19 %a = phi ptr [ %x, %true ], [ %y, %false ] 20 %b = phi ptr [ %x, %false ], [ %y, %true ] 21 store volatile double 0.0, ptr %a 22 store volatile double 1.0, ptr %b 23 ret void 24} 25 26; Two selects with the same condition. 27; CHECK-LABEL: Function: bar 28; CHECK: NoAlias: double* %a, double* %b 29define void @bar(i1 %m, ptr noalias %x, ptr noalias %y) { 30entry: 31 %a = select i1 %m, ptr %x, ptr %y 32 %b = select i1 %m, ptr %y, ptr %x 33 store volatile double 0.000000e+00, ptr %a 34 store volatile double 1.000000e+00, ptr %b 35 ret void 36} 37 38; Two PHIs with disjoint sets of inputs. 39; CHECK-LABEL: Function: qux 40; CHECK: NoAlias: double* %a, double* %b 41define void @qux(i1 %m, ptr noalias %x, ptr noalias %y, 42 i1 %n, ptr noalias %v, ptr noalias %w) { 43entry: 44 br i1 %m, label %true, label %false 45 46true: 47 br label %exit 48 49false: 50 br label %exit 51 52exit: 53 %a = phi ptr [ %x, %true ], [ %y, %false ] 54 br i1 %n, label %ntrue, label %nfalse 55 56ntrue: 57 br label %nexit 58 59nfalse: 60 br label %nexit 61 62nexit: 63 %b = phi ptr [ %v, %ntrue ], [ %w, %nfalse ] 64 store volatile double 0.0, ptr %a 65 store volatile double 1.0, ptr %b 66 ret void 67} 68 69; Two selects with disjoint sets of arms. 70; CHECK-LABEL: Function: fin 71; CHECK: NoAlias: double* %a, double* %b 72define void @fin(i1 %m, ptr noalias %x, ptr noalias %y, 73 i1 %n, ptr noalias %v, ptr noalias %w) { 74entry: 75 %a = select i1 %m, ptr %x, ptr %y 76 %b = select i1 %n, ptr %v, ptr %w 77 store volatile double 0.000000e+00, ptr %a 78 store volatile double 1.000000e+00, ptr %b 79 ret void 80} 81 82; On the first iteration, sel1 = a1, sel2 = a2, phi = a3 83; On the second iteration, sel1 = a2, sel1 = a1, phi = a2 84; As such, sel1 and phi may alias. 85; CHECK-LABEL: Function: select_backedge 86; CHECK: NoAlias: i32* %sel1, i32* %sel2 87; CHECK: MayAlias: i32* %phi, i32* %sel1 88; CHECK: MayAlias: i32* %phi, i32* %sel2 89define void @select_backedge() { 90entry: 91 %a1 = alloca i32 92 %a2 = alloca i32 93 %a3 = alloca i32 94 br label %loop 95 96loop: 97 %phi = phi ptr [ %a3, %entry ], [ %sel2, %loop ] 98 %c = phi i1 [ true, %entry ], [ false, %loop ] 99 %sel1 = select i1 %c, ptr %a1, ptr %a2 100 %sel2 = select i1 %c, ptr %a2, ptr %a1 101 load i32, ptr %sel1 102 load i32, ptr %sel2 103 load i32, ptr %phi 104 br label %loop 105} 106