From 7db38d59e439367a5a0e9e196bbbdd68d7774e14 Mon Sep 17 00:00:00 2001 From: Dhruv Chopra Date: Fri, 10 Nov 2023 23:11:51 -0500 Subject: [PATCH] Make globalReg clobberable in Z iRegStoreEvaluator If the iRegStoreEvaluator generates an LGFR to sign extend, it is incorrect to assume that the iRegStore's child is clobberable. We must preserve the original value when sign extending. This commit fixes this issue by using the gprClobberEvaluate routine so that the sign extension is performed in a different register, and we don't potentially overwrite the upper-half data in the original register. --- compiler/z/codegen/OMRTreeEvaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/z/codegen/OMRTreeEvaluator.cpp b/compiler/z/codegen/OMRTreeEvaluator.cpp index a29e812bee..11d3250bf3 100644 --- a/compiler/z/codegen/OMRTreeEvaluator.cpp +++ b/compiler/z/codegen/OMRTreeEvaluator.cpp @@ -13773,7 +13773,7 @@ OMR::Z::TreeEvaluator::iRegStoreEvaluator(TR::Node * node, TR::CodeGenerator * c if (!useLGHI) { - globalReg = cg->evaluate(value); + globalReg = needsLGFR && noLGFgenerated ? cg->gprClobberEvaluate(value) : cg->evaluate(value); } else {