[llvm] f063410 - [Analysis] isDereferenceableAndAlignedPointer(): don't crash on `bitcast <1 x ???*> to ???*`
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 27 08:31:48 PDT 2020
Author: Roman Lebedev
Date: 2020-06-27T18:30:59+03:00
New Revision: f0634100cdc832605bff355330d2ccdb7f43842f
URL: https://github.com/llvm/llvm-project/commit/f0634100cdc832605bff355330d2ccdb7f43842f
DIFF: https://github.com/llvm/llvm-project/commit/f0634100cdc832605bff355330d2ccdb7f43842f.diff
LOG: [Analysis] isDereferenceableAndAlignedPointer(): don't crash on `bitcast <1 x ???*> to ???*`
Added:
llvm/test/Transforms/SimplifyCFG/1elt-ptr-vec-alignment-crash.ll
Modified:
llvm/lib/Analysis/Loads.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp
index e138f194ab3e..e5245225d905 100644
--- a/llvm/lib/Analysis/Loads.cpp
+++ b/llvm/lib/Analysis/Loads.cpp
@@ -41,6 +41,7 @@ static bool isDereferenceableAndAlignedPointer(
const Value *V, Align Alignment, const APInt &Size, const DataLayout &DL,
const Instruction *CtxI, const DominatorTree *DT,
SmallPtrSetImpl<const Value *> &Visited, unsigned MaxDepth) {
+ assert(V->getType()->isPointerTy() && "Base must be pointer");
// Recursion limit.
if (MaxDepth-- == 0)
@@ -54,10 +55,11 @@ static bool isDereferenceableAndAlignedPointer(
// malloc may return null.
// bitcast instructions are no-ops as far as dereferenceability is concerned.
- if (const BitCastOperator *BC = dyn_cast<BitCastOperator>(V))
- return isDereferenceableAndAlignedPointer(BC->getOperand(0), Alignment,
- Size, DL, CtxI, DT, Visited,
- MaxDepth);
+ if (const BitCastOperator *BC = dyn_cast<BitCastOperator>(V)) {
+ if (BC->getSrcTy()->isPointerTy())
+ return isDereferenceableAndAlignedPointer(
+ BC->getOperand(0), Alignment, Size, DL, CtxI, DT, Visited, MaxDepth);
+ }
bool CheckForNonNull = false;
APInt KnownDerefBytes(Size.getBitWidth(),
diff --git a/llvm/test/Transforms/SimplifyCFG/1elt-ptr-vec-alignment-crash.ll b/llvm/test/Transforms/SimplifyCFG/1elt-ptr-vec-alignment-crash.ll
new file mode 100644
index 000000000000..360fd0079cd1
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/1elt-ptr-vec-alignment-crash.ll
@@ -0,0 +1,26 @@
+; RUN: opt -passes=simplify-cfg -S < %s | FileCheck %s
+
+; Ensure that we do not crash when trying to evaluate alignment of a <1 x ???*>.
+
+%struct.ap = type { i8 }
+%"struct.z::ai" = type { i32 }
+
+ at x = external dso_local local_unnamed_addr global i32, align 4
+
+define dso_local void @_ZN2ap2aqEv(%struct.ap* %this, i1 %c, i32 %v2) {
+; CHECK-LABEL: @_ZN2ap2aqEv(
+_ZN1yIN1z2aiE2aaIS1_EE2ahEv.exit:
+ br i1 %c, label %if.end, label %land.rhs
+
+land.rhs: ; preds = %_ZN1yIN1z2aiE2aaIS1_EE2ahEv.exit
+ %0 = bitcast <1 x %"struct.z::ai"*> zeroinitializer to %"struct.z::ai"*
+ %retval.sroa.0.0..sroa_idx.i = getelementptr inbounds %"struct.z::ai", %"struct.z::ai"* %0, i64 0, i32 0
+ %retval.sroa.0.0.copyload.i = load i32, i32* %retval.sroa.0.0..sroa_idx.i, align 4
+ %tobool5 = icmp eq i32 %retval.sroa.0.0.copyload.i, 0
+ %spec.select = select i1 %tobool5, i32 %v2, i32 0
+ br label %if.end
+
+if.end: ; preds = %land.rhs, %_ZN1yIN1z2aiE2aaIS1_EE2ahEv.exit
+ %b.0 = phi i32 [ %spec.select, %land.rhs ], [ 0, %_ZN1yIN1z2aiE2aaIS1_EE2ahEv.exit ]
+ ret void
+}
More information about the llvm-commits
mailing list