1*9880d681SAndroid Build Coastguard Worker; RUN: opt -basicaa -lint -disable-output < %s 2>&1 | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare fastcc void @bar() 5*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.stackrestore(i8*) 6*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind 7*9880d681SAndroid Build Coastguard Workerdeclare void @has_sret(i8* sret %p) 8*9880d681SAndroid Build Coastguard Workerdeclare void @has_noaliases(i32* noalias %p, i32* %q) 9*9880d681SAndroid Build Coastguard Workerdeclare void @one_arg(i32) 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker@CG = constant i32 7 12*9880d681SAndroid Build Coastguard Worker@E = external global i8 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @foo() noreturn { 15*9880d681SAndroid Build Coastguard Worker %buf = alloca i8 16*9880d681SAndroid Build Coastguard Worker %buf2 = alloca {i8, i8}, align 2 17*9880d681SAndroid Build Coastguard Worker; CHECK: Caller and callee calling convention differ 18*9880d681SAndroid Build Coastguard Worker call void @bar() 19*9880d681SAndroid Build Coastguard Worker; CHECK: Null pointer dereference 20*9880d681SAndroid Build Coastguard Worker store i32 0, i32* null 21*9880d681SAndroid Build Coastguard Worker; CHECK: Null pointer dereference 22*9880d681SAndroid Build Coastguard Worker %t = load i32, i32* null 23*9880d681SAndroid Build Coastguard Worker; CHECK: Undef pointer dereference 24*9880d681SAndroid Build Coastguard Worker store i32 0, i32* undef 25*9880d681SAndroid Build Coastguard Worker; CHECK: Undef pointer dereference 26*9880d681SAndroid Build Coastguard Worker %u = load i32, i32* undef 27*9880d681SAndroid Build Coastguard Worker; CHECK: All-ones pointer dereference 28*9880d681SAndroid Build Coastguard Worker store i32 0, i32* inttoptr (i64 -1 to i32*) 29*9880d681SAndroid Build Coastguard Worker; CHECK: Address one pointer dereference 30*9880d681SAndroid Build Coastguard Worker store i32 0, i32* inttoptr (i64 1 to i32*) 31*9880d681SAndroid Build Coastguard Worker; CHECK: Memory reference address is misaligned 32*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %buf, align 2 33*9880d681SAndroid Build Coastguard Worker; CHECK: Memory reference address is misaligned 34*9880d681SAndroid Build Coastguard Worker %gep = getelementptr {i8, i8}, {i8, i8}* %buf2, i32 0, i32 1 35*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %gep, align 2 36*9880d681SAndroid Build Coastguard Worker; CHECK: Division by zero 37*9880d681SAndroid Build Coastguard Worker %sd = sdiv i32 2, 0 38*9880d681SAndroid Build Coastguard Worker; CHECK: Division by zero 39*9880d681SAndroid Build Coastguard Worker %ud = udiv i32 2, 0 40*9880d681SAndroid Build Coastguard Worker; CHECK: Division by zero 41*9880d681SAndroid Build Coastguard Worker %sr = srem i32 2, 0 42*9880d681SAndroid Build Coastguard Worker; CHECK: Division by zero 43*9880d681SAndroid Build Coastguard Worker %ur = urem i32 2, 0 44*9880d681SAndroid Build Coastguard Worker; CHECK: extractelement index out of range 45*9880d681SAndroid Build Coastguard Worker %ee = extractelement <4 x i32> zeroinitializer, i32 4 46*9880d681SAndroid Build Coastguard Worker; CHECK: insertelement index out of range 47*9880d681SAndroid Build Coastguard Worker %ie = insertelement <4 x i32> zeroinitializer, i32 0, i32 4 48*9880d681SAndroid Build Coastguard Worker; CHECK: Shift count out of range 49*9880d681SAndroid Build Coastguard Worker %r = lshr i32 0, 32 50*9880d681SAndroid Build Coastguard Worker; CHECK: Shift count out of range 51*9880d681SAndroid Build Coastguard Worker %q = ashr i32 0, 32 52*9880d681SAndroid Build Coastguard Worker; CHECK: Shift count out of range 53*9880d681SAndroid Build Coastguard Worker %l = shl i32 0, 32 54*9880d681SAndroid Build Coastguard Worker; CHECK: xor(undef, undef) 55*9880d681SAndroid Build Coastguard Worker %xx = xor i32 undef, undef 56*9880d681SAndroid Build Coastguard Worker; CHECK: sub(undef, undef) 57*9880d681SAndroid Build Coastguard Worker %xs = sub i32 undef, undef 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK: Write to read-only memory 60*9880d681SAndroid Build Coastguard Worker store i32 8, i32* @CG 61*9880d681SAndroid Build Coastguard Worker; CHECK: Write to text section 62*9880d681SAndroid Build Coastguard Worker store i32 8, i32* bitcast (i32()* @foo to i32*) 63*9880d681SAndroid Build Coastguard Worker; CHECK: Load from block address 64*9880d681SAndroid Build Coastguard Worker %lb = load i32, i32* bitcast (i8* blockaddress(@foo, %next) to i32*) 65*9880d681SAndroid Build Coastguard Worker; CHECK: Call to block address 66*9880d681SAndroid Build Coastguard Worker call void() bitcast (i8* blockaddress(@foo, %next) to void()*)() 67*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Null pointer dereference 68*9880d681SAndroid Build Coastguard Worker call void @llvm.stackrestore(i8* null) 69*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Null pointer dereference 70*9880d681SAndroid Build Coastguard Worker call void @has_sret(i8* null) 71*9880d681SAndroid Build Coastguard Worker; CHECK: Unusual: noalias argument aliases another argument 72*9880d681SAndroid Build Coastguard Worker call void @has_noaliases(i32* @CG, i32* @CG) 73*9880d681SAndroid Build Coastguard Worker; CHECK: Call argument count mismatches callee argument count 74*9880d681SAndroid Build Coastguard Worker call void (i32, i32) bitcast (void (i32)* @one_arg to void (i32, i32)*)(i32 0, i32 0) 75*9880d681SAndroid Build Coastguard Worker; CHECK: Call argument count mismatches callee argument count 76*9880d681SAndroid Build Coastguard Worker call void () bitcast (void (i32)* @one_arg to void ()*)() 77*9880d681SAndroid Build Coastguard Worker; CHECK: Call argument type mismatches callee parameter type 78*9880d681SAndroid Build Coastguard Worker call void (float) bitcast (void (i32)* @one_arg to void (float)*)(float 0.0) 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK: Write to read-only memory 81*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i32 1, i1 0) 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Buffer overflow 84*9880d681SAndroid Build Coastguard Worker %wider = bitcast i8* %buf to i16* 85*9880d681SAndroid Build Coastguard Worker store i16 0, i16* %wider 86*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Buffer overflow 87*9880d681SAndroid Build Coastguard Worker %inner = getelementptr {i8, i8}, {i8, i8}* %buf2, i32 0, i32 1 88*9880d681SAndroid Build Coastguard Worker %wider2 = bitcast i8* %inner to i16* 89*9880d681SAndroid Build Coastguard Worker store i16 0, i16* %wider2 90*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Buffer overflow 91*9880d681SAndroid Build Coastguard Worker %before = getelementptr i8, i8* %buf, i32 -1 92*9880d681SAndroid Build Coastguard Worker %wider3 = bitcast i8* %before to i16* 93*9880d681SAndroid Build Coastguard Worker store i16 0, i16* %wider3 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker br label %next 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workernext: 98*9880d681SAndroid Build Coastguard Worker; CHECK: Static alloca outside of entry block 99*9880d681SAndroid Build Coastguard Worker %a = alloca i32 100*9880d681SAndroid Build Coastguard Worker; CHECK: Return statement in function with noreturn attribute 101*9880d681SAndroid Build Coastguard Worker ret i32 0 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerfoo: 104*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: Undefined behavior: Buffer overflow 105*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: Memory reference address is misaligned 106*9880d681SAndroid Build Coastguard Worker %e = bitcast i8* @E to i64* 107*9880d681SAndroid Build Coastguard Worker store i64 0, i64* %e 108*9880d681SAndroid Build Coastguard Worker %z = add i32 0, 0 109*9880d681SAndroid Build Coastguard Worker; CHECK: unreachable immediately preceded by instruction without side effects 110*9880d681SAndroid Build Coastguard Worker unreachable 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; CHECK: Unnamed function with non-local linkage 114*9880d681SAndroid Build Coastguard Workerdefine void @0() nounwind { 115*9880d681SAndroid Build Coastguard Worker ret void 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; CHECK: va_start called in a non-varargs function 119*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_start(i8*) 120*9880d681SAndroid Build Coastguard Workerdefine void @not_vararg(i8* %p) nounwind { 121*9880d681SAndroid Build Coastguard Worker call void @llvm.va_start(i8* %p) 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Branch to non-blockaddress 126*9880d681SAndroid Build Coastguard Workerdefine void @use_indbr() { 127*9880d681SAndroid Build Coastguard Worker indirectbr i8* bitcast (i32()* @foo to i8*), [label %block] 128*9880d681SAndroid Build Coastguard Workerblock: 129*9880d681SAndroid Build Coastguard Worker unreachable 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Call with "tail" keyword references alloca 133*9880d681SAndroid Build Coastguard Workerdeclare void @tailcallee(i8*) 134*9880d681SAndroid Build Coastguard Workerdefine void @use_tail(i8* %valist) { 135*9880d681SAndroid Build Coastguard Worker %t = alloca i8 136*9880d681SAndroid Build Coastguard Worker tail call void @tailcallee(i8* %t) 137*9880d681SAndroid Build Coastguard Worker ret void 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; CHECK: Unusual: Returning alloca value 141*9880d681SAndroid Build Coastguard Workerdefine i8* @return_local(i32 %n, i32 %m) { 142*9880d681SAndroid Build Coastguard Worker %t = alloca i8, i32 %n 143*9880d681SAndroid Build Coastguard Worker %s = getelementptr i8, i8* %t, i32 %m 144*9880d681SAndroid Build Coastguard Worker ret i8* %s 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; CHECK: Unusual: Returning alloca value 148*9880d681SAndroid Build Coastguard Workerdefine i32* @return_obscured_local() { 149*9880d681SAndroid Build Coastguard Workerentry: 150*9880d681SAndroid Build Coastguard Worker %retval = alloca i32* 151*9880d681SAndroid Build Coastguard Worker %x = alloca i32 152*9880d681SAndroid Build Coastguard Worker store i32* %x, i32** %retval 153*9880d681SAndroid Build Coastguard Worker br label %next 154*9880d681SAndroid Build Coastguard Workernext: 155*9880d681SAndroid Build Coastguard Worker %t0 = load i32*, i32** %retval 156*9880d681SAndroid Build Coastguard Worker %t1 = insertvalue { i32, i32, i32* } zeroinitializer, i32* %t0, 2 157*9880d681SAndroid Build Coastguard Worker %t2 = extractvalue { i32, i32, i32* } %t1, 2 158*9880d681SAndroid Build Coastguard Worker br label %exit 159*9880d681SAndroid Build Coastguard Workerexit: 160*9880d681SAndroid Build Coastguard Worker %t3 = phi i32* [ %t2, %next ] 161*9880d681SAndroid Build Coastguard Worker %t4 = bitcast i32* %t3 to i32* 162*9880d681SAndroid Build Coastguard Worker %t5 = ptrtoint i32* %t4 to i64 163*9880d681SAndroid Build Coastguard Worker %t6 = add i64 %t5, 0 164*9880d681SAndroid Build Coastguard Worker %t7 = inttoptr i64 %t6 to i32* 165*9880d681SAndroid Build Coastguard Worker ret i32* %t7 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; CHECK: Undefined behavior: Undef pointer dereference 169*9880d681SAndroid Build Coastguard Workerdefine i32* @self_reference() { 170*9880d681SAndroid Build Coastguard Workerentry: 171*9880d681SAndroid Build Coastguard Worker unreachable 172*9880d681SAndroid Build Coastguard Workerexit: 173*9880d681SAndroid Build Coastguard Worker %t3 = phi i32* [ %t4, %exit ] 174*9880d681SAndroid Build Coastguard Worker %t4 = bitcast i32* %t3 to i32* 175*9880d681SAndroid Build Coastguard Worker %x = load volatile i32, i32* %t3 176*9880d681SAndroid Build Coastguard Worker br label %exit 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; CHECK: Call return type mismatches callee return type 180*9880d681SAndroid Build Coastguard Worker%struct = type { double, double } 181*9880d681SAndroid Build Coastguard Workerdeclare i32 @nonstruct_callee() nounwind 182*9880d681SAndroid Build Coastguard Workerdefine void @struct_caller() nounwind { 183*9880d681SAndroid Build Coastguard Workerentry: 184*9880d681SAndroid Build Coastguard Worker call %struct bitcast (i32 ()* @foo to %struct ()*)() 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker ; CHECK: Undefined behavior: indirectbr with no destinations 187*9880d681SAndroid Build Coastguard Worker indirectbr i8* null, [] 188*9880d681SAndroid Build Coastguard Worker} 189