Index: lib/Analysis/Lint.cpp =================================================================== --- lib/Analysis/Lint.cpp +++ lib/Analysis/Lint.cpp @@ -681,9 +681,19 @@ } else if (ConstantExpr *CE = dyn_cast(V)) { // Same as above, but for ConstantExpr instead of Instruction. if (Instruction::isCast(CE->getOpcode())) { + // Fetch the proper IntPtrTy. V/CE might be of non-pointer type so we + // can't always call getIntPtrType() on its return type. + Type *PtrOpTy = nullptr; + if (CE->getOpcode() == Instruction::PtrToInt) + PtrOpTy = CE->getOperand(0)->getType(); + else if (CE->getOpcode() == Instruction::IntToPtr) + PtrOpTy = CE->getType(); + Type *IntPtrTy = PtrOpTy ? DL->getIntPtrType(PtrOpTy) : + DL->getIntPtrType(CE->getContext(), 0); + if (CastInst::isNoopCast(Instruction::CastOps(CE->getOpcode()), CE->getOperand(0)->getType(), CE->getType(), - DL->getIntPtrType(V->getType()))) + IntPtrTy)) return findValueImpl(CE->getOperand(0), OffsetOk, Visited); } else if (CE->getOpcode() == Instruction::ExtractValue) { ArrayRef Indices = CE->getIndices(); Index: test/Analysis/Lint/noop-cast-expr-no-pointer.ll =================================================================== --- /dev/null +++ test/Analysis/Lint/noop-cast-expr-no-pointer.ll @@ -0,0 +1,23 @@ +; RUN: opt -lint < %s + +; lint shouldn't crash on any of the below functions + +@g_1 = external global [3 x i32] +@g_2 = external global [2 x i32] + +define void @test1() { +entry: + tail call void @f1(i16 zext (i1 icmp eq (i32* getelementptr inbounds ([2 x i32], [2 x i32]* @g_2, i64 0, i64 0), i32* getelementptr inbounds ([3 x i32], [3 x i32]* @g_1, i64 0, i64 1)) to i16)) + ret void +} + +declare void @f1(i16) + +define void @test2() { + tail call void inttoptr (i64 sext (i32 ptrtoint (void ()* @f2 to i32) to i64) to void ()*)() + + ret void +} + +declare void @f2() +