diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp --- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp +++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp @@ -154,7 +154,7 @@ ConstantRange getStaticAllocaSizeRange(const AllocaInst &AI) { const DataLayout &DL = AI.getModule()->getDataLayout(); TypeSize TS = DL.getTypeAllocSize(AI.getAllocatedType()); - unsigned PointerSize = DL.getMaxPointerSizeInBits(); + unsigned PointerSize = DL.getPointerTypeSizeInBits(AI.getType()); // Fallback to empty range for alloca size. ConstantRange R = ConstantRange::getEmpty(PointerSize); if (TS.isScalable()) @@ -752,10 +752,8 @@ KV.second.Calls.clear(); } - uint32_t PointerSize = Copy.begin() - ->first->getParent() - ->getDataLayout() - .getMaxPointerSizeInBits(); + uint32_t PointerSize = + Copy.begin()->first->getParent()->getDataLayout().getPointerSizeInBits(); StackSafetyDataFlowAnalysis SSDFA(PointerSize, std::move(Copy)); for (auto &F : SSDFA.run()) { diff --git a/llvm/test/Analysis/StackSafetyAnalysis/i386-bug-fix.ll b/llvm/test/Analysis/StackSafetyAnalysis/i386-bug-fix.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/StackSafetyAnalysis/i386-bug-fix.ll @@ -0,0 +1,24 @@ +; REQUIRES: i386-pc-linux-gnu + +; RUN: opt passes="print-stack-safety" -disable-output -mtriple=i386-pc-linux-gnu %s 2>&1 | FileCheck %s --check-prefixes=CHECK + +; CHECK: @main +; CHECK-NEXT: args uses: +; CHECK-NEXT: argv[]: empty-set +; CHECK-NEXT: allocas uses: +; CHECK-NEXT: [4]: [0,4) +; CHECK-NEXT: [32]: full-set +; CHECK-NEXT: safe accesses: + +target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128" +target triple = "i386-pc-linux-gnu" + +; Function Attrs: mustprogress norecurse sanitize_address uwtable +define dso_local i32 @main(i32 %argc, i8** %argv) { +entry: + %0 = alloca i32, align 4 + %1 = alloca i8, i64 32, align 32 + %2 = ptrtoint i8* %1 to i32 + store i32 %2, i32* %0, align 4 + ret i32 0 +}