[PATCH] D44762: [GISel]: Fix incorrect IRTranslation while translating null pointer types
Aditya Nandakumar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 21 16:41:00 PDT 2018
aditya_nandakumar created this revision.
aditya_nandakumar added reviewers: qcolombet, volkan, dsanders, aemerson, rovka.
Herald added a subscriber: javed.absar.
Currently IRTranslator produces
%vreg17<def>(p0) = G_CONSTANT 0;
instead we should build
%vreg16(s64) = G_CONSTANT 0
%vreg17(p0) = G_INTTOPTR %vreg16
Repository:
rL LLVM
https://reviews.llvm.org/D44762
Files:
lib/CodeGen/GlobalISel/IRTranslator.cpp
test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
test/CodeGen/AArch64/GlobalISel/call-translator.ll
test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll
test/CodeGen/AArch64/GlobalISel/translate-gep.ll
Index: test/CodeGen/AArch64/GlobalISel/translate-gep.ll
===================================================================
--- test/CodeGen/AArch64/GlobalISel/translate-gep.ll
+++ 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
Index: test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll
===================================================================
--- test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll
+++ test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll
@@ -64,7 +64,8 @@
; 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
Index: test/CodeGen/AArch64/GlobalISel/call-translator.ll
===================================================================
--- test/CodeGen/AArch64/GlobalISel/call-translator.ll
+++ test/CodeGen/AArch64/GlobalISel/call-translator.ll
@@ -187,7 +187,8 @@
; 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
Index: test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
===================================================================
--- test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
+++ test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
@@ -700,7 +700,8 @@
}
; 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
Index: test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
===================================================================
--- test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
+++ test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
@@ -169,7 +169,7 @@
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() {
Index: lib/CodeGen/GlobalISel/IRTranslator.cpp
===================================================================
--- lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -1195,9 +1195,15 @@
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())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44762.139392.patch
Type: text/x-patch
Size: 4581 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180321/6a989955/attachment.bin>
More information about the llvm-commits
mailing list