Skip to content

Commit 8520c15

Browse files
authored
SimpleGVN: do corresponding unsafe cast to jlvaluet (#2840)
1 parent ba0c1fa commit 8520c15

2 files changed

Lines changed: 26 additions & 10 deletions

File tree

enzyme/Enzyme/SimpleGVN.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,17 +186,13 @@ Value *extractValue(IRBuilder<> &Builder, Value *StoredVal, Type *LoadType,
186186
if (LoadIntTy != LoadType) {
187187
if (LoadType->isPointerTy()) {
188188
if (cast<PointerType>(LoadType)->getAddressSpace() == 10) {
189-
if (CustomErrorHandler) {
190-
CustomErrorHandler(
191-
"SimpleGVN: attempt to convert integer to GC pointer",
192-
wrap(StoredVal), ErrorType::ShowInternalError, nullptr, nullptr,
193-
wrap(&Builder));
194-
return nullptr;
195-
}
196-
llvm::report_fatal_error(
197-
"SimpleGVN: attempt to convert integer to GC pointer");
189+
Type *EmptyStructTy = StructType::get(LoadType->getContext());
190+
Type *PtrAddrSpace0 = PointerType::get(EmptyStructTy, 0);
191+
Value *Ptr0 = Builder.CreateIntToPtr(StoredVal, PtrAddrSpace0);
192+
StoredVal = Builder.CreateAddrSpaceCast(Ptr0, LoadType);
193+
} else {
194+
StoredVal = Builder.CreateIntToPtr(StoredVal, LoadType);
198195
}
199-
StoredVal = Builder.CreateIntToPtr(StoredVal, LoadType);
200196
} else {
201197
if (!CastInst::castIsValid(Instruction::BitCast, StoredVal->getType(),
202198
LoadType)) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
; RUN: %opt < %s %newLoadEnzyme -passes="simple-gvn" -S | FileCheck %s
2+
3+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-ni:10:11:12:13"
4+
5+
define {} addrspace(10)* @test_int_to_gc_ptr(i64* noalias %ptr, i64 %val) {
6+
entry:
7+
store i64 %val, i64* %ptr
8+
%c = bitcast i64* %ptr to {} addrspace(10)**
9+
%loaded = load {} addrspace(10)*, {} addrspace(10)** %c
10+
ret {} addrspace(10)* %loaded
11+
}
12+
13+
; CHECK: define {} addrspace(10)* @test_int_to_gc_ptr(i64* noalias %ptr, i64 %val) {
14+
; CHECK-NEXT: entry:
15+
; CHECK-NEXT: store i64 %val, i64* %ptr, align 8
16+
; CHECK-NEXT: %c = bitcast i64* %ptr to {} addrspace(10)**
17+
; CHECK-NEXT: %[[INTTOPTR:.+]] = inttoptr i64 %val to {}*
18+
; CHECK-NEXT: %[[ADDRSPACECAST:.+]] = addrspacecast {}* %[[INTTOPTR]] to {} addrspace(10)*
19+
; CHECK-NEXT: ret {} addrspace(10)* %[[ADDRSPACECAST]]
20+
; CHECK-NEXT: }

0 commit comments

Comments
 (0)