Index: lib/CodeGen/GlobalISel/IRTranslator.cpp =================================================================== --- lib/CodeGen/GlobalISel/IRTranslator.cpp +++ lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -337,6 +337,9 @@ : MachineMemOperand::MONone; Flags |= MachineMemOperand::MOLoad; + if (DL->getTypeStoreSize(LI.getType()) == 0) + return true; + unsigned Res = getOrCreateVReg(LI); unsigned Addr = getOrCreateVReg(*LI.getPointerOperand()); @@ -355,6 +358,9 @@ : MachineMemOperand::MONone; Flags |= MachineMemOperand::MOStore; + if (DL->getTypeStoreSize(SI.getValueOperand()->getType()) == 0) + return true; + unsigned Val = getOrCreateVReg(*SI.getValueOperand()); unsigned Addr = getOrCreateVReg(*SI.getPointerOperand()); Index: test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll =================================================================== --- test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -1636,3 +1636,15 @@ } declare i64 @llvm.aarch64.ldxr.p0i32(i32*) nounwind + +%zerosize_type = type {} + +define void @test_empty_load_store(%zerosize_type *%ptr) noinline optnone { +; CHECK-LABEL: name: test_empty_load_store +; CHECK-NOT: G_STORE +; CHECK-NOT: G_LOAD +entry: + store %zerosize_type undef, %zerosize_type* undef, align 4 + %val = load %zerosize_type, %zerosize_type* %ptr, align 4 + unreachable +}