diff options
-rw-r--r-- | llvm/lib/Transforms/Utils/VNCoercion.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Transforms/GVN/pr28879.ll | 34 |
2 files changed, 41 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/VNCoercion.cpp b/llvm/lib/Transforms/Utils/VNCoercion.cpp index 5f71bdcf597..948d9bd5baa 100644 --- a/llvm/lib/Transforms/Utils/VNCoercion.cpp +++ b/llvm/lib/Transforms/Utils/VNCoercion.cpp @@ -20,8 +20,14 @@ bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy, StoredVal->getType()->isStructTy() || StoredVal->getType()->isArrayTy()) return false; + uint64_t StoreSize = DL.getTypeSizeInBits(StoredVal->getType()); + + // The store size must be byte-aligned to support future type casts. + if (llvm::alignTo(StoreSize, 8) != StoreSize) + return false; + // The store has to be at least as big as the load. - if (DL.getTypeSizeInBits(StoredVal->getType()) < DL.getTypeSizeInBits(LoadTy)) + if (StoreSize < DL.getTypeSizeInBits(LoadTy)) return false; // Don't coerce non-integral pointers to integers or vice versa. diff --git a/llvm/test/Transforms/GVN/pr28879.ll b/llvm/test/Transforms/GVN/pr28879.ll new file mode 100644 index 00000000000..ec09080d980 --- /dev/null +++ b/llvm/test/Transforms/GVN/pr28879.ll @@ -0,0 +1,34 @@ +; RUN: opt -gvn <%s -S -o - | FileCheck %s + +define void @f() { +entry: + %a = alloca <7 x i1>, align 2 + store <7 x i1> undef, <7 x i1>* %a, align 2 +; CHECK: store <7 x i1> undef, <7 x i1>* + %0 = getelementptr inbounds <7 x i1>, <7 x i1>* %a, i64 0, i64 0 + %val = load i1, i1* %0, align 2 +; CHECK: load i1, i1* + br i1 %val, label %cond.true, label %cond.false + +cond.true: + ret void + +cond.false: + ret void +} + +define <7 x i1> @g(<7 x i1>* %a) { +entry: + %vec = load <7 x i1>, <7 x i1>* %a +; CHECK: load <7 x i1>, <7 x i1>* + %0 = getelementptr inbounds <7 x i1>, <7 x i1>* %a, i64 0, i64 0 + %val = load i1, i1* %0, align 2 +; CHECK: load i1, i1* + br i1 %val, label %cond.true, label %cond.false + +cond.true: + ret <7 x i1> %vec + +cond.false: + ret <7 x i1> <i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false> +} |