Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit 7dfcb84

Browse files
committed
Fix for a regression caused by the LoopVectorizer when
vectorizing loops with memory accesses to non-zero address spaces. It simply dropped the AS info. Fixes PR16306. Merged from r184103 Author: Pekka Jaaskelainen <[email protected]> Date: Mon Jun 17 18:49:06 2013 +0000 git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_33@185869 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent c4a2469 commit 7dfcb84

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr,
964964
Type *DataTy = VectorType::get(ScalarDataTy, VF);
965965
Value *Ptr = LI ? LI->getPointerOperand() : SI->getPointerOperand();
966966
unsigned Alignment = LI ? LI->getAlignment() : SI->getAlignment();
967-
967+
unsigned AddressSpace = Ptr->getType()->getPointerAddressSpace();
968968
unsigned ScalarAllocatedSize = DL->getTypeAllocSize(ScalarDataTy);
969969
unsigned VectorElementSize = DL->getTypeStoreSize(DataTy)/VF;
970970

@@ -1039,7 +1039,7 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr,
10391039
PartPtr = Builder.CreateGEP(PartPtr, Builder.getInt32(1 - VF));
10401040
}
10411041

1042-
Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo());
1042+
Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo(AddressSpace));
10431043
Builder.CreateStore(StoredVal[Part], VecPtr)->setAlignment(Alignment);
10441044
}
10451045
}
@@ -1055,7 +1055,7 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr,
10551055
PartPtr = Builder.CreateGEP(PartPtr, Builder.getInt32(1 - VF));
10561056
}
10571057

1058-
Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo());
1058+
Value *VecPtr = Builder.CreateBitCast(PartPtr, DataTy->getPointerTo(AddressSpace));
10591059
Value *LI = Builder.CreateLoad(VecPtr, "wide.load");
10601060
cast<LoadInst>(LI)->setAlignment(Alignment);
10611061
Entry[Part] = Reverse ? reverseVector(LI) : LI;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
2+
3+
; From a simple program with two address spaces:
4+
; char Y[4*10000] __attribute__((address_space(1)));
5+
; char X[4*10000];
6+
; int main() {
7+
; for (int i = 0; i < 4*10000; ++i)
8+
; X[i] = Y[i] + 1;
9+
; return 0;
10+
;}
11+
12+
13+
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
14+
target triple = "x86_64-unknown-linux-gnu"
15+
16+
@Y = common addrspace(1) global [40000 x i8] zeroinitializer, align 16
17+
@X = common global [40000 x i8] zeroinitializer, align 16
18+
19+
;CHECK: @main
20+
;CHECK: bitcast i8 addrspace(1)* %{{.*}} to <4 x i8> addrspace(1)*
21+
;CHECK: bitcast i8* %{{.*}} to <4 x i8>*
22+
23+
; Function Attrs: nounwind uwtable
24+
define i32 @main() #0 {
25+
entry:
26+
br label %for.body
27+
28+
for.body: ; preds = %for.body, %entry
29+
%indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
30+
%arrayidx = getelementptr inbounds [40000 x i8] addrspace(1)* @Y, i64 0, i64 %indvars.iv
31+
%0 = load i8 addrspace(1)* %arrayidx, align 1, !tbaa !0
32+
%add = add i8 %0, 1
33+
%arrayidx3 = getelementptr inbounds [40000 x i8]* @X, i64 0, i64 %indvars.iv
34+
store i8 %add, i8* %arrayidx3, align 1, !tbaa !0
35+
%indvars.iv.next = add i64 %indvars.iv, 1
36+
%lftr.wideiv = trunc i64 %indvars.iv.next to i32
37+
%exitcond = icmp eq i32 %lftr.wideiv, 40000
38+
br i1 %exitcond, label %for.end, label %for.body
39+
40+
for.end: ; preds = %for.body
41+
ret i32 0
42+
}
43+
44+
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
45+
46+
!0 = metadata !{metadata !"omnipotent char", metadata !1}
47+
!1 = metadata !{metadata !"Simple C/C++ TBAA"}

0 commit comments

Comments
 (0)