[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