Skip to content

Commit 9228ff9

Browse files
bcardosolopeslanza
authored andcommitted
[CIR][LowerToLLVM] Fold base address computation if offset is zero
1 parent 7292552 commit 9228ff9

File tree

4 files changed

+17
-14
lines changed

4 files changed

+17
-14
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,12 @@ class CIRBaseClassAddrOpLowering
837837
adaptor.getOffset().getZExtValue()};
838838
mlir::Type byteType = mlir::IntegerType::get(resultType.getContext(), 8,
839839
mlir::IntegerType::Signless);
840+
if (adaptor.getOffset().getZExtValue() == 0) {
841+
rewriter.replaceOpWithNewOp<mlir::LLVM::BitcastOp>(
842+
baseClassOp, resultType, adaptor.getDerivedAddr());
843+
return mlir::success();
844+
}
845+
840846
if (baseClassOp.getAssumeNotNull()) {
841847
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
842848
baseClassOp, resultType, byteType, derivedAddr, offset);

clang/test/CIR/CodeGen/derived-cast.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,5 @@ A *B::getAsA() {
3636
// LLVM: store ptr %[[VAL_2:.*]], ptr %[[VAL_0:.*]], align 8
3737
// LLVM: %[[VAL_3:.*]] = load ptr, ptr %[[VAL_0]], align 8
3838
// LLVM: %[[VAL_4:.*]] = getelementptr i8, ptr %[[VAL_3]], i32 -4
39-
// LLVM: %[[VAL_5:.*]] = icmp eq ptr %[[VAL_4]], null,
40-
// LLVM: %[[VAL_6:.*]] = getelementptr i8, ptr %[[VAL_4]], i32 0,
41-
// LLVM: %[[VAL_7:.*]] = select i1 %[[VAL_5]], ptr %[[VAL_4]], ptr %[[VAL_6]],
39+
// LLVM-NOT: select i1
40+
// LLVM: ret ptr

clang/test/CIR/CodeGen/vtt.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ int f() {
143143
// LLVM: %[[THIS:.*]] = load ptr, ptr %2, align 8
144144
// LLVM: %[[BASE_A:.*]] = getelementptr i8, ptr %[[THIS]], i32 40
145145
// LLVM: call void @_ZN1AC2Ev(ptr %[[BASE_A]])
146-
// LLVM: %[[BASE_B:.*]] = getelementptr i8, ptr %[[THIS]], i32 0
147-
// LLVM: call void @_ZN1BC2Ev(ptr %[[BASE_B]], ptr getelementptr inbounds ([7 x ptr], ptr @_ZTT1D, i32 0, i32 1))
146+
// LLVM: call void @_ZN1BC2Ev(ptr %[[THIS]], ptr getelementptr inbounds ([7 x ptr], ptr @_ZTT1D, i32 0, i32 1))
148147
// LLVM: %[[BASE_C:.*]] = getelementptr i8, ptr %[[THIS]], i32 16
149148
// LLVM: call void @_ZN1CC2Ev(ptr %[[BASE_C]], ptr getelementptr inbounds ([7 x ptr], ptr @_ZTT1D, i32 0, i32 3))
150149
// LLVM: ret void

clang/test/CIR/Lowering/derived-to-base.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@ void test_multi_base() {
88
Derived d;
99

1010
Base2& bref = d; // no null check needed
11-
// LLVM: %7 = getelementptr i8, ptr %1, i32 4
11+
// LLVM: getelementptr i8, ptr %[[D:.*]], i32 4
1212

1313
Base2* bptr = &d; // has null pointer check
14-
// LLVM: %8 = icmp eq ptr %1, null
15-
// LLVM: %9 = getelementptr i8, ptr %1, i32 4
16-
// LLVM: %10 = select i1 %8, ptr %1, ptr %9
14+
// LLVM: %[[CHECK:.*]] = icmp eq ptr %[[D]], null
15+
// LLVM: %[[BPTR:.*]] = getelementptr i8, ptr %[[D]], i32 4
16+
// LLVM: select i1 %[[CHECK]], ptr %[[D]], ptr %[[BPTR]]
1717

1818
int a = d.a;
19-
// LLVM: %11 = getelementptr i8, ptr %1, i32 0
20-
// LLVM: %12 = getelementptr %struct.Base1, ptr %11, i32 0, i32 0
19+
// LLVM: getelementptr %struct.Base1, ptr %[[D]], i32 0, i32 0
2120

2221
int b = d.b;
23-
// LLVM: %14 = getelementptr i8, ptr %1, i32 4
24-
// LLVM: %15 = getelementptr %struct.Base2, ptr %14, i32 0, i32 0
22+
// LLVM: %[[BASE2_OFFSET:.*]] = getelementptr i8, ptr %[[D]], i32 4
23+
// LLVM: %[[BASE2:.*]] = getelementptr %struct.Base2, ptr %[[BASE2_OFFSET]], i32 0, i32 0
2524

2625
int c = d.c;
27-
// LLVM: %17 = getelementptr %struct.Derived, ptr %1, i32 0, i32 2
26+
// LLVM: getelementptr %struct.Derived, ptr %[[D]], i32 0, i32 2
2827
}

0 commit comments

Comments
 (0)