From: Aditya Nandakumar Date: Thu, 22 Mar 2018 17:31:38 +0000 (+0000) Subject: [GISel]: Fix incorrect IRTranslation while translating null pointer types X-Git-Tag: llvmorg-7.0.0-rc1~9929 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b3297ef05179e1fee616b97b1c65b58e4c7fef17;p=platform%2Fupstream%2Fllvm.git [GISel]: Fix incorrect IRTranslation while translating null pointer types https://reviews.llvm.org/D44762 Currently IRTranslator produces %vreg17(p0) = G_CONSTANT 0; instead we should build %vreg16(s64) = G_CONSTANT 0 %vreg17(p0) = G_INTTOPTR %vreg16 reviewed by @aemerson. llvm-svn: 328218 --- diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 7fb82153..b0a40f8 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1195,9 +1195,15 @@ bool IRTranslator::translate(const Constant &C, unsigned Reg) { EntryBuilder.buildFConstant(Reg, *CF); else if (isa(C)) EntryBuilder.buildUndef(Reg); - else if (isa(C)) - EntryBuilder.buildConstant(Reg, 0); - else if (auto GV = dyn_cast(&C)) + else if (isa(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(&C)) EntryBuilder.buildGlobalValue(Reg, GV); else if (auto CAZ = dyn_cast(&C)) { if (!CAZ->getType()->isVectorTy()) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll index 70d355b..59b56ac 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll @@ -169,7 +169,7 @@ end: br label %block } -; FALLBACK-WITH-REPORT-ERR: remark: :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: :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() { diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index 077be5e..da5d814 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -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 diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll index bf29fc0..a4c8ba9 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll @@ -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 diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll index 3aa8717..be18a5d 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll @@ -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 diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll b/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll index ae9251a..a306cd0 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll @@ -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