1*9880d681SAndroid Build Coastguard Worker; Makes sure that we give up on some pathological cases with inttoptr/ptrtoint 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; @ptr_test was generated from the following C code: 4*9880d681SAndroid Build Coastguard Worker; void ptr_test() { 5*9880d681SAndroid Build Coastguard Worker; int* A; 6*9880d681SAndroid Build Coastguard Worker; unsigned long RefCopy = 0; 7*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 8*sizeof(&A); ++i) { 8*9880d681SAndroid Build Coastguard Worker; if ((unsigned long)&A & (1UL << i)) 9*9880d681SAndroid Build Coastguard Worker; RefCopy |= 1UL << i; 10*9880d681SAndroid Build Coastguard Worker; } 11*9880d681SAndroid Build Coastguard Worker; 12*9880d681SAndroid Build Coastguard Worker; int** AliasA1 = (int**)RefCopy; 13*9880d681SAndroid Build Coastguard Worker; int* ShouldAliasA = *AliasA1; 14*9880d681SAndroid Build Coastguard Worker; } 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -disable-basicaa -cfl-steens-aa -aa-eval -print-may-aliases -disable-output 2>&1 | FileCheck %s 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; CHECK: Function: ptr_test 19*9880d681SAndroid Build Coastguard Workerdefine void @ptr_test() #0 { 20*9880d681SAndroid Build Coastguard Worker ; CHECK: MayAlias: i32** %A, i32** %ShouldAliasA 21*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: %AliasA1 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker %A = alloca i32*, align 8 24*9880d681SAndroid Build Coastguard Worker %RefCopy = alloca i64, align 8 25*9880d681SAndroid Build Coastguard Worker %i = alloca i32, align 4 26*9880d681SAndroid Build Coastguard Worker %AliasA1 = alloca i32**, align 8 27*9880d681SAndroid Build Coastguard Worker %ShouldAliasA = alloca i32*, align 8 28*9880d681SAndroid Build Coastguard Worker store i64 0, i64* %RefCopy, align 8 29*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %i, align 4 30*9880d681SAndroid Build Coastguard Worker br label %for.cond 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %for.inc, %entry 33*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %i, align 4 34*9880d681SAndroid Build Coastguard Worker %conv = sext i32 %0 to i64 35*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i64 %conv, 64 36*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.cond 39*9880d681SAndroid Build Coastguard Worker %1 = ptrtoint i32** %A to i64 40*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* %i, align 4 41*9880d681SAndroid Build Coastguard Worker %sh_prom = zext i32 %2 to i64 42*9880d681SAndroid Build Coastguard Worker %shl = shl i64 1, %sh_prom 43*9880d681SAndroid Build Coastguard Worker %and = and i64 %1, %shl 44*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i64 %and, 0 45*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %if.end 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %for.body 48*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* %i, align 4 49*9880d681SAndroid Build Coastguard Worker %sh_prom2 = zext i32 %3 to i64 50*9880d681SAndroid Build Coastguard Worker %shl3 = shl i64 1, %sh_prom2 51*9880d681SAndroid Build Coastguard Worker %4 = load i64, i64* %RefCopy, align 8 52*9880d681SAndroid Build Coastguard Worker %or = or i64 %4, %shl3 53*9880d681SAndroid Build Coastguard Worker store i64 %or, i64* %RefCopy, align 8 54*9880d681SAndroid Build Coastguard Worker br label %if.end 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %for.body 57*9880d681SAndroid Build Coastguard Worker br label %for.inc 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %if.end 60*9880d681SAndroid Build Coastguard Worker %5 = load i32, i32* %i, align 4 61*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %5, 1 62*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %i, align 4 63*9880d681SAndroid Build Coastguard Worker br label %for.cond 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.cond 66*9880d681SAndroid Build Coastguard Worker %6 = load i64, i64* %RefCopy, align 8 67*9880d681SAndroid Build Coastguard Worker %7 = inttoptr i64 %6 to i32** 68*9880d681SAndroid Build Coastguard Worker store i32** %7, i32*** %AliasA1, align 8 69*9880d681SAndroid Build Coastguard Worker %8 = load i32**, i32*** %AliasA1, align 8 70*9880d681SAndroid Build Coastguard Worker %9 = load i32*, i32** %8, align 8 71*9880d681SAndroid Build Coastguard Worker store i32* %9, i32** %ShouldAliasA, align 8 72*9880d681SAndroid Build Coastguard Worker ret void 73*9880d681SAndroid Build Coastguard Worker} 74