[llvm] b20896c - [DirectX] Don't use IRBuilder to create GEPs (#227000)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 29 00:52:51 PDT 2026
Author: Nikita Popov
Date: 2026-09-29T09:52:44+02:00
New Revision: b20896c96deab703d7f0e99301b553a8ef4abad7
URL: https://github.com/llvm/llvm-project/commit/b20896c96deab703d7f0e99301b553a8ef4abad7
DIFF: https://github.com/llvm/llvm-project/commit/b20896c96deab703d7f0e99301b553a8ef4abad7.diff
LOG: [DirectX] Don't use IRBuilder to create GEPs (#227000)
This switches the DirectX backend to directly call
`GetElementPtrInst::Create()` instead of creating GEPs via IRBuilder.
IRBuilder will soon start canonicalizing GEPs to ptradd representation
(with the first change being
https://github.com/llvm/llvm-project/pull/226425, affecting constant
expressions only), while DirectX needs GEPs to have specific form.
The change implemented here is a minimal one to unblock further work. In
the future, it will become impossible to construct such GEPs through any
API. The DirectX backend needs to switch to using an intrinsic to
represent any non-canonical GEPs it needs. This followup work is tracked
in https://github.com/llvm/llvm-project/issues/227005.
Added:
Modified:
llvm/lib/Target/DirectX/DXILDataScalarization.cpp
llvm/lib/Target/DirectX/DXILFlattenArrays.cpp
llvm/lib/Target/DirectX/DXILLegalizePass.cpp
llvm/lib/Target/DirectX/DXILMemIntrinsics.cpp
llvm/lib/Target/DirectX/DXILOpLowering.cpp
llvm/test/CodeGen/DirectX/bugfix_150050_data_scalarize_const_gep.ll
llvm/test/CodeGen/DirectX/flatten-array.ll
llvm/test/CodeGen/DirectX/flatten-bug-117273.ll
llvm/test/CodeGen/DirectX/legalize-i8.ll
llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll
llvm/test/CodeGen/DirectX/scalar-store.ll
llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
llvm/test/tools/dxil-dis/constantexpr-gep.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp
index c6506a9e0b059..deaef574a828a 100644
--- a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp
+++ b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp
@@ -216,9 +216,9 @@ DataScalarizerVisitor::createArrayFromVector(IRBuilder<> &Builder, Value *Vec,
Value *EE = Builder.CreateExtractElement(Vec, I, Name + ".extract");
if (WidenBool)
EE = Builder.CreateZExt(EE, ArrElemTy, Name + ".zext");
- GEPs[I] = Builder.CreateInBoundsGEP(
+ GEPs[I] = GetElementPtrInst::CreateInBounds(
ArrTy, ArrAlloca, {Builder.getInt32(0), Builder.getInt32(I)},
- Name + ".index");
+ Name + ".index", Builder.GetInsertPoint());
Builder.CreateStore(EE, GEPs[I]);
}
@@ -232,8 +232,9 @@ DataScalarizerVisitor::createArrayFromVector(IRBuilder<> &Builder, Value *Vec,
static std::pair<Value *, Value *>
dynamicallyLoadArray(IRBuilder<> &Builder, AllocaInst *ArrAlloca, Type *ArrTy,
Value *Index, const Twine &Name = "") {
- Value *GEP = Builder.CreateInBoundsGEP(
- ArrTy, ArrAlloca, {Builder.getInt32(0), Index}, Name + ".index");
+ Value *GEP = GetElementPtrInst::CreateInBounds(
+ ArrTy, ArrAlloca, {Builder.getInt32(0), Index}, Name + ".index",
+ Builder.GetInsertPoint());
Value *Load =
Builder.CreateLoad(ArrTy->getArrayElementType(), GEP, Name + ".load");
return std::make_pair(GEP, Load);
@@ -345,14 +346,10 @@ bool DataScalarizerVisitor::visitGetElementPtrInst(GetElementPtrInst &GEPI) {
cast<GetElementPtrInst>(PtrOpGEPCE->getAsInstruction());
OldGEPI->insertBefore(GEPI.getIterator());
- IRBuilder<> Builder(&GEPI);
SmallVector<Value *> Indices(GEPI.indices());
- Value *NewGEP =
- Builder.CreateGEP(GEPI.getSourceElementType(), OldGEPI, Indices,
- GEPI.getName(), GEPI.getNoWrapFlags());
- assert(isa<GetElementPtrInst>(NewGEP) &&
- "Expected newly-created GEP to be an instruction");
- GetElementPtrInst *NewGEPI = cast<GetElementPtrInst>(NewGEP);
+ GetElementPtrInst *NewGEPI = GetElementPtrInst::Create(
+ GEPI.getSourceElementType(), OldGEPI, Indices, GEPI.getNoWrapFlags(),
+ GEPI.getName(), GEPI.getIterator());
GEPI.replaceAllUsesWith(NewGEPI);
GEPI.eraseFromParent();
@@ -370,10 +367,10 @@ bool DataScalarizerVisitor::visitGetElementPtrInst(GetElementPtrInst &GEPI) {
if (!NeedsTransform)
return false;
- IRBuilder<> Builder(&GEPI);
SmallVector<Value *, MaxVecSize> Indices(GOp->idx_begin(), GOp->idx_end());
- Value *NewGEP = Builder.CreateGEP(NewGEPType, NewPtrOperand, Indices,
- GOp->getName(), GOp->getNoWrapFlags());
+ Value *NewGEP = GetElementPtrInst::Create(NewGEPType, NewPtrOperand, Indices,
+ GOp->getNoWrapFlags(),
+ GOp->getName(), GEPI.getIterator());
GOp->replaceAllUsesWith(NewGEP);
diff --git a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp
index 1ac1b572939be..3faa1155d0fa9 100644
--- a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp
+++ b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp
@@ -232,14 +232,10 @@ bool DXILFlattenArraysVisitor::visitGetElementPtrInst(GetElementPtrInst &GEP) {
cast<GetElementPtrInst>(PtrOpGEPCE->getAsInstruction());
OldGEPI->insertBefore(GEP.getIterator());
- IRBuilder<> Builder(&GEP);
SmallVector<Value *> Indices(GEP.indices());
- Value *NewGEP =
- Builder.CreateGEP(GEP.getSourceElementType(), OldGEPI, Indices,
- GEP.getName(), GEP.getNoWrapFlags());
- assert(isa<GetElementPtrInst>(NewGEP) &&
- "Expected newly-created GEP to be an instruction");
- GetElementPtrInst *NewGEPI = cast<GetElementPtrInst>(NewGEP);
+ GetElementPtrInst *NewGEPI = GetElementPtrInst::Create(
+ GEP.getSourceElementType(), OldGEPI, Indices, GEP.getNoWrapFlags(),
+ GEP.getName(), GEP.getIterator());
GEP.replaceAllUsesWith(NewGEPI);
GEP.eraseFromParent();
@@ -344,19 +340,10 @@ bool DXILFlattenArraysVisitor::visitGetElementPtrInst(GetElementPtrInst &GEP) {
}
// Construct a new GEP for the flattened array to replace the current GEP
- Value *NewGEP = Builder.CreateGEP(
+ GetElementPtrInst *NewGEP = GetElementPtrInst::Create(
Info.RootFlattenedArrayType, Info.RootPointerOperand,
- {ZeroIndex, FlattenedIndex}, GEP.getName(), GEP.getNoWrapFlags());
-
- // If the pointer operand is a global variable and all indices are 0,
- // IRBuilder::CreateGEP will return the global variable instead of creating
- // a GEP instruction or GEP ConstantExpr. In this case we have to create and
- // insert our own GEP instruction.
- if (!isa<GEPOperator>(NewGEP))
- NewGEP = GetElementPtrInst::Create(
- Info.RootFlattenedArrayType, Info.RootPointerOperand,
- {ZeroIndex, FlattenedIndex}, GEP.getNoWrapFlags(), GEP.getName(),
- Builder.GetInsertPoint());
+ {ZeroIndex, FlattenedIndex}, GEP.getNoWrapFlags(), GEP.getName(),
+ Builder.GetInsertPoint());
// Replace the current GEP with the new GEP. Store GEPInfo into the map
// for later use in case this GEP was not the end of the chain
diff --git a/llvm/lib/Target/DirectX/DXILLegalizePass.cpp b/llvm/lib/Target/DirectX/DXILLegalizePass.cpp
index 9cc864c5e4776..42dd2ae71a200 100644
--- a/llvm/lib/Target/DirectX/DXILLegalizePass.cpp
+++ b/llvm/lib/Target/DirectX/DXILLegalizePass.cpp
@@ -138,9 +138,9 @@ static bool fixI8UseChain(Instruction &I,
else
GEPType = ArrayType::get(ElementType, 1); // its a scalar
- Value *NewGEP = Builder.CreateGEP(
+ Value *NewGEP = GetElementPtrInst::Create(
GEPType, PtrOperand, {Builder.getInt32(0), Builder.getInt32(Index)},
- GEP->getName(), GEP->getNoWrapFlags());
+ GEP->getNoWrapFlags(), GEP->getName(), I.getIterator());
LoadInst *NewLoad = Builder.CreateLoad(ElementType, NewGEP);
ReplacedValues[Load] = NewLoad;
@@ -245,9 +245,9 @@ static bool fixI8UseChain(Instruction &I,
uint32_t ElemSize = GEP->getDataLayout().getTypeAllocSize(ElementType);
assert(ElemSize > 0 && "ElementSize must be set");
uint32_t Index = ByteOffset / ElemSize;
- Value *NewGEP = Builder.CreateGEP(
+ Value *NewGEP = GetElementPtrInst::Create(
GEPType, BasePtr, {Builder.getInt32(0), Builder.getInt32(Index)},
- GEP->getName(), GEP->getNoWrapFlags());
+ GEP->getNoWrapFlags(), GEP->getName(), GEP->getIterator());
ReplacedValues[GEP] = NewGEP;
GEP->replaceAllUsesWith(NewGEP);
ToRemove.push_back(GEP);
diff --git a/llvm/lib/Target/DirectX/DXILMemIntrinsics.cpp b/llvm/lib/Target/DirectX/DXILMemIntrinsics.cpp
index fa8b7dae6c76a..99506f26fa8d5 100644
--- a/llvm/lib/Target/DirectX/DXILMemIntrinsics.cpp
+++ b/llvm/lib/Target/DirectX/DXILMemIntrinsics.cpp
@@ -55,7 +55,8 @@ void expandMemSet(MemSetInst *MemSet) {
for (uint64_t I = 0; I < Size; ++I) {
Value *Zero = Builder.getInt32(0);
Value *Offset = Builder.getInt32(I);
- Value *Ptr = Builder.CreateGEP(ArrTy, Dst, {Zero, Offset}, "gep");
+ Value *Ptr = GetElementPtrInst::Create(ArrTy, Dst, {Zero, Offset}, "gep",
+ MemSet->getIterator());
Builder.CreateStore(TypedVal, Ptr);
}
@@ -167,11 +168,10 @@ void expandMemCpy(MemCpyInst *MemCpy) {
if (Offset >= ByteLength)
break;
// TODO: Should we skip padding types here?
- Type *Int8Ty = Builder.getInt8Ty();
Value *ByteOffset = Builder.getInt32(Offset);
- Value *SrcPtr = Builder.CreateInBoundsGEP(Int8Ty, Src, ByteOffset);
+ Value *SrcPtr = Builder.CreateInBoundsPtrAdd(Src, ByteOffset);
Value *SrcVal = Builder.CreateLoad(Ty, SrcPtr);
- Value *DstPtr = Builder.CreateInBoundsGEP(Int8Ty, Dst, ByteOffset);
+ Value *DstPtr = Builder.CreateInBoundsPtrAdd(Dst, ByteOffset);
Builder.CreateStore(SrcVal, DstPtr);
}
diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
index e3a6ddde98a1e..2807e58942fbd 100644
--- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
@@ -574,14 +574,16 @@ class OpLowerer {
for (int I = 0, E = N; I != E; ++I) {
if (!Extracts[I])
Extracts[I] = IRB.CreateExtractValue(Op, I);
- Value *GEP = IRB.CreateInBoundsGEP(
- ArrayTy, Alloca, {Zero, ConstantInt::get(Int32Ty, I)});
+ Value *GEP = GetElementPtrInst::CreateInBounds(
+ ArrayTy, Alloca, {Zero, ConstantInt::get(Int32Ty, I)}, "",
+ IRB.GetInsertPoint());
IRB.CreateStore(Extracts[I], GEP);
}
for (ExtractElementInst *EEI : DynamicAccesses) {
- Value *GEP = IRB.CreateInBoundsGEP(ArrayTy, Alloca,
- {Zero, EEI->getIndexOperand()});
+ Value *GEP = GetElementPtrInst::CreateInBounds(
+ ArrayTy, Alloca, {Zero, EEI->getIndexOperand()}, "",
+ IRB.GetInsertPoint());
Value *Load = IRB.CreateLoad(ElTy, GEP);
EEI->replaceAllUsesWith(Load);
EEI->eraseFromParent();
diff --git a/llvm/test/CodeGen/DirectX/bugfix_150050_data_scalarize_const_gep.ll b/llvm/test/CodeGen/DirectX/bugfix_150050_data_scalarize_const_gep.ll
index def886f933d08..7c02550d23083 100644
--- a/llvm/test/CodeGen/DirectX/bugfix_150050_data_scalarize_const_gep.ll
+++ b/llvm/test/CodeGen/DirectX/bugfix_150050_data_scalarize_const_gep.ll
@@ -19,10 +19,14 @@ define void @CSMain() {
; FCHECK-NEXT: [[AFRAGPACKED_I_SCALARIZE_I14:%.*]] = getelementptr [4 x i32], ptr [[AFRAGPACKED_I_SCALARIZE]], i32 0, i32 1
; FCHECK-NEXT: [[AFRAGPACKED_I_SCALARIZE_I25:%.*]] = getelementptr [4 x i32], ptr [[AFRAGPACKED_I_SCALARIZE]], i32 0, i32 2
; FCHECK-NEXT: [[AFRAGPACKED_I_SCALARIZE_I36:%.*]] = getelementptr [4 x i32], ptr [[AFRAGPACKED_I_SCALARIZE]], i32 0, i32 3
-; FCHECK-NEXT: [[DOTI07:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds ([400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 48), align 16
-; FCHECK-NEXT: [[DOTI119:%.*]] = load i32, ptr addrspace(3) getelementptr ([400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 49), align 4
-; FCHECK-NEXT: [[DOTI2211:%.*]] = load i32, ptr addrspace(3) getelementptr ([400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 50), align 8
-; FCHECK-NEXT: [[DOTI3313:%.*]] = load i32, ptr addrspace(3) getelementptr ([400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 51), align 4
+; FCHECK-NEXT: [[GEP48:%.*]] = getelementptr inbounds [400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 48
+; FCHECK-NEXT: [[DOTI07:%.*]] = load i32, ptr addrspace(3) [[GEP48]], align 16
+; FCHECK-NEXT: [[GEP49:%.*]] = getelementptr [400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 49
+; FCHECK-NEXT: [[DOTI119:%.*]] = load i32, ptr addrspace(3) [[GEP49]], align 4
+; FCHECK-NEXT: [[GEP50:%.*]] = getelementptr [400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 50
+; FCHECK-NEXT: [[DOTI2211:%.*]] = load i32, ptr addrspace(3) [[GEP50]], align 8
+; FCHECK-NEXT: [[GEP51:%.*]] = getelementptr [400 x i32], ptr addrspace(3) @aTile.scalarized.1dim, i32 0, i32 51
+; FCHECK-NEXT: [[DOTI3313:%.*]] = load i32, ptr addrspace(3) [[GEP51]], align 4
; FCHECK-NEXT: store i32 [[DOTI07]], ptr [[AFRAGPACKED_I_SCALARIZE]], align 16
; FCHECK-NEXT: store i32 [[DOTI119]], ptr [[AFRAGPACKED_I_SCALARIZE_I14]], align 4
; FCHECK-NEXT: store i32 [[DOTI2211]], ptr [[AFRAGPACKED_I_SCALARIZE_I25]], align 8
@@ -46,7 +50,8 @@ define void @Main() {
; SCHECK-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(3) [[GEP1]], align 16
; SCHECK-NEXT: store i32 [[LOAD]], ptr [[BFRAGPACKED_I]], align 16
;
-; FCHECK-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds ([100 x i32], ptr addrspace(3) @bTile.1dim, i32 0, i32 11), align 16
+; FCHECK-NEXT: [[GEP11:%.*]] = getelementptr inbounds [100 x i32], ptr addrspace(3) @bTile.1dim, i32 0, i32 11
+; FCHECK-NEXT: [[LOAD:%.*]] = load i32, ptr addrspace(3) [[GEP11]], align 16
; FCHECK-NEXT: store i32 [[LOAD]], ptr [[BFRAGPACKED_I]], align 16
;
; CHECK-NEXT: ret void
@@ -64,7 +69,8 @@ define void @global_nested_geps_3d() {
; SCHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x i32], ptr [[GEP1]], i32 0, i32 1
; SCHECK-NEXT: load i32, ptr [[GEP2]], align 4
;
-; FCHECK-NEXT: load i32, ptr getelementptr inbounds ([8 x i32], ptr @cTile.scalarized.1dim, i32 0, i32 7), align 4
+; FCHECK-NEXT: [[GEP7:%.*]] = getelementptr inbounds [8 x i32], ptr @cTile.scalarized.1dim, i32 0, i32 7
+; FCHECK-NEXT: load i32, ptr [[GEP7]], align 4
;
; CHECK-NEXT: ret void
%1 = load i32, i32* getelementptr inbounds (<2 x i32>, <2 x i32>* getelementptr inbounds ([2 x <2 x i32>], [2 x <2 x i32>]* getelementptr inbounds ([2 x [2 x <2 x i32>]], [2 x [2 x <2 x i32>]]* @cTile, i32 0, i32 1), i32 0, i32 1), i32 0, i32 1), align 4
@@ -79,7 +85,8 @@ define void @global_nested_geps_4d() {
; SCHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x i32], ptr [[GEP2]], i32 0, i32 1
; SCHECK-NEXT: load i32, ptr [[GEP3]], align 4
;
-; FCHECK-NEXT: load i32, ptr getelementptr inbounds ([16 x i32], ptr @dTile.scalarized.1dim, i32 0, i32 15), align 4
+; FCHECK-NEXT: [[GEP15:%.*]] = getelementptr inbounds [16 x i32], ptr @dTile.scalarized.1dim, i32 0, i32 15
+; FCHECK-NEXT: load i32, ptr [[GEP15]], align 4
;
; CHECK-NEXT: ret void
%1 = load i32, i32* getelementptr inbounds (<2 x i32>, <2 x i32>* getelementptr inbounds ([2 x <2 x i32>], [2 x <2 x i32>]* getelementptr inbounds ([2 x [2 x <2 x i32>]], [2 x [2 x <2 x i32>]]* getelementptr inbounds ([2 x [2 x [2 x <2 x i32>]]], [2 x [2 x [2 x <2 x i32>]]]* @dTile, i32 0, i32 1), i32 0, i32 1), i32 0, i32 1), i32 0, i32 1), align 4
diff --git a/llvm/test/CodeGen/DirectX/flatten-array.ll b/llvm/test/CodeGen/DirectX/flatten-array.ll
index a2e105537ab88..2ee8b7670542e 100644
--- a/llvm/test/CodeGen/DirectX/flatten-array.ll
+++ b/llvm/test/CodeGen/DirectX/flatten-array.ll
@@ -124,7 +124,8 @@ define void @gep_4d_test () {
define void @global_gep_load() {
; CHECK-LABEL: define void @global_gep_load(
- ; CHECK: {{.*}} = load i32, ptr getelementptr inbounds ([24 x i32], ptr @a.1dim, i32 0, i32 6), align 4
+ ; CHECK: [[GEP:%.*]] = getelementptr inbounds [24 x i32], ptr @a.1dim, i32 0, i32 6
+ ; CHECK: {{.*}} = load i32, ptr [[GEP]], align 4
; CHECK-NEXT: ret void
%1 = getelementptr inbounds [2 x [3 x [4 x i32]]], [2 x [3 x [4 x i32]]]* @a, i32 0, i32 0
%2 = getelementptr inbounds [3 x [4 x i32]], [3 x [4 x i32]]* %1, i32 0, i32 1
@@ -135,7 +136,8 @@ define void @global_gep_load() {
define void @global_nested_geps() {
; CHECK-LABEL: define void @global_nested_geps(
- ; CHECK: {{.*}} = load i32, ptr getelementptr inbounds ([24 x i32], ptr @a.1dim, i32 0, i32 6), align 4
+ ; CHECK: [[GEP:%.*]] = getelementptr inbounds [24 x i32], ptr @a.1dim, i32 0, i32 6
+ ; CHECK: {{.*}} = load i32, ptr [[GEP]], align 4
; CHECK-NEXT: ret void
%1 = load i32, i32* getelementptr inbounds ([4 x i32], [4 x i32]* getelementptr inbounds ([3 x [4 x i32]], [3 x [4 x i32]]* getelementptr inbounds ([2 x [3 x [4 x i32]]], [2 x [3 x [4 x i32]]]* @a, i32 0, i32 0), i32 0, i32 1), i32 0, i32 2), align 4
ret void
@@ -185,7 +187,8 @@ define void @global_incomplete_gep_chain(i32 %row, i32 %col) {
}
define void @global_gep_store() {
- ; CHECK: store i32 1, ptr getelementptr inbounds ([24 x i32], ptr @b.1dim, i32 0, i32 13), align 4
+ ; CHECK: [[GEP:%.*]] = getelementptr inbounds [24 x i32], ptr @b.1dim, i32 0, i32 13
+ ; CHECK: store i32 1, ptr [[GEP]], align 4
; CHECK-NEXT: ret void
%1 = getelementptr inbounds [2 x [3 x [4 x i32]]], [2 x [3 x [4 x i32]]]* @b, i32 0, i32 1
%2 = getelementptr inbounds [3 x [4 x i32]], [3 x [4 x i32]]* %1, i32 0, i32 0
@@ -211,7 +214,8 @@ define void @two_index_gep() {
define void @two_index_gep_const() {
; CHECK-LABEL: define void @two_index_gep_const(
- ; CHECK-NEXT: load float, ptr addrspace(3) getelementptr inbounds nuw ([4 x float], ptr addrspace(3) @g.1dim, i32 0, i32 3), align 4
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [4 x float], ptr addrspace(3) @g.1dim, i32 0, i32 3
+ ; CHECK-NEXT: load float, ptr addrspace(3) [[GEP]], align 4
; CHECK-NEXT: ret void
%1 = getelementptr inbounds nuw [2 x [2 x float]], ptr addrspace(3) @g, i32 0, i32 1, i32 1
%3 = load float, ptr addrspace(3) %1, align 4
diff --git a/llvm/test/CodeGen/DirectX/flatten-bug-117273.ll b/llvm/test/CodeGen/DirectX/flatten-bug-117273.ll
index 78971b8954150..ad1b91ac7045f 100644
--- a/llvm/test/CodeGen/DirectX/flatten-bug-117273.ll
+++ b/llvm/test/CodeGen/DirectX/flatten-bug-117273.ll
@@ -8,8 +8,10 @@
define internal void @main() {
; CHECK-LABEL: define internal void @main() {
; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[DOTI0:%.*]] = load float, ptr getelementptr ([6 x float], ptr @ZerroInitArr.1dim, i32 0, i32 3), align 16
-; CHECK-NEXT: [[DOTI03:%.*]] = load float, ptr getelementptr ([6 x float], ptr @ZerroInitArr.1dim, i32 0, i32 6), align 16
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr [6 x float], ptr @ZerroInitArr.1dim, i32 0, i32 3
+; CHECK-NEXT: [[DOTI0:%.*]] = load float, ptr [[GEP3]], align 16
+; CHECK-NEXT: [[GEP6:%.*]] = getelementptr [6 x float], ptr @ZerroInitArr.1dim, i32 0, i32 6
+; CHECK-NEXT: [[DOTI03:%.*]] = load float, ptr [[GEP6]], align 16
; CHECK-NEXT: ret void
;
entry:
diff --git a/llvm/test/CodeGen/DirectX/legalize-i8.ll b/llvm/test/CodeGen/DirectX/legalize-i8.ll
index 7eb47ba661f4c..60258cfcf701f 100644
--- a/llvm/test/CodeGen/DirectX/legalize-i8.ll
+++ b/llvm/test/CodeGen/DirectX/legalize-i8.ll
@@ -166,7 +166,8 @@ define i32 @i8_gep_store() {
@g = local_unnamed_addr addrspace(3) global [2 x float] zeroinitializer, align 4
define float @i8_gep_global_index() {
; CHECK-LABEL: define float @i8_gep_global_index(
- ; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(3) getelementptr inbounds nuw ([2 x float], ptr addrspace(3) @g, i32 0, i32 1), align 4
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [2 x float], ptr addrspace(3) @g, i32 0, i32 1
+ ; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(3) [[GEP]], align 4
; CHECK-NEXT: ret float [[LOAD]]
%1 = getelementptr inbounds nuw i8, ptr addrspace(3) @g, i32 4
%2 = load float, ptr addrspace(3) %1, align 4
@@ -175,7 +176,8 @@ define float @i8_gep_global_index() {
define float @i8_gep_global_constexpr() {
; CHECK-LABEL: define float @i8_gep_global_constexpr(
- ; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(3) getelementptr inbounds nuw ([2 x float], ptr addrspace(3) @g, i32 0, i32 1), align 4
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [2 x float], ptr addrspace(3) @g, i32 0, i32 1
+ ; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(3) [[GEP]], align 4
; CHECK-NEXT: ret float [[LOAD]]
%1 = load float, ptr addrspace(3) getelementptr inbounds nuw (i8, ptr addrspace(3) @g, i32 4), align 4
ret float %1
diff --git a/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll b/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll
index a57130a038fdc..96af933edda38 100644
--- a/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll
+++ b/llvm/test/CodeGen/DirectX/llc-vector-load-scalarize.ll
@@ -26,13 +26,20 @@ define <4 x i32> @load_array_vec_test() #0 {
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 0
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) [[GEP]], align 4
-; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 1), align 4
-; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 2), align 4
-; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 3), align 4
-; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4), align 4
-; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5), align 4
-; CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 6), align 4
-; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 7), align 4
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 1
+; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(3) [[GEP1]], align 4
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 2
+; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr addrspace(3) [[GEP2]], align 4
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 3
+; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr addrspace(3) [[GEP3]], align 4
+; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4
+; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr addrspace(3) [[GEP4]], align 4
+; CHECK-NEXT: [[GEP5:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5
+; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr addrspace(3) [[GEP5]], align 4
+; CHECK-NEXT: [[GEP6:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 6
+; CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr addrspace(3) [[GEP6]], align 4
+; CHECK-NEXT: [[GEP7:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 7
+; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr addrspace(3) [[GEP7]], align 4
; CHECK-NEXT: [[DOTI05:%.*]] = add i32 [[TMP2]], [[TMP10]]
; CHECK-NEXT: [[DOTI16:%.*]] = add i32 [[TMP4]], [[TMP12]]
; CHECK-NEXT: [[DOTI27:%.*]] = add i32 [[TMP6]], [[TMP14]]
@@ -55,9 +62,12 @@ define <4 x i32> @load_vec_test() #0 {
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 0
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) [[GEP]], align 4
-; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) getelementptr ([4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 1), align 4
-; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) getelementptr ([4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 2), align 4
-; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(3) getelementptr ([4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 3), align 4
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 1
+; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) [[GEP1]], align 4
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 2
+; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) [[GEP2]], align 4
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 3
+; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(3) [[GEP3]], align 4
; CHECK-NEXT: [[DOTUPTO0:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTUPTO1:%.*]] = insertelement <4 x i32> [[DOTUPTO0]], i32 [[TMP2]], i32 1
; CHECK-NEXT: [[DOTUPTO2:%.*]] = insertelement <4 x i32> [[DOTUPTO1]], i32 [[TMP3]], i32 2
@@ -71,10 +81,14 @@ define <4 x i32> @load_vec_test() #0 {
define <4 x i32> @load_vec_from_scalar_gep_test() #0 {
; CHECK-LABEL: define <4 x i32> @load_vec_from_scalar_gep_test(
; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT: [[DOTI04:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds nuw ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4), align 4
-; CHECK-NEXT: [[DOTI116:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5), align 4
-; CHECK-NEXT: [[DOTI228:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 6), align 4
-; CHECK-NEXT: [[DOTI3310:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 7), align 4
+; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds nuw [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4
+; CHECK-NEXT: [[DOTI04:%.*]] = load i32, ptr addrspace(3) [[GEP4]], align 4
+; CHECK-NEXT: [[GEP5:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5
+; CHECK-NEXT: [[DOTI116:%.*]] = load i32, ptr addrspace(3) [[GEP5]], align 4
+; CHECK-NEXT: [[GEP6:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 6
+; CHECK-NEXT: [[DOTI228:%.*]] = load i32, ptr addrspace(3) [[GEP6]], align 4
+; CHECK-NEXT: [[GEP7:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 7
+; CHECK-NEXT: [[DOTI3310:%.*]] = load i32, ptr addrspace(3) [[GEP7]], align 4
; CHECK-NEXT: [[DOTUPTO011:%.*]] = insertelement <4 x i32> poison, i32 [[DOTI04]], i32 0
; CHECK-NEXT: [[DOTUPTO112:%.*]] = insertelement <4 x i32> [[DOTUPTO011]], i32 [[DOTI116]], i32 1
; CHECK-NEXT: [[DOTUPTO213:%.*]] = insertelement <4 x i32> [[DOTUPTO112]], i32 [[DOTI228]], i32 2
@@ -89,10 +103,14 @@ define <4 x i32> @load_vec_from_scalar_gep_test() #0 {
define <4 x i32> @load_vec_from_i8_gep_test() #0 {
; CHECK-LABEL: define <4 x i32> @load_vec_from_i8_gep_test(
; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT: [[DOTI04:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds nuw ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4), align 4
-; CHECK-NEXT: [[DOTI116:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5), align 4
-; CHECK-NEXT: [[DOTI228:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 6), align 4
-; CHECK-NEXT: [[DOTI3310:%.*]] = load i32, ptr addrspace(3) getelementptr ([8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 7), align 4
+; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds nuw [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4
+; CHECK-NEXT: [[DOTI04:%.*]] = load i32, ptr addrspace(3) [[GEP4]], align 4
+; CHECK-NEXT: [[GEP5:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5
+; CHECK-NEXT: [[DOTI116:%.*]] = load i32, ptr addrspace(3) [[GEP5]], align 4
+; CHECK-NEXT: [[GEP6:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 6
+; CHECK-NEXT: [[DOTI228:%.*]] = load i32, ptr addrspace(3) [[GEP6]], align 4
+; CHECK-NEXT: [[GEP7:%.*]] = getelementptr [8 x i32], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 7
+; CHECK-NEXT: [[DOTI3310:%.*]] = load i32, ptr addrspace(3) [[GEP7]], align 4
; CHECK-NEXT: [[DOTUPTO011:%.*]] = insertelement <4 x i32> poison, i32 [[DOTI04]], i32 0
; CHECK-NEXT: [[DOTUPTO112:%.*]] = insertelement <4 x i32> [[DOTUPTO011]], i32 [[DOTI116]], i32 1
; CHECK-NEXT: [[DOTUPTO213:%.*]] = insertelement <4 x i32> [[DOTUPTO112]], i32 [[DOTI228]], i32 2
@@ -207,13 +225,20 @@ define <4 x i32> @multid_load_test() #0 {
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 0
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) [[GEP]], align 4
-; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) getelementptr ([36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 1), align 4
-; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) getelementptr ([36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 2), align 4
-; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(3) getelementptr ([36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 3), align 4
-; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr addrspace(3) getelementptr inbounds ([36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 16), align 4
-; CHECK-NEXT: [[DOTI13:%.*]] = load i32, ptr addrspace(3) getelementptr ([36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 17), align 4
-; CHECK-NEXT: [[DOTI25:%.*]] = load i32, ptr addrspace(3) getelementptr ([36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 18), align 4
-; CHECK-NEXT: [[DOTI37:%.*]] = load i32, ptr addrspace(3) getelementptr ([36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 19), align 4
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 1
+; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) [[GEP1]], align 4
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 2
+; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) [[GEP2]], align 4
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 3
+; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(3) [[GEP3]], align 4
+; CHECK-NEXT: [[GEP16:%.*]] = getelementptr inbounds [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 16
+; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr addrspace(3) [[GEP16]], align 4
+; CHECK-NEXT: [[GEP17:%.*]] = getelementptr [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 17
+; CHECK-NEXT: [[DOTI13:%.*]] = load i32, ptr addrspace(3) [[GEP17]], align 4
+; CHECK-NEXT: [[GEP18:%.*]] = getelementptr [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 18
+; CHECK-NEXT: [[DOTI25:%.*]] = load i32, ptr addrspace(3) [[GEP18]], align 4
+; CHECK-NEXT: [[GEP19:%.*]] = getelementptr [36 x i32], ptr addrspace(3) @groupshared2dArrayofVectors.scalarized.1dim, i32 0, i32 19
+; CHECK-NEXT: [[DOTI37:%.*]] = load i32, ptr addrspace(3) [[GEP19]], align 4
; CHECK-NEXT: [[DOTI08:%.*]] = add i32 [[TMP1]], [[TMP5]]
; CHECK-NEXT: [[DOTI19:%.*]] = add i32 [[TMP2]], [[DOTI13]]
; CHECK-NEXT: [[DOTI210:%.*]] = add i32 [[TMP3]], [[DOTI25]]
diff --git a/llvm/test/CodeGen/DirectX/scalar-store.ll b/llvm/test/CodeGen/DirectX/scalar-store.ll
index 6cf97bda984fc..c3a52a6fcb655 100644
--- a/llvm/test/CodeGen/DirectX/scalar-store.ll
+++ b/llvm/test/CodeGen/DirectX/scalar-store.ll
@@ -16,11 +16,16 @@
define void @store_array_vec_test () local_unnamed_addr #0 {
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 0
; CHECK-NEXT: store float 1.000000e+00, ptr addrspace(3) [[GEP]], align 16
-; CHECK-NEXT: store float 2.000000e+00, ptr addrspace(3) getelementptr ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 1), align 4
-; CHECK-NEXT: store float 3.000000e+00, ptr addrspace(3) getelementptr ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 2), align 8
-; CHECK-NEXT: store float 2.000000e+00, ptr addrspace(3) getelementptr inbounds ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 3), align 16
-; CHECK-NEXT: store float 4.000000e+00, ptr addrspace(3) getelementptr ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4), align 4
-; CHECK-NEXT: store float 6.000000e+00, ptr addrspace(3) getelementptr ([6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5), align 8
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr [6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 1
+; CHECK-NEXT: store float 2.000000e+00, ptr addrspace(3) [[GEP1]], align 4
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr [6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 2
+; CHECK-NEXT: store float 3.000000e+00, ptr addrspace(3) [[GEP2]], align 8
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 3
+; CHECK-NEXT: store float 2.000000e+00, ptr addrspace(3) [[GEP3]], align 16
+; CHECK-NEXT: [[GEP4:%.*]] = getelementptr [6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 4
+; CHECK-NEXT: store float 4.000000e+00, ptr addrspace(3) [[GEP4]], align 4
+; CHECK-NEXT: [[GEP5:%.*]] = getelementptr [6 x float], ptr addrspace(3) @arrayofVecData.scalarized.1dim, i32 0, i32 5
+; CHECK-NEXT: store float 6.000000e+00, ptr addrspace(3) [[GEP5]], align 8
; CHECK-NEXT: ret void
;
store <3 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, ptr addrspace(3) @"arrayofVecData", align 16
@@ -34,11 +39,14 @@ define void @store_vec_test(<4 x i32> %inputVec) #0 {
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 0
; CHECK-NEXT: store i32 [[INPUTVEC_I01]], ptr addrspace(3) [[GEP]], align 4
; CHECK-NEXT: [[INPUTVEC_I12:%.*]] = extractelement <4 x i32> %inputVec, i32 1
-; CHECK-NEXT: store i32 [[INPUTVEC_I12]], ptr addrspace(3) getelementptr ([4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 1), align 4
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 1
+; CHECK-NEXT: store i32 [[INPUTVEC_I12]], ptr addrspace(3) [[GEP1]], align 4
; CHECK-NEXT: [[INPUTVEC_I23:%.*]] = extractelement <4 x i32> %inputVec, i32 2
-; CHECK-NEXT: store i32 [[INPUTVEC_I23]], ptr addrspace(3) getelementptr ([4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 2), align 4
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 2
+; CHECK-NEXT: store i32 [[INPUTVEC_I23]], ptr addrspace(3) [[GEP2]], align 4
; CHECK-NEXT: [[INPUTVEC_I34:%.*]] = extractelement <4 x i32> %inputVec, i32 3
-; CHECK-NEXT: store i32 [[INPUTVEC_I34]], ptr addrspace(3) getelementptr ([4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 3), align 4
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr [4 x i32], ptr addrspace(3) @vecData.scalarized, i32 0, i32 3
+; CHECK-NEXT: store i32 [[INPUTVEC_I34]], ptr addrspace(3) [[GEP3]], align 4
; CHECK-NEXT: ret void
;
store <4 x i32> %inputVec, <4 x i32> addrspace(3)* @"vecData", align 4
diff --git a/llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll b/llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
index 420b77645f0b7..99fca79fa3b1e 100644
--- a/llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
+++ b/llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
@@ -7,12 +7,18 @@
define internal void @main() #1 {
; CHECK-LABEL: define internal void @main() {
; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[DOTI0:%.*]] = load float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 3), align 16
-; CHECK-NEXT: [[DOTI11:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 3), i32 1), align 4
-; CHECK-NEXT: [[DOTI22:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 3), i32 2), align 8
-; CHECK-NEXT: [[DOTI03:%.*]] = load float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 6), align 16
-; CHECK-NEXT: [[DOTI15:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 6), i32 1), align 4
-; CHECK-NEXT: [[DOTI27:%.*]] = load float, ptr getelementptr (float, ptr getelementptr inbounds ([24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 6), i32 2), align 8
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 3
+; CHECK-NEXT: [[DOTI0:%.*]] = load float, ptr [[GEP3]], align 16
+; CHECK-NEXT: [[GEP4:%.*]] = getelementptr float, ptr [[GEP3]], i32 1
+; CHECK-NEXT: [[DOTI11:%.*]] = load float, ptr [[GEP4]], align 4
+; CHECK-NEXT: [[GEP5:%.*]] = getelementptr float, ptr [[GEP3]], i32 2
+; CHECK-NEXT: [[DOTI22:%.*]] = load float, ptr [[GEP5]], align 8
+; CHECK-NEXT: [[GEP6:%.*]] = getelementptr inbounds [24 x float], ptr @StaticArr.scalarized.1dim, i32 0, i32 6
+; CHECK-NEXT: [[DOTI03:%.*]] = load float, ptr [[GEP6]], align 16
+; CHECK-NEXT: [[GEP7:%.*]] = getelementptr float, ptr [[GEP6]], i32 1
+; CHECK-NEXT: [[DOTI15:%.*]] = load float, ptr [[GEP7]], align 4
+; CHECK-NEXT: [[GEP8:%.*]] = getelementptr float, ptr [[GEP6]], i32 2
+; CHECK-NEXT: [[DOTI27:%.*]] = load float, ptr [[GEP8]], align 8
; CHECK-NEXT: ret void
;
entry:
diff --git a/llvm/test/tools/dxil-dis/constantexpr-gep.ll b/llvm/test/tools/dxil-dis/constantexpr-gep.ll
index 59251474f1a4b..ae75d2211fcd1 100644
--- a/llvm/test/tools/dxil-dis/constantexpr-gep.ll
+++ b/llvm/test/tools/dxil-dis/constantexpr-gep.ll
@@ -6,7 +6,8 @@ target triple = "dxil-unknown-shadermodel6.7-library"
define i32 @fn() #0 {
; CHECK-LABEL: define i32 @fn()
-; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32 addrspace(3)* getelementptr inbounds ([10 x i32], [10 x i32] addrspace(3)* [[GLOBAL]], i32 0, i32 1), align 4
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr [10 x i32], [10 x i32] addrspace(3)* @g, i32 0, i32 1
+; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32 addrspace(3)* [[GEP]], align 4
; CHECK-NEXT: ret i32 [[LOAD]]
;
%gep = getelementptr [10 x i32], ptr addrspace(3) @g, i32 0, i32 1
@@ -16,7 +17,8 @@ define i32 @fn() #0 {
define i32 @fn2() #0 {
; CHECK-LABEL: define i32 @fn2()
-; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32 addrspace(3)* getelementptr inbounds ([10 x i32], [10 x i32] addrspace(3)* [[GLOBAL]], i32 0, i32 2), align 4
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr [10 x i32], [10 x i32] addrspace(3)* @g, i32 0, i32 2
+; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32 addrspace(3)* [[GEP]], align 4
; CHECK-NEXT: ret i32 [[LOAD]]
;
%ld = load i32, ptr addrspace(3) getelementptr ([10 x i32], ptr addrspace(3) @g, i32 0, i32 2), align 4
@@ -25,7 +27,8 @@ define i32 @fn2() #0 {
define i32 @fn3() #0 {
; CHECK-LABEL: define i32 @fn3()
-; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32 addrspace(3)* getelementptr inbounds ([10 x i32], [10 x i32] addrspace(3)* [[GLOBAL]], i32 0, i32 3), align 4
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr [10 x i32], [10 x i32] addrspace(3)* @g, i32 0, i32 3
+; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32 addrspace(3)* [[GEP]], align 4
; CHECK-NEXT: ret i32 [[LOAD]]
;
%ld = load i32, ptr addrspace(3) getelementptr (i8, ptr addrspace(3) @g, i32 12), align 4
More information about the llvm-commits
mailing list