Skip to content

Commit 4e05834

Browse files
committed
[CIR][LowerToLLVM] fixup! GEP with a constant offset should have inbounds attribute
1 parent eacaabb commit 4e05834

15 files changed

+85
-76
lines changed

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

+18-15
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::GlobalViewAttr globalAttr,
607607
auto resTy = addrOp.getType();
608608
auto eltTy = converter->convertType(sourceType);
609609
addrOp = rewriter.create<mlir::LLVM::GEPOp>(loc, resTy, eltTy, addrOp,
610-
indices, true);
610+
indices, /*inbounds*/ true);
611611
}
612612

613613
auto ptrTy = mlir::dyn_cast<cir::PointerType>(globalAttr.getType());
@@ -851,8 +851,9 @@ mlir::LogicalResult CIRToLLVMPtrStrideOpLowering::matchAndRewrite(
851851
}
852852
}
853853

854-
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
855-
ptrStrideOp, resultTy, elementTy, adaptor.getBase(), index);
854+
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(ptrStrideOp, resultTy,
855+
elementTy, adaptor.getBase(),
856+
index, /*inbounds*/ true);
856857
return mlir::success();
857858
}
858859

@@ -873,8 +874,9 @@ mlir::LogicalResult CIRToLLVMBaseClassAddrOpLowering::matchAndRewrite(
873874
}
874875

875876
if (baseClassOp.getAssumeNotNull()) {
876-
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
877-
baseClassOp, resultType, byteType, derivedAddr, offset);
877+
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(baseClassOp, resultType,
878+
byteType, derivedAddr,
879+
offset, /*inbounds*/ true);
878880
} else {
879881
auto loc = baseClassOp.getLoc();
880882
mlir::Value isNull = rewriter.create<mlir::LLVM::ICmpOp>(
@@ -900,7 +902,8 @@ mlir::LogicalResult CIRToLLVMDerivedClassAddrOpLowering::matchAndRewrite(
900902
mlir::IntegerType::Signless);
901903
if (derivedClassOp.getAssumeNotNull()) {
902904
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(derivedClassOp, resultType,
903-
byteType, baseAddr, offset);
905+
byteType, baseAddr, offset,
906+
/*inbounds*/ true);
904907
} else {
905908
auto loc = derivedClassOp.getLoc();
906909
mlir::Value isNull = rewriter.create<mlir::LLVM::ICmpOp>(
@@ -974,8 +977,8 @@ mlir::LogicalResult CIRToLLVMVTTAddrPointOpLowering::matchAndRewrite(
974977
offsets.push_back(0);
975978
offsets.push_back(adaptor.getOffset());
976979
}
977-
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(op, resultType, eltType,
978-
llvmAddr, offsets, true);
980+
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
981+
op, resultType, eltType, llvmAddr, offsets, /*inbounds*/ true);
979982
return mlir::success();
980983
}
981984

@@ -1032,7 +1035,7 @@ mlir::LogicalResult CIRToLLVMCastOpLowering::matchAndRewrite(
10321035
auto elementTy = convertTy(ptrTy.getPointee());
10331036
auto offset = llvm::SmallVector<mlir::LLVM::GEPArg>{0};
10341037
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
1035-
castOp, targetType, elementTy, sourceValue, offset);
1038+
castOp, targetType, elementTy, sourceValue, offset, /*inbounds*/ true);
10361039
break;
10371040
}
10381041
case cir::CastKind::int_to_bool: {
@@ -3236,8 +3239,8 @@ mlir::LogicalResult CIRToLLVMGetMemberOpLowering::matchAndRewrite(
32363239
// is always zero. The second offset tell us which member it will access.
32373240
llvm::SmallVector<mlir::LLVM::GEPArg, 2> offset{0, op.getIndex()};
32383241
const auto elementTy = getTypeConverter()->convertType(structTy);
3239-
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(op, llResTy, elementTy,
3240-
adaptor.getAddr(), offset);
3242+
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
3243+
op, llResTy, elementTy, adaptor.getAddr(), offset, /*inbounds*/ true);
32413244
return mlir::success();
32423245
}
32433246
case cir::StructType::Union:
@@ -3337,8 +3340,8 @@ mlir::LogicalResult CIRToLLVMVTableAddrPointOpLowering::matchAndRewrite(
33373340
}
33383341

33393342
assert(eltType && "Shouldn't ever be missing an eltType here");
3340-
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(op, targetType, eltType,
3341-
symAddr, offsets, true);
3343+
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
3344+
op, targetType, eltType, symAddr, offsets, /*inbounds*/ true);
33423345

33433346
return mlir::success();
33443347
}
@@ -3837,8 +3840,8 @@ mlir::LogicalResult CIRToLLVMPtrMaskOpLowering::matchAndRewrite(
38373840
mlir::Value diff = rewriter.create<mlir::LLVM::SubOp>(loc, intPtr, masked);
38383841
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
38393842
op, getTypeConverter()->convertType(op.getType()),
3840-
mlir::IntegerType::get(moduleOp->getContext(), 8), adaptor.getPtr(),
3841-
diff);
3843+
mlir::IntegerType::get(moduleOp->getContext(), 8), adaptor.getPtr(), diff,
3844+
/*inbounds*/ true);
38423845
return mlir::success();
38433846
}
38443847

clang/test/CIR/CodeGen/address-space-conversion.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void test_side_effect(pi1_t b) {
6262
// CIR: %[[#CAST:]] = cir.const #cir.ptr<null> : !cir.ptr<!s32i, addrspace(target<2>)>
6363
// CIR-NEXT: cir.store %[[#CAST]], %{{[0-9]+}} : !cir.ptr<!s32i, addrspace(target<2>)>, !cir.ptr<!cir.ptr<!s32i, addrspace(target<2>)>>
6464

65-
// LLVM: %{{[0-9]+}} = getelementptr i32, ptr addrspace(1) %{{[0-9]+}}, i64 1
65+
// LLVM: %{{[0-9]+}} = getelementptr inbounds i32, ptr addrspace(1) %{{[0-9]+}}, i64 1
6666
// LLVM: store ptr addrspace(2) null, ptr %{{[0-9]+}}, align 8
6767

6868
}

clang/test/CIR/CodeGen/clear_cache.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ char buffer[32] = "This is a largely unused buffer";
2020
// CIR: cir.clear_cache %[[VAL_3]] : !cir.ptr<!void>, %[[VAL_8]],
2121

2222
// LLVM-LABEL: main
23-
// LLVM: call void @llvm.clear_cache(ptr @buffer, ptr getelementptr (i8, ptr @buffer, i64 32))
23+
// LLVM: call void @llvm.clear_cache(ptr @buffer, ptr getelementptr inbounds (i8, ptr @buffer, i64 32))
2424

2525
int main(void) {
2626
__builtin___clear_cache(buffer, buffer+32);

clang/test/CIR/CodeGen/inbouds.c

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: %clang_cc1 -triple aarch64-none-linux-android21 -fclangir -emit-llvm %s -o %t.ll
2+
// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM
3+
4+
void foo(int *iptr) { iptr + 2; }
5+
6+
// LLVM: getelementptr inbounds i32,

clang/test/CIR/CodeGen/initlist-ptr-ptr.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,14 @@ void test() {
7777
// LLVM: [[ELEM_ARRAY_PTR:%.*]] = alloca [2 x ptr], i64 1, align 8
7878
// LLVM: br label %[[SCOPE_START:.*]]
7979
// LLVM: [[SCOPE_START]]: ; preds = %0
80-
// LLVM: [[PTR_FIRST_ELEM:%.*]] = getelementptr ptr, ptr [[ELEM_ARRAY_PTR]], i32 0
80+
// LLVM: [[PTR_FIRST_ELEM:%.*]] = getelementptr inbounds ptr, ptr [[ELEM_ARRAY_PTR]], i32 0
8181
// LLVM: store ptr @.str, ptr [[PTR_FIRST_ELEM]], align 8
82-
// LLVM: [[PTR_SECOND_ELEM:%.*]] = getelementptr ptr, ptr [[PTR_FIRST_ELEM]], i64 1
82+
// LLVM: [[PTR_SECOND_ELEM:%.*]] = getelementptr inbounds ptr, ptr [[PTR_FIRST_ELEM]], i64 1
8383
// LLVM: store ptr @.str.1, ptr [[PTR_SECOND_ELEM]], align 8
84-
// LLVM: [[INIT_START_FLD_PTR:%.*]] = getelementptr %"class.std::initializer_list<const char *>", ptr [[INIT_STRUCT]], i32 0, i32 0
84+
// LLVM: [[INIT_START_FLD_PTR:%.*]] = getelementptr inbounds %"class.std::initializer_list<const char *>", ptr [[INIT_STRUCT]], i32 0, i32 0
8585
// LLVM: store ptr [[PTR_FIRST_ELEM]], ptr [[INIT_START_FLD_PTR]], align 8
86-
// LLVM: [[ELEM_ARRAY_END:%.*]] = getelementptr ptr, ptr [[PTR_FIRST_ELEM]], i64 2
87-
// LLVM: [[INIT_END_FLD_PTR:%.*]] = getelementptr %"class.std::initializer_list<const char *>", ptr [[INIT_STRUCT]], i32 0, i32 1
86+
// LLVM: [[ELEM_ARRAY_END:%.*]] = getelementptr inbounds ptr, ptr [[PTR_FIRST_ELEM]], i64 2
87+
// LLVM: [[INIT_END_FLD_PTR:%.*]] = getelementptr inbounds %"class.std::initializer_list<const char *>", ptr [[INIT_STRUCT]], i32 0, i32 1
8888
// LLVM: store ptr [[ELEM_ARRAY_END]], ptr [[INIT_END_FLD_PTR]], align 8
8989
// LLVM: [[ARG2PASS:%.*]] = load %"class.std::initializer_list<const char *>", ptr [[INIT_STRUCT]], align 8
9090
// LLVM: call void @_ZSt1fIPKcEvSt16initializer_listIT_E(%"class.std::initializer_list<const char *>" [[ARG2PASS]])

clang/test/CIR/CodeGen/pointer-arith-ext.c

+8-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ void *f2(void *a, int b) { return a + b; }
1515
// LLVM: %[[PTR:.*]] = load ptr, ptr {{.*}}, align 8
1616
// LLVM: %[[TOEXT:.*]] = load i32, ptr {{.*}}, align 4
1717
// LLVM: %[[STRIDE:.*]] = sext i32 %[[TOEXT]] to i64
18-
// LLVM: getelementptr i8, ptr %[[PTR]], i64 %[[STRIDE]]
18+
// LLVM: getelementptr inbounds i8, ptr %[[PTR]], i64 %[[STRIDE]]
1919

2020
// These test the same paths above, just make sure it does not crash.
2121
void *f2_0(void *a, int b) { return &a[b]; }
@@ -28,7 +28,7 @@ void *f3_1(int a, void *b) { return (a += b); }
2828
// CIR: cir.cast(ptr_to_int, %[[NEW_PTR]] : !cir.ptr<!void>), !s32i
2929

3030
// LLVM-LABEL: @f3_1
31-
// LLVM: %[[NEW_PTR:.*]] = getelementptr
31+
// LLVM: %[[NEW_PTR:.*]] = getelementptr inbounds
3232
// LLVM: ptrtoint ptr %[[NEW_PTR]] to i32
3333

3434
void *f4(void *a, int b) { return a - b; }
@@ -43,7 +43,7 @@ void *f4(void *a, int b) { return a - b; }
4343
// LLVM: %[[TOEXT:.*]] = load i32, ptr {{.*}}, align 4
4444
// LLVM: %[[STRIDE:.*]] = sext i32 %[[TOEXT]] to i64
4545
// LLVM: %[[SUB:.*]] = sub i64 0, %[[STRIDE]]
46-
// LLVM: getelementptr i8, ptr %[[PTR]], i64 %[[SUB]]
46+
// LLVM: getelementptr inbounds i8, ptr %[[PTR]], i64 %[[SUB]]
4747

4848
// Similar to f4, just make sure it does not crash.
4949
void *f4_1(void *a, int b) { return (a -= b); }
@@ -58,7 +58,7 @@ FP f5(FP a, int b) { return a + b; }
5858
// LLVM: %[[PTR:.*]] = load ptr, ptr {{.*}}, align 8
5959
// LLVM: %[[TOEXT:.*]] = load i32, ptr {{.*}}, align 4
6060
// LLVM: %[[STRIDE:.*]] = sext i32 %[[TOEXT]] to i64
61-
// LLVM: getelementptr i8, ptr %[[PTR]], i64 %[[STRIDE]]
61+
// LLVM: getelementptr inbounds i8, ptr %[[PTR]], i64 %[[STRIDE]]
6262

6363
// These test the same paths above, just make sure it does not crash.
6464
FP f5_1(FP a, int b) { return (a += b); }
@@ -77,7 +77,7 @@ FP f7(FP a, int b) { return a - b; }
7777
// LLVM: %[[TOEXT:.*]] = load i32, ptr {{.*}}, align 4
7878
// LLVM: %[[STRIDE:.*]] = sext i32 %[[TOEXT]] to i64
7979
// LLVM: %[[SUB:.*]] = sub i64 0, %[[STRIDE]]
80-
// LLVM: getelementptr i8, ptr %[[PTR]], i64 %[[SUB]]
80+
// LLVM: getelementptr inbounds i8, ptr %[[PTR]], i64 %[[SUB]]
8181

8282
// Similar to f7, just make sure it does not crash.
8383
FP f7_1(FP a, int b) { return (a -= b); }
@@ -93,7 +93,7 @@ void f8(void *a, int b) { return *(a + b); }
9393
// LLVM: %[[PTR:.*]] = load ptr, ptr {{.*}}, align 8
9494
// LLVM: %[[TOEXT:.*]] = load i32, ptr {{.*}}, align 4
9595
// LLVM: %[[STRIDE:.*]] = sext i32 %[[TOEXT]] to i64
96-
// LLVM: getelementptr i8, ptr %[[PTR]], i64 %[[STRIDE]]
96+
// LLVM: getelementptr inbounds i8, ptr %[[PTR]], i64 %[[STRIDE]]
9797
// LLVM: ret void
9898

9999
void f8_1(void *a, int b) { return a[b]; }
@@ -107,7 +107,7 @@ void f8_1(void *a, int b) { return a[b]; }
107107
// LLVM: %[[PTR:.*]] = load ptr, ptr {{.*}}, align 8
108108
// LLVM: %[[TOEXT:.*]] = load i32, ptr {{.*}}, align 4
109109
// LLVM: %[[STRIDE:.*]] = sext i32 %[[TOEXT]] to i64
110-
// LLVM: getelementptr i8, ptr %[[PTR]], i64 %[[STRIDE]]
110+
// LLVM: getelementptr inbounds i8, ptr %[[PTR]], i64 %[[STRIDE]]
111111
// LLVM: ret void
112112

113113
unsigned char *p(unsigned int x) {
@@ -121,4 +121,4 @@ unsigned char *p(unsigned int x) {
121121
// CIR: cir.ptr_stride({{.*}} : !cir.ptr<!u8i>, %[[SUB]] : !u32i), !cir.ptr<!u8i>
122122

123123
// LLVM-LABEL: @p
124-
// LLVM: getelementptr i8, ptr {{.*}}
124+
// LLVM: getelementptr inbounds i8, ptr {{.*}}

clang/test/CIR/CodeGen/var-arg-float.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ double f1(int n, ...) {
8282
// LLVM: [[RETP:%.*]] = alloca double, i64 1, align 8
8383
// LLVM: [[RESP:%.*]] = alloca double, i64 1, align 8
8484
// LLVM: call void @llvm.va_start.p0(ptr [[VARLIST:%.*]])
85-
// LLVM: [[VR_OFFS_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 4
85+
// LLVM: [[VR_OFFS_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 4
8686
// LLVM: [[VR_OFFS:%.*]] = load i32, ptr [[VR_OFFS_P]], align 4
8787
// LLVM-NEXT: [[CMP0:%.*]] = icmp sge i32 [[VR_OFFS]], 0
8888
// LLVM-NEXT: br i1 [[CMP0]], label %[[BB_ON_STACK:.*]], label %[[BB_MAY_REG:.*]]
@@ -94,16 +94,16 @@ double f1(int n, ...) {
9494
// LLVM-NEXT: br i1 [[CMP1]], label %[[BB_IN_REG:.*]], label %[[BB_ON_STACK]]
9595

9696
// LLVM: [[BB_IN_REG]]: ;
97-
// LLVM-NEXT: [[VR_TOP_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 2
97+
// LLVM-NEXT: [[VR_TOP_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 2
9898
// LLVM-NEXT: [[VR_TOP:%.*]] = load ptr, ptr [[VR_TOP_P]], align 8
9999
// LLVM-NEXT: [[EXT64_VR_OFFS:%.*]] = sext i32 [[VR_OFFS]] to i64
100-
// LLVM-NEXT: [[IN_REG_OUTPUT:%.*]] = getelementptr i8, ptr [[VR_TOP]], i64 [[EXT64_VR_OFFS]]
100+
// LLVM-NEXT: [[IN_REG_OUTPUT:%.*]] = getelementptr inbounds i8, ptr [[VR_TOP]], i64 [[EXT64_VR_OFFS]]
101101
// LLVM-NEXT: br label %[[BB_END:.*]]
102102

103103
// LLVM: [[BB_ON_STACK]]: ;
104-
// LLVM-NEXT: [[STACK_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 0
104+
// LLVM-NEXT: [[STACK_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 0
105105
// LLVM-NEXT: [[STACK_V:%.*]] = load ptr, ptr [[STACK_P]], align 8
106-
// LLVM-NEXT: [[NEW_STACK_V:%.*]] = getelementptr i8, ptr [[STACK_V]], i64 8
106+
// LLVM-NEXT: [[NEW_STACK_V:%.*]] = getelementptr inbounds i8, ptr [[STACK_V]], i64 8
107107
// LLVM-NEXT: store ptr [[NEW_STACK_V]], ptr [[STACK_P]], align 8
108108
// LLVM-NEXT: br label %[[BB_END]]
109109

clang/test/CIR/CodeGen/var-arg-scope.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void f1(__builtin_va_list c) {
7171
// LLVM: br label %[[SCOPE_FRONT:.*]]
7272

7373
// LLVM: [[SCOPE_FRONT]]: ; preds = %1
74-
// LLVM: [[GR_OFFS_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 3
74+
// LLVM: [[GR_OFFS_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 3
7575
// LLVM: [[GR_OFFS:%.*]] = load i32, ptr [[GR_OFFS_P]], align 4
7676
// LLVM-NEXT: [[CMP0:%.*]] = icmp sge i32 [[GR_OFFS]], 0
7777
// LLVM-NEXT: br i1 [[CMP0]], label %[[BB_ON_STACK:.*]], label %[[BB_MAY_REG:.*]]
@@ -83,16 +83,16 @@ void f1(__builtin_va_list c) {
8383
// LLVM-NEXT: br i1 [[CMP1]], label %[[BB_IN_REG:.*]], label %[[BB_ON_STACK]]
8484

8585
// LLVM: [[BB_IN_REG]]: ;
86-
// LLVM-NEXT: [[GR_TOP_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 1
86+
// LLVM-NEXT: [[GR_TOP_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 1
8787
// LLVM-NEXT: [[GR_TOP:%.*]] = load ptr, ptr [[GR_TOP_P]], align 8
8888
// LLVM-NEXT: [[EXT64_GR_OFFS:%.*]] = sext i32 [[GR_OFFS]] to i64
89-
// LLVM-NEXT: [[IN_REG_OUTPUT:%.*]] = getelementptr i8, ptr [[GR_TOP]], i64 [[EXT64_GR_OFFS]]
89+
// LLVM-NEXT: [[IN_REG_OUTPUT:%.*]] = getelementptr inbounds i8, ptr [[GR_TOP]], i64 [[EXT64_GR_OFFS]]
9090
// LLVM-NEXT: br label %[[BB_END:.*]]
9191

9292
// LLVM: [[BB_ON_STACK]]: ;
93-
// LLVM-NEXT: [[STACK_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 0
93+
// LLVM-NEXT: [[STACK_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 0
9494
// LLVM-NEXT: [[STACK_V:%.*]] = load ptr, ptr [[STACK_P]], align 8
95-
// LLVM-NEXT: [[NEW_STACK_V:%.*]] = getelementptr i8, ptr [[STACK_V]], i64 8
95+
// LLVM-NEXT: [[NEW_STACK_V:%.*]] = getelementptr inbounds i8, ptr [[STACK_V]], i64 8
9696
// LLVM-NEXT: store ptr [[NEW_STACK_V]], ptr [[STACK_P]], align 8
9797
// LLVM-NEXT: br label %[[BB_END]]
9898

clang/test/CIR/CodeGen/var-arg.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ int f1(int n, ...) {
8585
// LLVM: [[RETP:%.*]] = alloca i32, i64 1, align 4
8686
// LLVM: [[RESP:%.*]] = alloca i32, i64 1, align 4
8787
// LLVM: call void @llvm.va_start.p0(ptr [[VARLIST:%.*]])
88-
// LLVM: [[GR_OFFS_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 3
88+
// LLVM: [[GR_OFFS_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 3
8989
// LLVM: [[GR_OFFS:%.*]] = load i32, ptr [[GR_OFFS_P]], align 4
9090
// LLVM-NEXT: [[CMP0:%.*]] = icmp sge i32 [[GR_OFFS]], 0
9191
// LLVM-NEXT: br i1 [[CMP0]], label %[[BB_ON_STACK:.*]], label %[[BB_MAY_REG:.*]]
@@ -97,16 +97,16 @@ int f1(int n, ...) {
9797
// LLVM-NEXT: br i1 [[CMP1]], label %[[BB_IN_REG:.*]], label %[[BB_ON_STACK]]
9898

9999
// LLVM: [[BB_IN_REG]]: ;
100-
// LLVM-NEXT: [[GR_TOP_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 1
100+
// LLVM-NEXT: [[GR_TOP_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 1
101101
// LLVM-NEXT: [[GR_TOP:%.*]] = load ptr, ptr [[GR_TOP_P]], align 8
102102
// LLVM-NEXT: [[EXT64_GR_OFFS:%.*]] = sext i32 [[GR_OFFS]] to i64
103-
// LLVM-NEXT: [[IN_REG_OUTPUT:%.*]] = getelementptr i8, ptr [[GR_TOP]], i64 [[EXT64_GR_OFFS]]
103+
// LLVM-NEXT: [[IN_REG_OUTPUT:%.*]] = getelementptr inbounds i8, ptr [[GR_TOP]], i64 [[EXT64_GR_OFFS]]
104104
// LLVM-NEXT: br label %[[BB_END:.*]]
105105

106106
// LLVM: [[BB_ON_STACK]]: ;
107-
// LLVM-NEXT: [[STACK_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 0
107+
// LLVM-NEXT: [[STACK_P:%.*]] = getelementptr inbounds %struct.__va_list, ptr [[VARLIST]], i32 0, i32 0
108108
// LLVM-NEXT: [[STACK_V:%.*]] = load ptr, ptr [[STACK_P]], align 8
109-
// LLVM-NEXT: [[NEW_STACK_V:%.*]] = getelementptr i8, ptr [[STACK_V]], i64 8
109+
// LLVM-NEXT: [[NEW_STACK_V:%.*]] = getelementptr inbounds i8, ptr [[STACK_V]], i64 8
110110
// LLVM-NEXT: store ptr [[NEW_STACK_V]], ptr [[STACK_P]], align 8
111111
// LLVM-NEXT: br label %[[BB_END]]
112112

clang/test/CIR/CodeGen/virtual-base-cast.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ A* a() { return x; }
2525

2626
// FIXME: this version should include null check.
2727
// LLVM-LABEL: @_Z1av()
28-
// LLVM: %[[OFFSET_OFFSET:.*]] = getelementptr i8, ptr {{.*}}, i64 -32
28+
// LLVM: %[[OFFSET_OFFSET:.*]] = getelementptr inbounds i8, ptr {{.*}}, i64 -32
2929
// LLVM: %[[OFFSET_PTR:.*]] = load i64, ptr %[[OFFSET_OFFSET]], align 8
30-
// LLVM: %[[VBASE_ADDR:.*]] = getelementptr i8, ptr {{.*}}, i64 %[[OFFSET_PTR]]
30+
// LLVM: %[[VBASE_ADDR:.*]] = getelementptr inbounds i8, ptr {{.*}}, i64 %[[OFFSET_PTR]]
3131
// LLVM: store ptr %[[VBASE_ADDR]], ptr {{.*}}, align 8
3232

3333
B* b() { return x; }
@@ -46,8 +46,8 @@ BB* d() { return y; }
4646
// CIR: cir.binop(add, %[[OFFSET]], %[[ADJUST]]) : !s64i
4747

4848
// LLVM-LABEL: @_Z1dv
49-
// LLVM: %[[OFFSET_OFFSET:.*]] = getelementptr i8, ptr {{.*}}, i64 -48
49+
// LLVM: %[[OFFSET_OFFSET:.*]] = getelementptr inbounds i8, ptr {{.*}}, i64 -48
5050
// LLVM: %[[OFFSET_PTR:.*]] = load i64, ptr %[[OFFSET_OFFSET]], align 8
5151
// LLVM: %[[ADJUST:.*]] = add i64 %[[OFFSET_PTR]], 16
52-
// LLVM: %[[VBASE_ADDR:.*]] = getelementptr i8, ptr {{.*}}, i64 %[[ADJUST]]
52+
// LLVM: %[[VBASE_ADDR:.*]] = getelementptr inbounds i8, ptr {{.*}}, i64 %[[ADJUST]]
5353
// LLVM: store ptr %[[VBASE_ADDR]],

clang/test/CIR/Lowering/data-member.cir

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ module @test attributes {
4545
}
4646
// MLIR: llvm.func @get_runtime_member(%[[ARG0:.+]]: !llvm.ptr, %[[ARG1:.+]]: i64) -> !llvm.ptr
4747
// MLIR-NEXT: %[[#PTR:]] = llvm.bitcast %[[ARG0]] : !llvm.ptr to !llvm.ptr
48-
// MLIR-NEXT: %[[#VAL:]] = llvm.getelementptr %[[#PTR]][%[[ARG1]]] : (!llvm.ptr, i64) -> !llvm.ptr, i8
48+
// MLIR-NEXT: %[[#VAL:]] = llvm.getelementptr inbounds %[[#PTR]][%[[ARG1]]] : (!llvm.ptr, i64) -> !llvm.ptr, i8
4949
// MLIR-NEXT: %[[#RET:]] = llvm.bitcast %[[#VAL]] : !llvm.ptr to !llvm.ptr
5050
// MLIR-NEXT: llvm.return %[[#RET]] : !llvm.ptr
5151
// MLIR-NEXT: }
5252

5353
// LLVM: define ptr @get_runtime_member(ptr %[[ARG0:.+]], i64 %[[ARG1:.+]])
54-
// LLVM-NEXT: %[[#VAL:]] = getelementptr i8, ptr %[[ARG0]], i64 %[[ARG1]]
54+
// LLVM-NEXT: %[[#VAL:]] = getelementptr inbounds i8, ptr %[[ARG0]], i64 %[[ARG1]]
5555
// LLVM-NEXT: ret ptr %[[#VAL]]
5656
// LLVM-NEXT: }
5757
}

clang/test/CIR/Lowering/dot.cir

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ module {
8383
// MLIR: %[[VAL_23:.*]] = llvm.load %[[VAL_4]] {alignment = 8 : i64} : !llvm.ptr -> !llvm.ptr
8484
// MLIR: %[[VAL_24:.*]] = llvm.load %[[VAL_2]] {alignment = 4 : i64} : !llvm.ptr -> i32
8585
// MLIR: %[[VAL_25:.*]] = llvm.sext %[[VAL_24]] : i32 to i64
86-
// MLIR: %[[VAL_26:.*]] = llvm.getelementptr %[[VAL_23]]{{\[}}%[[VAL_25]]] : (!llvm.ptr, i64) -> !llvm.ptr, f64
86+
// MLIR: %[[VAL_26:.*]] = llvm.getelementptr inbounds %[[VAL_23]]{{\[}}%[[VAL_25]]] : (!llvm.ptr, i64) -> !llvm.ptr, f64
8787
// MLIR: %[[VAL_27:.*]] = llvm.load %[[VAL_26]] {alignment = 8 : i64} : !llvm.ptr -> f64
8888
// MLIR: %[[VAL_28:.*]] = llvm.load %[[VAL_6]] {alignment = 8 : i64} : !llvm.ptr -> !llvm.ptr
8989
// MLIR: %[[VAL_29:.*]] = llvm.load %[[VAL_2]] {alignment = 4 : i64} : !llvm.ptr -> i32
9090
// MLIR: %[[VAL_30:.*]] = llvm.sext %[[VAL_29]] : i32 to i64
91-
// MLIR: %[[VAL_31:.*]] = llvm.getelementptr %[[VAL_28]]{{\[}}%[[VAL_30]]] : (!llvm.ptr, i64) -> !llvm.ptr, f64
91+
// MLIR: %[[VAL_31:.*]] = llvm.getelementptr inbounds %[[VAL_28]]{{\[}}%[[VAL_30]]] : (!llvm.ptr, i64) -> !llvm.ptr, f64
9292
// MLIR: %[[VAL_32:.*]] = llvm.load %[[VAL_31]] {alignment = 8 : i64} : !llvm.ptr -> f64
9393
// MLIR: %[[VAL_33:.*]] = llvm.fmul %[[VAL_27]], %[[VAL_32]] : f64
9494
// MLIR: %[[VAL_34:.*]] = llvm.load %[[VAL_12]] {alignment = 8 : i64} : !llvm.ptr -> f64

0 commit comments

Comments
 (0)