Subzero: Fix an Om1 crash from memset lowering. With a certain combination of memset arguments, legalizeToReg() is called but its result is unused. Om1 register allocation does not like this because it sees an infinite-weight variable with a definition but no uses. The simplest fix is to add a fake use. The problem shows up when building spec2k with -Om1. BUG= none R=ascull@google.com Review URL: https://codereview.chromium.org/1272823004.
diff --git a/src/IceTargetLoweringX86BaseImpl.h b/src/IceTargetLoweringX86BaseImpl.h index 245861c..73c0075 100644 --- a/src/IceTargetLoweringX86BaseImpl.h +++ b/src/IceTargetLoweringX86BaseImpl.h
@@ -3804,6 +3804,10 @@ // eax, ax and al. if (IsCountConst && IsValConst) { Variable *Base = legalizeToReg(Dest); + // Add a FakeUse in case Base is ultimately not used, e.g. it falls back to + // calling memset(). Otherwise Om1 register allocation fails because this + // infinite-weight variable has a definition but no uses. + Context.insert(InstFakeUse::create(Func, Base)); // 3 is the awkward size as it is too small for the vector or 32-bit // operations and will not work with lowerLeftOvers as there is no valid
diff --git a/tests_lit/llvm2ice_tests/nacl-mem-intrinsics.ll b/tests_lit/llvm2ice_tests/nacl-mem-intrinsics.ll index b262f92..8656c57 100644 --- a/tests_lit/llvm2ice_tests/nacl-mem-intrinsics.ll +++ b/tests_lit/llvm2ice_tests/nacl-mem-intrinsics.ll
@@ -101,6 +101,19 @@ ; ARM32: uxtb ; ARM32: bl {{.*}} memset +define void @test_memset_long_const_len_zero_val_align(i32 %iptr_dst) { +entry: + %dst = inttoptr i32 %iptr_dst to i8* + call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, + i32 4876, i32 1, i1 false) + ret void +} +; CHECK-LABEL: test_memset_long_const_len_zero_val_align +; CHECK: call {{.*}} R_{{.*}} memset +; ARM32-LABEL: test_memset_long_const_len_zero_val_align +; ARM32: uxtb +; ARM32: bl {{.*}} memset + define void @test_memset_const_val(i32 %iptr_dst, i32 %len) { entry: %dst = inttoptr i32 %iptr_dst to i8*