aboutsummaryrefslogtreecommitdiffstats
path: root/main/llvm/llvm-3.8.0-fix-unpack-load.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/llvm/llvm-3.8.0-fix-unpack-load.patch')
-rw-r--r--main/llvm/llvm-3.8.0-fix-unpack-load.patch150
1 files changed, 0 insertions, 150 deletions
diff --git a/main/llvm/llvm-3.8.0-fix-unpack-load.patch b/main/llvm/llvm-3.8.0-fix-unpack-load.patch
deleted file mode 100644
index 8fcc54bcbb..0000000000
--- a/main/llvm/llvm-3.8.0-fix-unpack-load.patch
+++ /dev/null
@@ -1,150 +0,0 @@
-From 92c0b571a3a7420bdc3dfad72b4c75dde725d9a9 Mon Sep 17 00:00:00 2001
-From: Amaury Sechet <deadalnix@gmail.com>
-Date: Wed, 17 Feb 2016 19:21:28 +0000
-Subject: [PATCH] Fix load alignement when unpacking aggregates structs
-
-Summary: Store and loads unpacked by instcombine do not always have the right alignement. This explicitely compute the alignement and set it.
-
-Reviewers: dblaikie, majnemer, reames, hfinkel, joker.eph
-
-Subscribers: llvm-commits
-
-Differential Revision: http://reviews.llvm.org/D17326
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261139 91177308-0d34-0410-b5e6-96231b3b80d8
----
- .../InstCombine/InstCombineLoadStoreAlloca.cpp | 38 +++++++++++++++-------
- test/Transforms/InstCombine/unpack-fca.ll | 27 +++++++++++++++
- 2 files changed, 53 insertions(+), 12 deletions(-)
-
-diff --git a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
-index dd2889d..4d42658 100644
---- a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
-+++ b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
-@@ -523,16 +523,17 @@ static Instruction *unpackLoadToAggregate(InstCombiner &IC, LoadInst &LI) {
- if (!T->isAggregateType())
- return nullptr;
-
-+ auto Name = LI.getName();
- assert(LI.getAlignment() && "Alignment must be set at this point");
-
- if (auto *ST = dyn_cast<StructType>(T)) {
- // If the struct only have one element, we unpack.
-- unsigned Count = ST->getNumElements();
-- if (Count == 1) {
-+ auto NumElements = ST->getNumElements();
-+ if (NumElements == 1) {
- LoadInst *NewLoad = combineLoadToNewType(IC, LI, ST->getTypeAtIndex(0U),
- ".unpack");
- return IC.ReplaceInstUsesWith(LI, IC.Builder->CreateInsertValue(
-- UndefValue::get(T), NewLoad, 0, LI.getName()));
-+ UndefValue::get(T), NewLoad, 0, Name));
- }
-
- // We don't want to break loads with padding here as we'd loose
-@@ -542,23 +543,29 @@ static Instruction *unpackLoadToAggregate(InstCombiner &IC, LoadInst &LI) {
- if (SL->hasPadding())
- return nullptr;
-
-- auto Name = LI.getName();
-+ auto Align = LI.getAlignment();
-+ if (!Align)
-+ Align = DL.getABITypeAlignment(ST);
-+
- SmallString<16> LoadName = Name;
- LoadName += ".unpack";
- SmallString<16> EltName = Name;
- EltName += ".elt";
-+
- auto *Addr = LI.getPointerOperand();
-- Value *V = UndefValue::get(T);
-- auto *IdxType = Type::getInt32Ty(ST->getContext());
-+ auto *IdxType = Type::getInt32Ty(T->getContext());
- auto *Zero = ConstantInt::get(IdxType, 0);
-- for (unsigned i = 0; i < Count; i++) {
-+
-+ Value *V = UndefValue::get(T);
-+ for (unsigned i = 0; i < NumElements; i++) {
- Value *Indices[2] = {
- Zero,
- ConstantInt::get(IdxType, i),
- };
-- auto *Ptr = IC.Builder->CreateInBoundsGEP(ST, Addr, makeArrayRef(Indices), EltName);
-- auto *L = IC.Builder->CreateAlignedLoad(Ptr, LI.getAlignment(),
-- LoadName);
-+ auto *Ptr = IC.Builder->CreateInBoundsGEP(ST, Addr,
-+ makeArrayRef(Indices), EltName);
-+ auto EltAlign = MinAlign(Align, SL->getElementOffset(i));
-+ auto *L = IC.Builder->CreateAlignedLoad(Ptr, EltAlign, LoadName);
- V = IC.Builder->CreateInsertValue(V, L, i);
- }
-
-@@ -950,11 +957,16 @@ static bool unpackStoreToAggregate(InstCombiner &IC, StoreInst &SI) {
- if (SL->hasPadding())
- return false;
-
-+ auto Align = SI.getAlignment();
-+ if (!Align)
-+ Align = DL.getABITypeAlignment(ST);
-+
- SmallString<16> EltName = V->getName();
- EltName += ".elt";
- auto *Addr = SI.getPointerOperand();
- SmallString<16> AddrName = Addr->getName();
- AddrName += ".repack";
-+
- auto *IdxType = Type::getInt32Ty(ST->getContext());
- auto *Zero = ConstantInt::get(IdxType, 0);
- for (unsigned i = 0; i < Count; i++) {
-@@ -962,9 +974,11 @@ static bool unpackStoreToAggregate(InstCombiner &IC, StoreInst &SI) {
- Zero,
- ConstantInt::get(IdxType, i),
- };
-- auto *Ptr = IC.Builder->CreateInBoundsGEP(ST, Addr, makeArrayRef(Indices), AddrName);
-+ auto *Ptr = IC.Builder->CreateInBoundsGEP(ST, Addr,
-+ makeArrayRef(Indices), AddrName);
- auto *Val = IC.Builder->CreateExtractValue(V, i, EltName);
-- IC.Builder->CreateStore(Val, Ptr);
-+ auto EltAlign = MinAlign(Align, SL->getElementOffset(i));
-+ IC.Builder->CreateAlignedStore(Val, Ptr, EltAlign);
- }
-
- return true;
-diff --git a/test/Transforms/InstCombine/unpack-fca.ll b/test/Transforms/InstCombine/unpack-fca.ll
-index 4359839..bed3b61 100644
---- a/test/Transforms/InstCombine/unpack-fca.ll
-+++ b/test/Transforms/InstCombine/unpack-fca.ll
-@@ -151,3 +151,30 @@ define i32 @packed_alignment(%struct.S* dereferenceable(9) %s) {
- %v = extractvalue %struct.T %tv, 1
- ret i32 %v
- }
-+
-+%struct.U = type {i8, i8, i8, i8, i8, i8, i8, i8, i64}
-+
-+define void @check_alignment(%struct.U* %u, %struct.U* %v) {
-+; CHECK-LABEL: check_alignment
-+; CHECK: load i8, i8* {{.*}}, align 8
-+; CHECK: load i8, i8* {{.*}}, align 1
-+; CHECK: load i8, i8* {{.*}}, align 2
-+; CHECK: load i8, i8* {{.*}}, align 1
-+; CHECK: load i8, i8* {{.*}}, align 4
-+; CHECK: load i8, i8* {{.*}}, align 1
-+; CHECK: load i8, i8* {{.*}}, align 2
-+; CHECK: load i8, i8* {{.*}}, align 1
-+; CHECK: load i64, i64* {{.*}}, align 8
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 8
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 1
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 2
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 1
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 4
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 1
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 2
-+; CHECK: store i8 {{.*}}, i8* {{.*}}, align 1
-+; CHECK: store i64 {{.*}}, i64* {{.*}}, align 8
-+ %1 = load %struct.U, %struct.U* %u
-+ store %struct.U %1, %struct.U* %v
-+ ret void
-+}
---
-2.8.2
-