From: Jessica Paquette Date: Wed, 24 Feb 2021 00:12:56 +0000 (-0800) Subject: [AArch64][GlobalISel] Correct function evaluation order in applyINS X-Git-Tag: llvmorg-14-init~14230 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=daf7d7f0dc283873f40f3500b20f02bc2cde701d;p=platform%2Fupstream%2Fllvm.git [AArch64][GlobalISel] Correct function evaluation order in applyINS The order in which the nested calls to Builder.buildWhatever are evaluated in differs between GCC and Clang. This caused a bot failure because the MIR in the testcase was coming out in a different order than expected. Rather than using nested calls, pull them out in order to fix the order of evaluation. --- diff --git a/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerLowering.cpp index 1eba655..3e05983 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerLowering.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerLowering.cpp @@ -456,11 +456,10 @@ static bool applyINS(MachineInstr &MI, MachineRegisterInfo &MRI, Register DstVec, SrcVec; int DstLane, SrcLane; std::tie(DstVec, DstLane, SrcVec, SrcLane) = MatchInfo; - Builder.buildInsertVectorElement( - Dst, DstVec, - Builder.buildExtractVectorElement( - ScalarTy, SrcVec, Builder.buildConstant(LLT::scalar(64), SrcLane)), - Builder.buildConstant(LLT::scalar(64), DstLane)); + auto SrcCst = Builder.buildConstant(LLT::scalar(64), SrcLane); + auto Extract = Builder.buildExtractVectorElement(ScalarTy, SrcVec, SrcCst); + auto DstCst = Builder.buildConstant(LLT::scalar(64), DstLane); + Builder.buildInsertVectorElement(Dst, DstVec, Extract, DstCst); MI.eraseFromParent(); return true; }