From 074561a4a22f610d756109170285d8626c4cc3bc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 8 Feb 2022 17:14:41 +0100 Subject: [PATCH] [Mem2Reg] Check that load type matches alloca type Alloca promotion can only deal with cases where the load/store types match the alloca type (it explicitly does not support bitcasted load/stores). With opaque pointers this is no longer enforced through the pointer type, so add an explicit check. --- .../Transforms/Utils/PromoteMemoryToRegister.cpp | 2 +- llvm/test/Transforms/Mem2Reg/opaque-ptr.ll | 25 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Transforms/Mem2Reg/opaque-ptr.ll diff --git a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index 01b433b..8d0d4be 100644 --- a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -68,7 +68,7 @@ bool llvm::isAllocaPromotable(const AllocaInst *AI) { if (const LoadInst *LI = dyn_cast(U)) { // Note that atomic loads can be transformed; atomic semantics do // not have any meaning for a local alloca. - if (LI->isVolatile()) + if (LI->isVolatile() || LI->getType() != AI->getAllocatedType()) return false; } else if (const StoreInst *SI = dyn_cast(U)) { if (SI->getValueOperand() == AI || diff --git a/llvm/test/Transforms/Mem2Reg/opaque-ptr.ll b/llvm/test/Transforms/Mem2Reg/opaque-ptr.ll new file mode 100644 index 0000000..0eec7b6 --- /dev/null +++ b/llvm/test/Transforms/Mem2Reg/opaque-ptr.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -mem2reg -opaque-pointers < %s | FileCheck %s + +define i32 @test_same_type() { +; CHECK-LABEL: @test_same_type( +; CHECK-NEXT: ret i32 0 +; + %p = alloca i32 + store i32 0, ptr %p + %v = load i32, ptr %p + ret i32 %v +} + +define i16 @test_different_type() { +; CHECK-LABEL: @test_different_type( +; CHECK-NEXT: [[P:%.*]] = alloca i32, align 4 +; CHECK-NEXT: store i32 0, ptr [[P]], align 4 +; CHECK-NEXT: [[V:%.*]] = load i16, ptr [[P]], align 2 +; CHECK-NEXT: ret i16 [[V]] +; + %p = alloca i32 + store i32 0, ptr %p + %v = load i16, ptr %p + ret i16 %v +} -- 2.7.4