From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt1-x833.google.com (mail-qt1-x833.google.com [IPv6:2607:f8b0:4864:20::833]) by sourceware.org (Postfix) with ESMTPS id 8197D395A052 for ; Thu, 2 Jun 2022 09:33:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8197D395A052 Received: by mail-qt1-x833.google.com with SMTP id ew15so2997283qtb.2 for ; Thu, 02 Jun 2022 02:33:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=GylDyngFdCEUQoa1Gt4j5zWj3er09cZv7Pa0st9Blnw=; b=e3NaxspOGmHYys2xoqe4UDssKNx6Xv5WS987BIeGIg86s/3R5Ise1bVbtvk2vPDGW9 OIL3iPZH3+f2/hntWieM7ZwdO6M0XrC0xCty2PSSbJTG/mHEGqjGqbzAm6gx19uUfTP6 x80I+Z6HP2dQXnKaGCdJXB02vcx0958gVAr+Ta9pxm4Ti3Imbjt9AnlFbXvd2GU2M4fr O5mNRjbc3McQFe88sqBQTLQGuuHCXa9YI8XvCmNgXPZYmV6kkNwuwfctUODccGx7WzmM W8Z43126xKrd/GwGZcjhEDjcB16yN+cDurlzNR/K/6H7D1FCTl+rk9SysD+x6ADFUZUX qeog== X-Gm-Message-State: AOAM532M01N3b1YQxufiZf2toTnfp8opPNEwAYXypqXs8Qf7nTD0hGuJ TZHyDcq41FYoAAGVmmS01K9C4NYdrvDwfXkok8wVSVdX1lM7wA== X-Google-Smtp-Source: ABdhPJyKNiZTsaSJhT2wuZJSiGlLOZLGN/fp5n1HEXpFBAJeZfzZt0shw49k5h6JV81TvYTzIbox1DqWEVuifT68jVo= X-Received: by 2002:a05:622a:203:b0:2f9:40cf:1787 with SMTP id b3-20020a05622a020300b002f940cf1787mr2856090qtx.436.1654162383798; Thu, 02 Jun 2022 02:33:03 -0700 (PDT) MIME-Version: 1.0 References: <032501d87651$43cf0960$cb6d1c20$@nextmovesoftware.com> In-Reply-To: <032501d87651$43cf0960$cb6d1c20$@nextmovesoftware.com> From: Uros Bizjak Date: Thu, 2 Jun 2022 11:32:52 +0200 Message-ID: Subject: Re: [x86 PATCH] Add peephole2 to reduce double word register shuffling. To: Roger Sayle Cc: GCC Patches Content-Type: multipart/mixed; boundary="00000000000049b89005e073b1cc" X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Jun 2022 09:33:06 -0000 --00000000000049b89005e073b1cc Content-Type: text/plain; charset="UTF-8" On Thu, Jun 2, 2022 at 9:20 AM Roger Sayle wrote: > > The simple test case below demonstrates an interesting register > allocation challenge facing x86_64, imposed by ABI requirements > on int128. > > __int128 foo(__int128 x, __int128 y) > { > return x+y; > } > > For which GCC currently generates the unusual sequence: > > movq %rsi, %rax > movq %rdi, %r8 > movq %rax, %rdi > movq %rdx, %rax > movq %rcx, %rdx > addq %r8, %rax > adcq %rdi, %rdx > ret > > The challenge is that the x86_64 ABI requires passing the first __int128, > x, in %rsi:%rdi (highpart in %rsi, lowpart in %rdi), where internally > GCC prefers TI mode (double word) integers to be register allocated as > %rdi:%rsi (highpart in %rdi, lowpart in %rsi). So after reload, we have > four mov instructions, two to move the double word to temporary registers > and then two to move them back. > > This patch adds a peephole2 to spot this register shuffling, and with > -Os generates a xchg instruction, to produce: > > xchgq %rsi, %rdi > movq %rdx, %rax > movq %rcx, %rdx > addq %rsi, %rax > adcq %rdi, %rdx > ret > > or when optimizing for speed, a three mov sequence, using just one of > the temporary registers, which ultimately results in the improved: > > movq %rdi, %r8 > movq %rdx, %rax > movq %rcx, %rdx > addq %r8, %rax > adcq %rsi, %rdx > ret > > I've a follow-up patch which improves things further, and with the > output in flux, I'd like to add the new testcase with part 2, once > we're back down to requiring only two movq instructions. Shouldn't we rather do something about: (insn 2 9 3 2 (set (reg:DI 85) (reg:DI 5 di [ x ])) "dword-2.c":2:1 82 {*movdi_internal} (nil)) (insn 3 2 4 2 (set (reg:DI 86) (reg:DI 4 si [ x+8 ])) "dword-2.c":2:1 82 {*movdi_internal} (nil)) (insn 4 3 5 2 (set (reg:TI 84) (subreg:TI (reg:DI 85) 0)) "dword-2.c":2:1 81 {*movti_internal} (nil)) (insn 5 4 6 2 (set (subreg:DI (reg:TI 84) 8) (reg:DI 86)) "dword-2.c":2:1 82 {*movdi_internal} (nil)) (insn 6 5 7 2 (set (reg/v:TI 83 [ x ]) (reg:TI 84)) "dword-2.c":2:1 81 {*movti_internal} (nil)) The above is how the functionTImode argument is constructed. The other problem is that double-word addition gets split only after reload, mostly due to RA reasons. In the past it was determined that RA creates better code when registers are split late (this reason probably does not hold anymore), but nowadays the limitation remains only for arithmetic and shifts. Attached to this message, please find the patch that performs dual word mode arithmetic splitting before reload. It improves generated code somehow, but due to the above argument construction sequence, the bulk of moves remain. Unfortunately, when under register pressure (e.g. 32-bit targets), the peephole approach gets ineffective due to register spilling, so IMO the root of the problem should be fixed. Uros. > > This patch has been tested on x86_64-pc-linux-gnu with make bootstrap > and make -k check, both with and without --target_board=unix{-m32} with > no new failures. Ok for mainline? > > > 2022-06-02 Roger Sayle > > gcc/ChangeLog > * config/i386/i386.md (define_peephole2): Recognize double word > swap sequences, and replace them with more efficient idioms, > including using xchg when optimizing for size. > > > Thanks in advance, > Roger > -- > --00000000000049b89005e073b1cc Content-Type: text/plain; charset="US-ASCII"; name="dw-arith.diff.txt" Content-Disposition: attachment; filename="dw-arith.diff.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l3wtgko40 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2Lm1kIGIvZ2NjL2NvbmZpZy9pMzg2L2kz ODYubWQKaW5kZXggMDUwZGVlN2Q0M2EuLjg3NjIyMGQ1N2Y5IDEwMDY0NAotLS0gYS9nY2MvY29u ZmlnL2kzODYvaTM4Ni5tZAorKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5tZApAQCAtNTczMCw5 ICs1NzMwLDEwIEBACiAJICAobWF0Y2hfb3BlcmFuZDo8RFdJPiAxICJub25pbW1lZGlhdGVfb3Bl cmFuZCIgIiUwLDAiKQogCSAgKG1hdGNoX29wZXJhbmQ6PERXST4gMiAieDg2XzY0X2hpbG9fZ2Vu ZXJhbF9vcGVyYW5kIiAicjxkaT4sbyIpKSkKICAgIChjbG9iYmVyIChyZWc6Q0MgRkxBR1NfUkVH KSldCi0gICJpeDg2X2JpbmFyeV9vcGVyYXRvcl9vayAoUExVUywgPERXST5tb2RlLCBvcGVyYW5k cykiCisgICJpeDg2X2JpbmFyeV9vcGVyYXRvcl9vayAoUExVUywgPERXST5tb2RlLCBvcGVyYW5k cykKKyAgICYmIGl4ODZfcHJlX3JlbG9hZF9zcGxpdCAoKSIKICAgIiMiCi0gICImJiByZWxvYWRf Y29tcGxldGVkIgorICAiJiYgMSIKICAgWyhwYXJhbGxlbCBbKHNldCAocmVnOkNDQyBGTEFHU19S RUcpCiAJCSAgIChjb21wYXJlOkNDQwogCQkgICAgIChwbHVzOkRXSUggKG1hdGNoX2R1cCAxKSAo bWF0Y2hfZHVwIDIpKQpAQCAtNTc1MCw2ICs1NzUxLDcgQEAKICAgc3BsaXRfZG91YmxlX21vZGUg KDxEV0k+bW9kZSwgJm9wZXJhbmRzWzBdLCAzLCAmb3BlcmFuZHNbMF0sICZvcGVyYW5kc1szXSk7 CiAgIGlmIChvcGVyYW5kc1syXSA9PSBjb25zdDBfcnR4KQogICAgIHsKKyAgICAgIGVtaXRfbW92 ZV9pbnNuIChvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0pOwogICAgICAgaXg4Nl9leHBhbmRfYmlu YXJ5X29wZXJhdG9yIChQTFVTLCA8TU9ERT5tb2RlLCAmb3BlcmFuZHNbM10pOwogICAgICAgRE9O RTsKICAgICB9CkBAIC02NTM5LDkgKzY1NDEsMTAgQEAKIAkgICAgKHBsdXM6PERXST4gKG1hdGNo X2R1cCAxKSAobWF0Y2hfZHVwIDIpKSkpKQogICAgKHNldCAobWF0Y2hfb3BlcmFuZDo8RFdJPiAw ICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIj1ybyxyIikKIAkocGx1czo8RFdJPiAobWF0Y2hfZHVw IDEpIChtYXRjaF9kdXAgMikpKV0KLSAgIml4ODZfYmluYXJ5X29wZXJhdG9yX29rIChQTFVTLCA8 RFdJPm1vZGUsIG9wZXJhbmRzKSIKKyAgIml4ODZfYmluYXJ5X29wZXJhdG9yX29rIChQTFVTLCA8 RFdJPm1vZGUsIG9wZXJhbmRzKQorICAgJiYgaXg4Nl9wcmVfcmVsb2FkX3NwbGl0ICgpIgogICAi IyIKLSAgIiYmIHJlbG9hZF9jb21wbGV0ZWQiCisgICImJiAxIgogICBbKHBhcmFsbGVsIFsoc2V0 IChyZWc6Q0NDIEZMQUdTX1JFRykKIAkJICAgKGNvbXBhcmU6Q0NDCiAJCSAgICAgKHBsdXM6RFdJ SCAobWF0Y2hfZHVwIDEpIChtYXRjaF9kdXAgMikpCkBAIC02NTY3LDkgKzY1NzAsNyBAQAogCQkg ICAgICAgKGx0dTpEV0lIIChyZWc6Q0MgRkxBR1NfUkVHKSAoY29uc3RfaW50IDApKQogCQkgICAg ICAgKG1hdGNoX2R1cCA0KSkKIAkJICAgICAobWF0Y2hfZHVwIDUpKSldKV0KLXsKLSAgc3BsaXRf ZG91YmxlX21vZGUgKDxEV0k+bW9kZSwgJm9wZXJhbmRzWzBdLCAzLCAmb3BlcmFuZHNbMF0sICZv cGVyYW5kc1szXSk7Ci19KQorICAic3BsaXRfZG91YmxlX21vZGUgKDxEV0k+bW9kZSwgJm9wZXJh bmRzWzBdLCAzLCAmb3BlcmFuZHNbMF0sICZvcGVyYW5kc1szXSk7IikKIAogKGRlZmluZV9pbnNu X2FuZF9zcGxpdCAiKmFkZHY8ZHdpPjRfZG91Ymxld29yZF8xIgogICBbKHNldCAocmVnOkNDTyBG TEFHU19SRUcpCkBAIC02NTg2LDkgKzY1ODcsMTAgQEAKIAkocGx1czo8RFdJPiAobWF0Y2hfZHVw IDEpIChtYXRjaF9kdXAgMikpKV0KICAgIml4ODZfYmluYXJ5X29wZXJhdG9yX29rIChQTFVTLCA8 RFdJPm1vZGUsIG9wZXJhbmRzKQogICAgJiYgQ09OU1RfU0NBTEFSX0lOVF9QIChvcGVyYW5kc1sy XSkKLSAgICYmIHJ0eF9lcXVhbF9wIChvcGVyYW5kc1syXSwgb3BlcmFuZHNbM10pIgorICAgJiYg cnR4X2VxdWFsX3AgKG9wZXJhbmRzWzJdLCBvcGVyYW5kc1szXSkKKyAgICYmIGl4ODZfcHJlX3Jl bG9hZF9zcGxpdCAoKSIKICAgIiMiCi0gICImJiByZWxvYWRfY29tcGxldGVkIgorICAiJiYgMSIK ICAgWyhwYXJhbGxlbCBbKHNldCAocmVnOkNDQyBGTEFHU19SRUcpCiAJCSAgIChjb21wYXJlOkND QwogCQkgICAgIChwbHVzOkRXSUggKG1hdGNoX2R1cCAxKSAobWF0Y2hfZHVwIDIpKQpAQCAtNjYx OCw2ICs2NjIwLDcgQEAKICAgc3BsaXRfZG91YmxlX21vZGUgKDxEV0k+bW9kZSwgJm9wZXJhbmRz WzBdLCAzLCAmb3BlcmFuZHNbMF0sICZvcGVyYW5kc1szXSk7CiAgIGlmIChvcGVyYW5kc1syXSA9 PSBjb25zdDBfcnR4KQogICAgIHsKKyAgICAgIGVtaXRfbW92ZV9pbnNuIChvcGVyYW5kc1swXSwg b3BlcmFuZHNbMV0pOwogICAgICAgZW1pdF9pbnNuIChnZW5fYWRkdjxtb2RlPjRfMSAob3BlcmFu ZHNbM10sIG9wZXJhbmRzWzRdLCBvcGVyYW5kc1s1XSwKIAkJCQkgICAgb3BlcmFuZHNbNV0pKTsK ICAgICAgIERPTkU7CkBAIC02ODgwLDkgKzY4ODMsMTAgQEAKIAkgIChtYXRjaF9vcGVyYW5kOjxE V0k+IDEgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiMCwwIikKIAkgIChtYXRjaF9vcGVyYW5kOjxE V0k+IDIgIng4Nl82NF9oaWxvX2dlbmVyYWxfb3BlcmFuZCIgInI8ZGk+LG8iKSkpCiAgICAoY2xv YmJlciAocmVnOkNDIEZMQUdTX1JFRykpXQotICAiaXg4Nl9iaW5hcnlfb3BlcmF0b3Jfb2sgKE1J TlVTLCA8TU9ERT5tb2RlLCBvcGVyYW5kcykiCisgICJpeDg2X2JpbmFyeV9vcGVyYXRvcl9vayAo TUlOVVMsIDxNT0RFPm1vZGUsIG9wZXJhbmRzKQorICAgJiYgaXg4Nl9wcmVfcmVsb2FkX3NwbGl0 ICgpIgogICAiIyIKLSAgIiYmIHJlbG9hZF9jb21wbGV0ZWQiCisgICImJiAxIgogICBbKHBhcmFs bGVsIFsoc2V0IChyZWc6Q0MgRkxBR1NfUkVHKQogCQkgICAoY29tcGFyZTpDQyAobWF0Y2hfZHVw IDEpIChtYXRjaF9kdXAgMikpKQogCSAgICAgIChzZXQgKG1hdGNoX2R1cCAwKQpAQCAtNjg5OCw2 ICs2OTAyLDcgQEAKICAgc3BsaXRfZG91YmxlX21vZGUgKDxEV0k+bW9kZSwgJm9wZXJhbmRzWzBd LCAzLCAmb3BlcmFuZHNbMF0sICZvcGVyYW5kc1szXSk7CiAgIGlmIChvcGVyYW5kc1syXSA9PSBj b25zdDBfcnR4KQogICAgIHsKKyAgICAgIGVtaXRfbW92ZV9pbnNuIChvcGVyYW5kc1swXSwgb3Bl cmFuZHNbMV0pOwogICAgICAgaXg4Nl9leHBhbmRfYmluYXJ5X29wZXJhdG9yIChNSU5VUywgPE1P REU+bW9kZSwgJm9wZXJhbmRzWzNdKTsKICAgICAgIERPTkU7CiAgICAgfQpAQCAtNzA4MCw5ICs3 MDg1LDEwIEBACiAJICAgIChtaW51czo8RFdJPiAobWF0Y2hfZHVwIDEpIChtYXRjaF9kdXAgMikp KSkpCiAgICAoc2V0IChtYXRjaF9vcGVyYW5kOjxEV0k+IDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5k IiAiPXJvLHIiKQogCShtaW51czo8RFdJPiAobWF0Y2hfZHVwIDEpIChtYXRjaF9kdXAgMikpKV0K LSAgIml4ODZfYmluYXJ5X29wZXJhdG9yX29rIChNSU5VUywgPE1PREU+bW9kZSwgb3BlcmFuZHMp IgorICAiaXg4Nl9iaW5hcnlfb3BlcmF0b3Jfb2sgKE1JTlVTLCA8TU9ERT5tb2RlLCBvcGVyYW5k cykKKyAgICYmIGl4ODZfcHJlX3JlbG9hZF9zcGxpdCAoKSIKICAgIiMiCi0gICImJiByZWxvYWRf Y29tcGxldGVkIgorICAiJiYgMSIKICAgWyhwYXJhbGxlbCBbKHNldCAocmVnOkNDIEZMQUdTX1JF RykKIAkJICAgKGNvbXBhcmU6Q0MgKG1hdGNoX2R1cCAxKSAobWF0Y2hfZHVwIDIpKSkKIAkgICAg ICAoc2V0IChtYXRjaF9kdXAgMCkKQEAgLTcxMDYsOSArNzExMiw3IEBACiAJCSAgICAgICAobWF0 Y2hfZHVwIDQpCiAJCSAgICAgICAobHR1OkRXSUggKHJlZzpDQyBGTEFHU19SRUcpIChjb25zdF9p bnQgMCkpKQogCQkgICAgIChtYXRjaF9kdXAgNSkpKV0pXQotewotICBzcGxpdF9kb3VibGVfbW9k ZSAoPERXST5tb2RlLCAmb3BlcmFuZHNbMF0sIDMsICZvcGVyYW5kc1swXSwgJm9wZXJhbmRzWzNd KTsKLX0pCisgICJzcGxpdF9kb3VibGVfbW9kZSAoPERXST5tb2RlLCAmb3BlcmFuZHNbMF0sIDMs ICZvcGVyYW5kc1swXSwgJm9wZXJhbmRzWzNdKTsiKQogCiAoZGVmaW5lX2luc25fYW5kX3NwbGl0 ICIqc3Vidjxkd2k+NF9kb3VibGV3b3JkXzEiCiAgIFsoc2V0IChyZWc6Q0NPIEZMQUdTX1JFRykK QEAgLTcxMjUsOSArNzEyOSwxMCBAQAogCShtaW51czo8RFdJPiAobWF0Y2hfZHVwIDEpIChtYXRj aF9kdXAgMikpKV0KICAgIml4ODZfYmluYXJ5X29wZXJhdG9yX29rIChNSU5VUywgPE1PREU+bW9k ZSwgb3BlcmFuZHMpCiAgICAmJiBDT05TVF9TQ0FMQVJfSU5UX1AgKG9wZXJhbmRzWzJdKQotICAg JiYgcnR4X2VxdWFsX3AgKG9wZXJhbmRzWzJdLCBvcGVyYW5kc1szXSkiCisgICAmJiBydHhfZXF1 YWxfcCAob3BlcmFuZHNbMl0sIG9wZXJhbmRzWzNdKQorICAgJiYgaXg4Nl9wcmVfcmVsb2FkX3Nw bGl0ICgpIgogICAiIyIKLSAgIiYmIHJlbG9hZF9jb21wbGV0ZWQiCisgICImJiAxIgogICBbKHBh cmFsbGVsIFsoc2V0IChyZWc6Q0MgRkxBR1NfUkVHKQogCQkgICAoY29tcGFyZTpDQyAobWF0Y2hf ZHVwIDEpIChtYXRjaF9kdXAgMikpKQogCSAgICAgIChzZXQgKG1hdGNoX2R1cCAwKQpAQCAtNzE1 NSw2ICs3MTYwLDcgQEAKICAgc3BsaXRfZG91YmxlX21vZGUgKDxEV0k+bW9kZSwgJm9wZXJhbmRz WzBdLCAzLCAmb3BlcmFuZHNbMF0sICZvcGVyYW5kc1szXSk7CiAgIGlmIChvcGVyYW5kc1syXSA9 PSBjb25zdDBfcnR4KQogICAgIHsKKyAgICAgIGVtaXRfbW92ZV9pbnNuIChvcGVyYW5kc1swXSwg b3BlcmFuZHNbMV0pOwogICAgICAgZW1pdF9pbnNuIChnZW5fc3Vidjxtb2RlPjRfMSAob3BlcmFu ZHNbM10sIG9wZXJhbmRzWzRdLCBvcGVyYW5kc1s1XSwKIAkJCQkgICAgb3BlcmFuZHNbNV0pKTsK ICAgICAgIERPTkU7CkBAIC03ODA1LDkgKzc4MTEsMTAgQEAKIAkgIChtYXRjaF9kdXAgMSkpKQog ICAgKHNldCAobWF0Y2hfb3BlcmFuZDo8RFdJPiAwICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIj1y byxyIikKIAkocGx1czo8RFdJPiAobWF0Y2hfZHVwIDEpIChtYXRjaF9kdXAgMikpKV0KLSAgIml4 ODZfYmluYXJ5X29wZXJhdG9yX29rIChQTFVTLCA8RFdJPm1vZGUsIG9wZXJhbmRzKSIKKyAgIml4 ODZfYmluYXJ5X29wZXJhdG9yX29rIChQTFVTLCA8RFdJPm1vZGUsIG9wZXJhbmRzKQorICAgJiYg aXg4Nl9wcmVfcmVsb2FkX3NwbGl0ICgpIgogICAiIyIKLSAgIiYmIHJlbG9hZF9jb21wbGV0ZWQi CisgICImJiAxIgogICBbKHBhcmFsbGVsIFsoc2V0IChyZWc6Q0NDIEZMQUdTX1JFRykKIAkJICAg KGNvbXBhcmU6Q0NDCiAJCSAgICAgKHBsdXM6RFdJSCAobWF0Y2hfZHVwIDEpIChtYXRjaF9kdXAg MikpCkBAIC03ODM0LDYgKzc4NDEsNyBAQAogICBzcGxpdF9kb3VibGVfbW9kZSAoPERXST5tb2Rl LCAmb3BlcmFuZHNbMF0sIDMsICZvcGVyYW5kc1swXSwgJm9wZXJhbmRzWzNdKTsKICAgaWYgKG9w ZXJhbmRzWzJdID09IGNvbnN0MF9ydHgpCiAgICAgeworICAgICAgZW1pdF9tb3ZlX2luc24gKG9w ZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSk7CiAgICAgICBlbWl0X2luc24gKGdlbl9hZGRjYXJyeTxt b2RlPl8wIChvcGVyYW5kc1szXSwgb3BlcmFuZHNbNF0sIG9wZXJhbmRzWzVdKSk7CiAgICAgICBE T05FOwogICAgIH0KQEAgLTEwOTc3LDkgKzEwOTg1LDEwIEBACiAgIFsoc2V0IChtYXRjaF9vcGVy YW5kOjxEV0k+IDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiPXJvIikKIAkobmVnOjxEV0k+ICht YXRjaF9vcGVyYW5kOjxEV0k+IDEgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiMCIpKSkKICAgIChj bG9iYmVyIChyZWc6Q0MgRkxBR1NfUkVHKSldCi0gICJpeDg2X3VuYXJ5X29wZXJhdG9yX29rIChO RUcsIDxEV0k+bW9kZSwgb3BlcmFuZHMpIgorICAiaXg4Nl91bmFyeV9vcGVyYXRvcl9vayAoTkVH LCA8RFdJPm1vZGUsIG9wZXJhbmRzKQorICAgJiYgaXg4Nl9wcmVfcmVsb2FkX3NwbGl0ICgpIgog ICAiIyIKLSAgIiYmIHJlbG9hZF9jb21wbGV0ZWQiCisgICImJiAxIgogICBbKHBhcmFsbGVsCiAg ICAgWyhzZXQgKHJlZzpDQ0MgRkxBR1NfUkVHKQogCSAgKG5lOkNDQyAobWF0Y2hfZHVwIDEpIChj b25zdF9pbnQgMCkpKQo= --00000000000049b89005e073b1cc--