From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 115633 invoked by alias); 24 Jun 2019 11:37:18 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 115618 invoked by uid 89); 24 Jun 2019 11:37:17 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=gate X-HELO: mail-lf1-f49.google.com Received: from mail-lf1-f49.google.com (HELO mail-lf1-f49.google.com) (209.85.167.49) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Jun 2019 11:37:15 +0000 Received: by mail-lf1-f49.google.com with SMTP id p24so9760325lfo.6 for ; Mon, 24 Jun 2019 04:37:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=AIsCYfhjd1MYYBjUjLXnqP0mKlmZkipJ6FlZZfFGvCw=; b=emjiAxqp0ybqFoukB5yk75VxFxBRnGKyxFpmOyHUd9LkjJxzl0cD2BDEcRdURkc+so GACLie/f8AB+c7cVbU6iKl/EmKdIaCAnn6JlH2MYjf1CrvP0z02dy/TzlMQsPhvrywTh R5bKR2hA5qU9CSbhdf+duOO84XhFq1u5qV0VqIthh2BZD8Jh1u3R32g2+on/4A/Taf/e eEIvXQukiXJSXwvbIOGkyBxiU/IMGvmd4a7yjwzkGDYatLbO4v8n+V4aBdIlGdMO5+xM +0AzF8Oqcw4Zb4vZPCM0LKFb8OZnltghuKf6X76bZSJtRGya9YDDfpXmRykokXDLJleH ICTA== MIME-Version: 1.0 References: In-Reply-To: From: Prathamesh Kulkarni Date: Mon, 24 Jun 2019 11:37:00 -0000 Message-ID: Subject: Re: [SVE] [fwprop] PR88833 - Redundant moves for WHILELO-based loops To: Prathamesh Kulkarni , gcc Patches , Richard Sandiford Content-Type: multipart/mixed; boundary="000000000000c0ac85058c103ba7" X-IsSubscribed: yes X-SW-Source: 2019-06/txt/msg01431.txt.bz2 --000000000000c0ac85058c103ba7 Content-Type: text/plain; charset="UTF-8" Content-length: 4209 On Mon, 24 Jun 2019 at 14:59, Richard Sandiford wrote: > > Prathamesh Kulkarni writes: > > diff --git a/gcc/fwprop.c b/gcc/fwprop.c > > index 45703fe5f01..93a1a10c9a6 100644 > > --- a/gcc/fwprop.c > > +++ b/gcc/fwprop.c > > @@ -547,6 +547,54 @@ propagate_rtx_1 (rtx *px, rtx old_rtx, rtx new_rtx, int flags) > > tem = simplify_gen_subreg (mode, op0, GET_MODE (SUBREG_REG (x)), > > SUBREG_BYTE (x)); > > } > > + > > + else > > + { > > + rtvec vec; > > + rtvec newvec; > > + const char *fmt = GET_RTX_FORMAT (code); > > + rtx op; > > + > > + for (int i = 0; fmt[i]; i++) > > + switch (fmt[i]) > > + { > > + case 'E': > > + vec = XVEC (x, i); > > + newvec = vec; > > + for (int j = 0; j < GET_NUM_ELEM (vec); j++) > > + { > > + op = RTVEC_ELT (vec, j); > > + valid_ops &= propagate_rtx_1 (&op, old_rtx, new_rtx, flags); > > + if (op != RTVEC_ELT (vec, j)) > > + { > > + if (newvec == vec) > > + { > > + newvec = shallow_copy_rtvec (vec); > > + if (!tem) > > + tem = shallow_copy_rtx (x); > > + XVEC (tem, i) = newvec; > > + } > > + RTVEC_ELT (newvec, j) = op; > > + } > > + } > > + break; > > Misindented break: should be indented two columns further. > > > + > > + case 'e': > > + if (XEXP (x, i)) > > + { > > + op = XEXP (x, i); > > + valid_ops &= propagate_rtx_1 (&op, old_rtx, new_rtx, flags); > > + if (op != XEXP (x, i)) > > + { > > + if (!tem) > > + tem = shallow_copy_rtx (x); > > + XEXP (tem, i) = op; > > + } > > + } > > + break; > > Same here. > > > + } > > + } > > + > > break; > > > > case RTX_OBJ: > > @@ -1370,10 +1418,11 @@ forward_propagate_and_simplify (df_ref use, rtx_insn *def_insn, rtx def_set) > > > > /* Given a use USE of an insn, if it has a single reaching > > definition, try to forward propagate it into that insn. > > - Return true if cfg cleanup will be needed. */ > > + Return true if cfg cleanup will be needed. > > + REG_PROP_ONLY is true if we should only propagate register copies. */ > > > > static bool > > -forward_propagate_into (df_ref use) > > +forward_propagate_into (df_ref use, bool reg_prop_only = false) > > { > > df_ref def; > > rtx_insn *def_insn, *use_insn; > > @@ -1394,10 +1443,6 @@ forward_propagate_into (df_ref use) > > if (DF_REF_IS_ARTIFICIAL (def)) > > return false; > > > > - /* Do not propagate loop invariant definitions inside the loop. */ > > - if (DF_REF_BB (def)->loop_father != DF_REF_BB (use)->loop_father) > > - return false; > > - > > /* Check if the use is still present in the insn! */ > > use_insn = DF_REF_INSN (use); > > if (DF_REF_FLAGS (use) & DF_REF_IN_NOTE) > > @@ -1415,6 +1460,16 @@ forward_propagate_into (df_ref use) > > if (!def_set) > > return false; > > > > + if (reg_prop_only && !REG_P (SET_SRC (def_set))) > > + return false; > > + > > + /* Allow propagating def inside loop only if source of def_set is > > + reg, since replacing reg by source reg shouldn't increase cost. */ > > Maybe: > > /* Allow propagations into a loop only for reg-to-reg copies, since > replacing one register by another shouldn't increase the cost. */ > > > + > > + if (DF_REF_BB (def)->loop_father != DF_REF_BB (use)->loop_father > > + && !REG_P (SET_SRC (def_set))) > > + return false; > > To be extra safe, I think we should check that the SET_DEST is a REG_P > in both cases, to exclude REG-to-SUBREG copies. Thanks for the suggestions. Does the attached version look OK ? Thanks, Prathamesh > > Thanks, > Richard --000000000000c0ac85058c103ba7 Content-Type: text/x-patch; charset="US-ASCII"; name="pr88833-6.diff" Content-Disposition: attachment; filename="pr88833-6.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jxab2jo80 Content-length: 7776 ZGlmZiAtLWdpdCBhL2djYy9md3Byb3AuYyBiL2djYy9md3Byb3AuYwppbmRl eCA0NTcwM2ZlNWYwMS4uYzVhYmViYjc4MzIgMTAwNjQ0Ci0tLSBhL2djYy9m d3Byb3AuYworKysgYi9nY2MvZndwcm9wLmMKQEAgLTU0Nyw2ICs1NDcsNTQg QEAgcHJvcGFnYXRlX3J0eF8xIChydHggKnB4LCBydHggb2xkX3J0eCwgcnR4 IG5ld19ydHgsIGludCBmbGFncykKIAkgIHRlbSA9IHNpbXBsaWZ5X2dlbl9z dWJyZWcgKG1vZGUsIG9wMCwgR0VUX01PREUgKFNVQlJFR19SRUcgKHgpKSwK IAkJCQkgICAgIFNVQlJFR19CWVRFICh4KSk7CiAJfQorCisgICAgICBlbHNl CisJeworCSAgcnR2ZWMgdmVjOworCSAgcnR2ZWMgbmV3dmVjOworCSAgY29u c3QgY2hhciAqZm10ID0gR0VUX1JUWF9GT1JNQVQgKGNvZGUpOworCSAgcnR4 IG9wOworCisJICBmb3IgKGludCBpID0gMDsgZm10W2ldOyBpKyspCisJICAg IHN3aXRjaCAoZm10W2ldKQorCSAgICAgIHsKKwkgICAgICBjYXNlICdFJzoK KwkJdmVjID0gWFZFQyAoeCwgaSk7CisJCW5ld3ZlYyA9IHZlYzsKKwkJZm9y IChpbnQgaiA9IDA7IGogPCBHRVRfTlVNX0VMRU0gKHZlYyk7IGorKykKKwkJ ICB7CisJCSAgICBvcCA9IFJUVkVDX0VMVCAodmVjLCBqKTsKKwkJICAgIHZh bGlkX29wcyAmPSBwcm9wYWdhdGVfcnR4XzEgKCZvcCwgb2xkX3J0eCwgbmV3 X3J0eCwgZmxhZ3MpOworCQkgICAgaWYgKG9wICE9IFJUVkVDX0VMVCAodmVj LCBqKSkKKwkJICAgICAgeworCQkJaWYgKG5ld3ZlYyA9PSB2ZWMpCisJCQkg IHsKKwkJCSAgICBuZXd2ZWMgPSBzaGFsbG93X2NvcHlfcnR2ZWMgKHZlYyk7 CisJCQkgICAgaWYgKCF0ZW0pCisJCQkgICAgICB0ZW0gPSBzaGFsbG93X2Nv cHlfcnR4ICh4KTsKKwkJCSAgICBYVkVDICh0ZW0sIGkpID0gbmV3dmVjOwor CQkJICB9CisJCQlSVFZFQ19FTFQgKG5ld3ZlYywgaikgPSBvcDsKKwkJICAg ICAgfQorCQkgIH0KKwkgICAgICAgIGJyZWFrOworCisJICAgICAgY2FzZSAn ZSc6CisJCWlmIChYRVhQICh4LCBpKSkKKwkJICB7CisJCSAgICBvcCA9IFhF WFAgKHgsIGkpOworCQkgICAgdmFsaWRfb3BzICY9IHByb3BhZ2F0ZV9ydHhf MSAoJm9wLCBvbGRfcnR4LCBuZXdfcnR4LCBmbGFncyk7CisJCSAgICBpZiAo b3AgIT0gWEVYUCAoeCwgaSkpCisJCSAgICAgIHsKKwkJCWlmICghdGVtKQor CQkJICB0ZW0gPSBzaGFsbG93X2NvcHlfcnR4ICh4KTsKKwkJCVhFWFAgKHRl bSwgaSkgPSBvcDsKKwkJICAgICAgfQorCQkgIH0KKwkgICAgICAgIGJyZWFr OworCSAgICAgIH0KKwl9CisKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBS VFhfT0JKOgpAQCAtMTM3MCwxMCArMTQxOCwxMSBAQCBmb3J3YXJkX3Byb3Bh Z2F0ZV9hbmRfc2ltcGxpZnkgKGRmX3JlZiB1c2UsIHJ0eF9pbnNuICpkZWZf aW5zbiwgcnR4IGRlZl9zZXQpCiAKIC8qIEdpdmVuIGEgdXNlIFVTRSBvZiBh biBpbnNuLCBpZiBpdCBoYXMgYSBzaW5nbGUgcmVhY2hpbmcKICAgIGRlZmlu aXRpb24sIHRyeSB0byBmb3J3YXJkIHByb3BhZ2F0ZSBpdCBpbnRvIHRoYXQg aW5zbi4KLSAgIFJldHVybiB0cnVlIGlmIGNmZyBjbGVhbnVwIHdpbGwgYmUg bmVlZGVkLiAgKi8KKyAgIFJldHVybiB0cnVlIGlmIGNmZyBjbGVhbnVwIHdp bGwgYmUgbmVlZGVkLgorICAgUkVHX1BST1BfT05MWSBpcyB0cnVlIGlmIHdl IHNob3VsZCBvbmx5IHByb3BhZ2F0ZSByZWdpc3RlciBjb3BpZXMuICAqLwog CiBzdGF0aWMgYm9vbAotZm9yd2FyZF9wcm9wYWdhdGVfaW50byAoZGZfcmVm IHVzZSkKK2ZvcndhcmRfcHJvcGFnYXRlX2ludG8gKGRmX3JlZiB1c2UsIGJv b2wgcmVnX3Byb3Bfb25seSA9IGZhbHNlKQogewogICBkZl9yZWYgZGVmOwog ICBydHhfaW5zbiAqZGVmX2luc24sICp1c2VfaW5zbjsKQEAgLTEzOTQsMTAg KzE0NDMsNiBAQCBmb3J3YXJkX3Byb3BhZ2F0ZV9pbnRvIChkZl9yZWYgdXNl KQogICBpZiAoREZfUkVGX0lTX0FSVElGSUNJQUwgKGRlZikpCiAgICAgcmV0 dXJuIGZhbHNlOwogCi0gIC8qIERvIG5vdCBwcm9wYWdhdGUgbG9vcCBpbnZh cmlhbnQgZGVmaW5pdGlvbnMgaW5zaWRlIHRoZSBsb29wLiAgKi8KLSAgaWYg KERGX1JFRl9CQiAoZGVmKS0+bG9vcF9mYXRoZXIgIT0gREZfUkVGX0JCICh1 c2UpLT5sb29wX2ZhdGhlcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KICAgLyog Q2hlY2sgaWYgdGhlIHVzZSBpcyBzdGlsbCBwcmVzZW50IGluIHRoZSBpbnNu ISAgKi8KICAgdXNlX2luc24gPSBERl9SRUZfSU5TTiAodXNlKTsKICAgaWYg KERGX1JFRl9GTEFHUyAodXNlKSAmIERGX1JFRl9JTl9OT1RFKQpAQCAtMTQx NSw2ICsxNDYwLDE5IEBAIGZvcndhcmRfcHJvcGFnYXRlX2ludG8gKGRmX3Jl ZiB1c2UpCiAgIGlmICghZGVmX3NldCkKICAgICByZXR1cm4gZmFsc2U7CiAK KyAgaWYgKHJlZ19wcm9wX29ubHkKKyAgICAgICYmICFSRUdfUCAoU0VUX1NS QyAoZGVmX3NldCkpCisgICAgICAmJiAhUkVHX1AgKFNFVF9ERVNUIChkZWZf c2V0KSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEFsbG93IHByb3Bh Z2F0aW9ucyBpbnRvIGEgbG9vcCBvbmx5IGZvciByZWctdG8tcmVnIGNvcGll cywgc2luY2UKKyAgICAgcmVwbGFjaW5nIG9uZSByZWdpc3RlciBieSBhbm90 aGVyIHNob3VsZG4ndCBpbmNyZWFzZSB0aGUgY29zdC4gICovCisKKyAgaWYg KERGX1JFRl9CQiAoZGVmKS0+bG9vcF9mYXRoZXIgIT0gREZfUkVGX0JCICh1 c2UpLT5sb29wX2ZhdGhlcgorICAgICAgJiYgIVJFR19QIChTRVRfU1JDIChk ZWZfc2V0KSkKKyAgICAgICYmICFSRUdfUCAoU0VUX0RFU1QgKGRlZl9zZXQp KSkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgLyogT25seSB0cnkgb25lIGtp bmQgb2YgcHJvcGFnYXRpb24uICBJZiB0d28gYXJlIHBvc3NpYmxlLCB3ZSds bAogICAgICBkbyBpdCBvbiB0aGUgZm9sbG93aW5nIGl0ZXJhdGlvbnMuICAq LwogICBpZiAoZm9yd2FyZF9wcm9wYWdhdGVfYW5kX3NpbXBsaWZ5ICh1c2Us IGRlZl9pbnNuLCBkZWZfc2V0KQpAQCAtMTQ4Myw3ICsxNTQxLDcgQEAgZ2F0 ZV9md3Byb3AgKHZvaWQpCiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWZ3 cHJvcCAodm9pZCkKK2Z3cHJvcCAoYm9vbCBmd3Byb3BfYWRkcl9wKQogewog ICB1bnNpZ25lZCBpOwogCkBAIC0xNTAyLDExICsxNTYwLDE2IEBAIGZ3cHJv cCAodm9pZCkKIAogICAgICAgZGZfcmVmIHVzZSA9IERGX1VTRVNfR0VUIChp KTsKICAgICAgIGlmICh1c2UpCi0JaWYgKERGX1JFRl9UWVBFICh1c2UpID09 IERGX1JFRl9SRUdfVVNFCi0JICAgIHx8IERGX1JFRl9CQiAodXNlKS0+bG9v cF9mYXRoZXIgPT0gTlVMTAotCSAgICAvKiBUaGUgb3V0ZXIgbW9zdCBsb29w IGlzIG5vdCByZWFsbHkgYSBsb29wLiAgKi8KLQkgICAgfHwgbG9vcF9vdXRl ciAoREZfUkVGX0JCICh1c2UpLT5sb29wX2ZhdGhlcikgPT0gTlVMTCkKLQkg IGZvcndhcmRfcHJvcGFnYXRlX2ludG8gKHVzZSk7CisJeworCSAgaWYgKERG X1JFRl9UWVBFICh1c2UpID09IERGX1JFRl9SRUdfVVNFCisJICAgICAgfHwg REZfUkVGX0JCICh1c2UpLT5sb29wX2ZhdGhlciA9PSBOVUxMCisJICAgICAg LyogVGhlIG91dGVyIG1vc3QgbG9vcCBpcyBub3QgcmVhbGx5IGEgbG9vcC4g ICovCisJICAgICAgfHwgbG9vcF9vdXRlciAoREZfUkVGX0JCICh1c2UpLT5s b29wX2ZhdGhlcikgPT0gTlVMTCkKKwkgICAgZm9yd2FyZF9wcm9wYWdhdGVf aW50byAodXNlLCBmd3Byb3BfYWRkcl9wKTsKKworCSAgZWxzZSBpZiAoZndw cm9wX2FkZHJfcCkKKwkgICAgZm9yd2FyZF9wcm9wYWdhdGVfaW50byAodXNl LCBmYWxzZSk7CisJfQogICAgIH0KIAogICBmd3Byb3BfZG9uZSAoKTsKQEAg LTE1MzcsNyArMTYwMCw3IEBAIHB1YmxpYzoKIAogICAvKiBvcHRfcGFzcyBt ZXRob2RzOiAqLwogICB2aXJ0dWFsIGJvb2wgZ2F0ZSAoZnVuY3Rpb24gKikg eyByZXR1cm4gZ2F0ZV9md3Byb3AgKCk7IH0KLSAgdmlydHVhbCB1bnNpZ25l ZCBpbnQgZXhlY3V0ZSAoZnVuY3Rpb24gKikgeyByZXR1cm4gZndwcm9wICgp OyB9CisgIHZpcnR1YWwgdW5zaWduZWQgaW50IGV4ZWN1dGUgKGZ1bmN0aW9u ICopIHsgcmV0dXJuIGZ3cHJvcCAoZmFsc2UpOyB9CiAKIH07IC8vIGNsYXNz IHBhc3NfcnRsX2Z3cHJvcAogCkBAIC0xNTQ5LDMzICsxNjEyLDYgQEAgbWFr ZV9wYXNzX3J0bF9md3Byb3AgKGdjYzo6Y29udGV4dCAqY3R4dCkKICAgcmV0 dXJuIG5ldyBwYXNzX3J0bF9md3Byb3AgKGN0eHQpOwogfQogCi1zdGF0aWMg dW5zaWduZWQgaW50Ci1md3Byb3BfYWRkciAodm9pZCkKLXsKLSAgdW5zaWdu ZWQgaTsKLQotICBmd3Byb3BfaW5pdCAoKTsKLQotICAvKiBHbyB0aHJvdWdo IGFsbCB0aGUgdXNlcy4gIGRmX3VzZXNfY3JlYXRlIHdpbGwgY3JlYXRlIG5l dyBvbmVzIGF0IHRoZQotICAgICBlbmQsIGFuZCB3ZSdsbCBnbyB0aHJvdWdo IHRoZW0gYXMgd2VsbC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBERl9VU0VT X1RBQkxFX1NJWkUgKCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXByb3Bh Z2F0aW9uc19sZWZ0KQotCWJyZWFrOwotCi0gICAgICBkZl9yZWYgdXNlID0g REZfVVNFU19HRVQgKGkpOwotICAgICAgaWYgKHVzZSkKLQlpZiAoREZfUkVG X1RZUEUgKHVzZSkgIT0gREZfUkVGX1JFR19VU0UKLQkgICAgJiYgREZfUkVG X0JCICh1c2UpLT5sb29wX2ZhdGhlciAhPSBOVUxMCi0JICAgIC8qIFRoZSBv dXRlciBtb3N0IGxvb3AgaXMgbm90IHJlYWxseSBhIGxvb3AuICAqLwotCSAg ICAmJiBsb29wX291dGVyIChERl9SRUZfQkIgKHVzZSktPmxvb3BfZmF0aGVy KSAhPSBOVUxMKQotCSAgZm9yd2FyZF9wcm9wYWdhdGVfaW50byAodXNlKTsK LSAgICB9Ci0KLSAgZndwcm9wX2RvbmUgKCk7Ci0gIHJldHVybiAwOwotfQot CiBuYW1lc3BhY2UgewogCiBjb25zdCBwYXNzX2RhdGEgcGFzc19kYXRhX3J0 bF9md3Byb3BfYWRkciA9CkBAIC0xNjAwLDcgKzE2MzYsNyBAQCBwdWJsaWM6 CiAKICAgLyogb3B0X3Bhc3MgbWV0aG9kczogKi8KICAgdmlydHVhbCBib29s IGdhdGUgKGZ1bmN0aW9uICopIHsgcmV0dXJuIGdhdGVfZndwcm9wICgpOyB9 Ci0gIHZpcnR1YWwgdW5zaWduZWQgaW50IGV4ZWN1dGUgKGZ1bmN0aW9uICop IHsgcmV0dXJuIGZ3cHJvcF9hZGRyICgpOyB9CisgIHZpcnR1YWwgdW5zaWdu ZWQgaW50IGV4ZWN1dGUgKGZ1bmN0aW9uICopIHsgcmV0dXJuIGZ3cHJvcCAo dHJ1ZSk7IH0KIAogfTsgLy8gY2xhc3MgcGFzc19ydGxfZndwcm9wX2FkZHIK IApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wcjg4 ODMzLmY5MCBiL2djYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcHI4ODgzMy5m OTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjIy NGU2Y2U1ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Zm9ydHJhbi5kZy9wcjg4ODMzLmY5MApAQCAtMCwwICsxLDkgQEAKKyEgeyBk Zy1kbyBhc3NlbWJsZSB7IHRhcmdldCBhYXJjaDY0X2FzbV9zdmVfb2sgfSB9 CishIHsgZGctb3B0aW9ucyAiLU8zIC1tYXJjaD1hcm12OC4yLWErc3ZlIC0t c2F2ZS10ZW1wcyIgfQorCitzdWJyb3V0aW5lIGZvbyh4KQorICByZWFsIDo6 IHgoMTAwKQorICB4ID0geCArIDEwCitlbmQgc3Vicm91dGluZSBmb28KKwor ISB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIge1x0d2hpbGVsb1x0cFsw LTldK1wucywgd3pyLCAod1swLTldKykuKlx0d2hpbGVsb1x0cFswLTldK1wu cywgd1swLTldKywgXDF9IH0gfQo= --000000000000c0ac85058c103ba7--