Skip to content

Commit 4843847

Browse files
committed
Fix late gc lowering pass for vector intrinsics
1 parent f62a380 commit 4843847

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/llvm-late-gc-lowering.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// This file is a part of Julia. License is MIT: https://julialang.org/license
22

33
#include "llvm-gc-interface-passes.h"
4+
#include "llvm/IR/Intrinsics.h"
45

56
#define DEBUG_TYPE "late_lower_gcroot"
67

@@ -204,7 +205,17 @@ static std::pair<Value*,int> FindBaseValue(const State &S, Value *V, bool UseCac
204205
}
205206
// In general a load terminates a walk
206207
break;
207-
}
208+
} else if (II->getIntrinsicID() == Intrinsic::vector_extract) {
209+
if (auto VTy = dyn_cast<VectorType>(II->getType())) {
210+
if (hasLoadedTy(VTy->getElementType())) {
211+
// TODO: For now, only support constant index.
212+
auto IdxOp = cast<ConstantInt>(II->getOperand(1));
213+
fld_idx = IdxOp->getLimitedValue(INT_MAX);
214+
CurrentV = II->getOperand(0);
215+
}
216+
}
217+
} else
218+
break;
208219
}
209220
else if (auto CI = dyn_cast<CallInst>(CurrentV)) {
210221
auto callee = CI->getCalledFunction();
@@ -518,6 +529,16 @@ SmallVector<int, 0> LateLowerGCFrame::NumberAllBase(State &S, Value *CurrentV) {
518529
Numbers = NumberAll(S, IEI->getOperand(0));
519530
int ElNumber = Number(S, IEI->getOperand(1));
520531
Numbers[idx] = ElNumber;
532+
} else if (auto * VII = dyn_cast<IntrinsicInst>(CurrentV)) {
533+
if (VII->getIntrinsicID() == Intrinsic::vector_insert) {
534+
Numbers = NumberAll(S, VII->getOperand(0));
535+
int first_idx = cast<ConstantInt>(VII->getOperand(2))->getZExtValue();
536+
SmallVector<int, 0> Numbers2 = NumberAll(S, VII->getOperand(1));
537+
for (unsigned i = 0; i < Numbers2.size(); ++i) {
538+
dbgs() << Numbers2[i] << " "<< first_idx + i << "\n";
539+
Numbers[first_idx + i] = Numbers2[i];
540+
}
541+
}
521542
} else if (auto *IVI = dyn_cast<InsertValueInst>(CurrentV)) {
522543
Numbers = NumberAll(S, IVI->getAggregateOperand());
523544
auto Tracked = TrackCompositeType(IVI->getType());
@@ -1143,6 +1164,10 @@ State LateLowerGCFrame::LocalScan(Function &F) {
11431164
}
11441165
}
11451166
}
1167+
if (II->getIntrinsicID() == Intrinsic::vector_extract || II->getIntrinsicID() == Intrinsic::vector_insert) {
1168+
// These are not real defs
1169+
continue;
1170+
}
11461171
}
11471172
auto callee = CI->getCalledFunction();
11481173
if (callee && callee == typeof_func) {

test/llvmpasses/late-lower-gc.ll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,21 @@ define {} addrspace(10)* @gclift_switch({} addrspace(13)* addrspace(10)* %input,
150150
ret {} addrspace(10)* %ret
151151
}
152152

153+
; Shouldn't hang
154+
define void @vector_insert(<4 x {} addrspace(10)* > %0, <2 x {} addrspace(10)* > %1) {
155+
top:
156+
%pgcstack = call ptr @julia.get_pgcstack()
157+
%2 = call <4 x {} addrspace(10)*> @llvm.vector.insert.v4p10.v2p10(<4 x {} addrspace(10)*> %0, <2 x {} addrspace(10)*> %1, i64 2)
158+
ret void
159+
}
160+
161+
define void @vector_extract(<4 x {} addrspace(10)* > %0, <2 x {} addrspace(10)* > %1) {
162+
top:
163+
%pgcstack = call ptr @julia.get_pgcstack()
164+
%2 = call <2 x {} addrspace(10)*> @llvm.vector.extract.v2p10.v4p10(<4 x {} addrspace(10)* > %0, i64 2)
165+
ret void
166+
}
167+
153168
define void @decayar([2 x {} addrspace(10)* addrspace(11)*] %ar) {
154169
%v2 = call {}*** @julia.get_pgcstack()
155170
%e0 = extractvalue [2 x {} addrspace(10)* addrspace(11)*] %ar, 0

0 commit comments

Comments
 (0)