1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s 2@G = global [10 x i32] zeroinitializer, align 4 3 4define void @select_in_gep1(i1 %c, i64 %x) { 5entry: 6; CHECK-LABEL: Function: select_in_gep1 7; CHECK: NoAlias: i32* %arrayidx1, i32* %arrayidx2 8 %add1_ = add nsw i64 %x, 1 9 %add2_ = add nsw i64 %x, 2 10 %select_ = select i1 %c, i64 %add1_, i64 %add2_ 11 %arrayidx1 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select_ 12 store i32 42, ptr %arrayidx1, align 4 13 %arrayidx2 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %x 14 store i32 43, ptr %arrayidx2, align 4 15 ret void 16} 17 18define void @select_in_gep2(i1 %c, i64 %x) { 19entry: 20 ; TODO: should be "NoAlias" here as well. 21; CHECK-LABEL: Function: select_in_gep2 22; CHECK: MayAlias: i32* %arrayidx1, i32* %arrayidx2 23 %add1_ = add nsw i64 %x, 1 24 %add2_ = add nsw i64 %x, 2 25 %add3_ = add nsw i64 %x, 3 26 %select_ = select i1 %c, i64 %add1_, i64 %add2_ 27 %arrayidx1 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select_ 28 store i32 42, ptr %arrayidx1, align 4 29 %arrayidx2 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %add3_ 30 store i32 43, ptr %arrayidx2, align 4 31 ret void 32} 33 34define void @two_selects_in_gep_same_cond(i1 %c, i64 %x) { 35entry: 36; CHECK-LABEL: Function: two_selects_in_gep_same_cond 37; CHECK: NoAlias: i32* %arrayidx1, i32* %arrayidx2 38 %add1_ = add nsw i64 %x, 1 39 %add2_ = add nsw i64 %x, 2 40 %select1_ = select i1 %c, i64 %x, i64 %add1_ 41 %select2_ = select i1 %c, i64 %add2_, i64 %x 42 %arrayidx1 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select1_ 43 store i32 42, ptr %arrayidx1, align 4 44 %arrayidx2 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select2_ 45 store i32 43, ptr %arrayidx2, align 4 46 ret void 47} 48 49define void @two_selects_in_gep_different_cond1(i1 %c1, i1 %c2, i64 %x) { 50entry: 51; CHECK-LABEL: Function: two_selects_in_gep_different_cond1 52; CHECK: NoAlias: i32* %arrayidx1, i32* %arrayidx2 53 %add1_ = add nsw i64 %x, 1 54 %add2_ = add nsw i64 %x, 2 55 %add3_ = add nsw i64 %x, 3 56 %add4_ = add nsw i64 %x, 4 57 %select1_ = select i1 %c1, i64 %add1_, i64 %add2_ 58 %select2_ = select i1 %c2, i64 %add3_, i64 %add4_ 59 %arrayidx1 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select1_ 60 store i32 42, ptr %arrayidx1, align 4 61 %arrayidx2 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select2_ 62 store i32 43, ptr %arrayidx2, align 4 63 ret void 64} 65 66define void @two_selects_in_gep_different_cond2(i1 %c1, i1 %c2, i64 %x) { 67entry: 68; CHECK-LABEL: Function: two_selects_in_gep_different_cond2 69; CHECK: MayAlias: i32* %arrayidx1, i32* %arrayidx2 70 %add1_ = add nsw i64 %x, 1 71 %add2_ = add nsw i64 %x, 2 72 %select1_ = select i1 %c1, i64 %x, i64 %add1_ 73 %select2_ = select i1 %c2, i64 %x, i64 %add2_ 74 %arrayidx1 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select1_ 75 store i32 42, ptr %arrayidx1, align 4 76 %arrayidx2 = getelementptr inbounds [10 x i32], ptr @G, i64 0, i64 %select2_ 77 store i32 43, ptr %arrayidx2, align 4 78 ret void 79} 80