forked from OSchip/llvm-project
[GISel]: Fix incorrect IRTranslation while translating null pointer types
https://reviews.llvm.org/D44762 Currently IRTranslator produces %vreg17<def>(p0) = G_CONSTANT 0; instead we should build %vreg16(s64) = G_CONSTANT 0 %vreg17(p0) = G_INTTOPTR %vreg16 reviewed by @aemerson. llvm-svn: 328218
This commit is contained in:
parent
e5b51f6786
commit
b3297ef051
|
@ -1195,9 +1195,15 @@ bool IRTranslator::translate(const Constant &C, unsigned Reg) {
|
|||
EntryBuilder.buildFConstant(Reg, *CF);
|
||||
else if (isa<UndefValue>(C))
|
||||
EntryBuilder.buildUndef(Reg);
|
||||
else if (isa<ConstantPointerNull>(C))
|
||||
EntryBuilder.buildConstant(Reg, 0);
|
||||
else if (auto GV = dyn_cast<GlobalValue>(&C))
|
||||
else if (isa<ConstantPointerNull>(C)) {
|
||||
// As we are trying to build a constant val of 0 into a pointer,
|
||||
// insert a cast to make them correct with respect to types.
|
||||
unsigned NullSize = DL->getTypeSizeInBits(C.getType());
|
||||
auto *ZeroTy = Type::getIntNTy(C.getContext(), NullSize);
|
||||
auto *ZeroVal = ConstantInt::get(ZeroTy, 0);
|
||||
unsigned ZeroReg = getOrCreateVReg(*ZeroVal);
|
||||
EntryBuilder.buildCast(Reg, ZeroReg);
|
||||
} else if (auto GV = dyn_cast<GlobalValue>(&C))
|
||||
EntryBuilder.buildGlobalValue(Reg, GV);
|
||||
else if (auto CAZ = dyn_cast<ConstantAggregateZero>(&C)) {
|
||||
if (!CAZ->getType()->isVectorTy())
|
||||
|
|
|
@ -169,7 +169,7 @@ end:
|
|||
br label %block
|
||||
}
|
||||
|
||||
; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %0:_(<2 x p0>), %4:_(p0) :: (store 16 into `<2 x i16*>* undef`) (in function: vector_of_pointers_insertelement)
|
||||
; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %0:_(<2 x p0>), %5:_(p0) :: (store 16 into `<2 x i16*>* undef`) (in function: vector_of_pointers_insertelement)
|
||||
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for vector_of_pointers_insertelement
|
||||
; FALLBACK-WITH-REPORT-OUT-LABEL: vector_of_pointers_insertelement:
|
||||
define void @vector_of_pointers_insertelement() {
|
||||
|
|
|
@ -700,7 +700,8 @@ define i32 @test_urem(i32 %arg1, i32 %arg2) {
|
|||
}
|
||||
|
||||
; CHECK-LABEL: name: test_constant_null
|
||||
; CHECK: [[NULL:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
|
||||
; CHECK: [[ZERO:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[NULL:%[0-9]+]]:_(p0) = G_INTTOPTR [[ZERO]]
|
||||
; CHECK: $x0 = COPY [[NULL]]
|
||||
define i8* @test_constant_null() {
|
||||
ret i8* null
|
||||
|
|
|
@ -187,7 +187,8 @@ define void @test_stack_slots([8 x i64], i64 %lhs, i64 %rhs, i64* %addr) {
|
|||
; CHECK-LABEL: name: test_call_stack
|
||||
; CHECK: [[C42:%[0-9]+]]:_(s64) = G_CONSTANT i64 42
|
||||
; CHECK: [[C12:%[0-9]+]]:_(s64) = G_CONSTANT i64 12
|
||||
; CHECK: [[PTR:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
|
||||
; CHECK: [[ZERO:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[PTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[ZERO]]
|
||||
; CHECK: ADJCALLSTACKDOWN 24, 0, implicit-def $sp, implicit $sp
|
||||
; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp
|
||||
; CHECK: [[C42_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
|
|
|
@ -64,7 +64,8 @@ continue:
|
|||
|
||||
; CHECK-LABEL: name: test_invoke_varargs
|
||||
|
||||
; CHECK: [[NULL:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
|
||||
; CHECK: [[ZERO:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[NULL:%[0-9]+]]:_(p0) = G_INTTOPTR [[ZERO]]
|
||||
; CHECK: [[ANSWER:%[0-9]+]]:_(s32) = G_CONSTANT i32 42
|
||||
; CHECK: [[ONE:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.0
|
||||
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
define i8* @translate_element_size1(i64 %arg) {
|
||||
; CHECK-LABEL: name: translate_element_size1
|
||||
; CHECK: [[OFFSET:%[0-9]+]]:_(s64) = COPY $x0
|
||||
; CHECK: [[BASE:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
|
||||
; CHECK: [[ZERO:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
||||
; CHECK: [[BASE:%[0-9]+]]:_(p0) = G_INTTOPTR [[ZERO]]
|
||||
; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[BASE]], [[OFFSET]]
|
||||
%tmp = getelementptr i8, i8* null, i64 %arg
|
||||
ret i8* %tmp
|
||||
|
|
Loading…
Reference in New Issue