Skip to content

Commit 6ff0f69

Browse files
authored
[SandboxVec][BottomUpVec] Fix vectorization of vector constants (#129290)
This patch fixes the value we generate when we vectorize constants.
1 parent 7e11ef1 commit 6ff0f69

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,9 @@ Value *BottomUpVec::createPack(ArrayRef<Value *> ToPack, BasicBlock *UserBB) {
230230
// This may also return a Constant if ExtrI is a Constant.
231231
auto *InsertI = InsertElementInst::create(
232232
LastInsert, ExtrI, InsertLaneC, WhereIt, Ctx, "VPack");
233-
if (!isa<Constant>(InsertI)) {
234-
LastInsert = InsertI;
233+
LastInsert = InsertI;
234+
if (!isa<Constant>(InsertI))
235235
WhereIt = std::next(cast<Instruction>(LastInsert)->getIterator());
236-
}
237236
}
238237
} else {
239238
Constant *InsertLaneC =

llvm/test/Transforms/SandboxVectorizer/bottomup_basic.ll

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,3 +416,43 @@ define void @instrsInMultipleBundles(ptr noalias %ptr) {
416416
store i8 %add1, ptr %gep1
417417
ret void
418418
}
419+
420+
define void @vectorize_constants(ptr %ptr) {
421+
; CHECK-LABEL: define void @vectorize_constants(
422+
; CHECK-SAME: ptr [[PTR:%.*]]) {
423+
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr i8, ptr [[PTR]], i32 0
424+
; CHECK-NEXT: [[VECL:%.*]] = load <2 x i8>, ptr [[PTR0]], align 1
425+
; CHECK-NEXT: [[VEC:%.*]] = add <2 x i8> [[VECL]], <i8 0, i8 1>
426+
; CHECK-NEXT: store <2 x i8> [[VEC]], ptr [[PTR0]], align 1
427+
; CHECK-NEXT: ret void
428+
;
429+
%ptr0 = getelementptr i8, ptr %ptr, i32 0
430+
%ptr1 = getelementptr i8, ptr %ptr, i32 1
431+
%ld0 = load i8, ptr %ptr0
432+
%ld1 = load i8, ptr %ptr1
433+
%add0 = add i8 %ld0, 0
434+
%add1 = add i8 %ld1, 1
435+
store i8 %add0, ptr %ptr0
436+
store i8 %add1, ptr %ptr1
437+
ret void
438+
}
439+
440+
define void @vectorize_constant_vectors(ptr %ptr) {
441+
; CHECK-LABEL: define void @vectorize_constant_vectors(
442+
; CHECK-SAME: ptr [[PTR:%.*]]) {
443+
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr <2 x i8>, ptr [[PTR]], i32 0
444+
; CHECK-NEXT: [[VECL:%.*]] = load <4 x i8>, ptr [[PTR0]], align 2
445+
; CHECK-NEXT: [[VEC:%.*]] = sub <4 x i8> [[VECL]], <i8 0, i8 0, i8 1, i8 1>
446+
; CHECK-NEXT: store <4 x i8> [[VEC]], ptr [[PTR0]], align 2
447+
; CHECK-NEXT: ret void
448+
;
449+
%ptr0 = getelementptr <2 x i8>, ptr %ptr, i32 0
450+
%ptr1 = getelementptr <2 x i8>, ptr %ptr, i32 1
451+
%ld0 = load <2 x i8>, ptr %ptr0
452+
%ld1 = load <2 x i8>, ptr %ptr1
453+
%sub0 = sub <2 x i8> %ld0, splat(i8 0)
454+
%sub1 = sub <2 x i8> %ld1, splat(i8 1)
455+
store <2 x i8> %sub0, ptr %ptr0
456+
store <2 x i8> %sub1, ptr %ptr1
457+
ret void
458+
}

0 commit comments

Comments
 (0)