<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 08/25/2015 05:08 PM, Pete Cooper
wrote:<br>
</div>
<blockquote
cite="mid:C23C56ED-627D-402A-BE11-9123C09BB317@apple.com"
type="cite">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Aug 25, 2015, at 4:54 PM, Philip Reames <<a
moz-do-not-send="true"
href="mailto:listmail@philipreames.com" class="">listmail@philipreames.com</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="">Pete,<br class="">
<br class="">
I'm not really following why your example is problematic,
even for an non-zero address space. We're not changing
anything about the interpretation of the null pointer with
this change. We're simply propagating that the pointer
*isn't* null, whatever meaning that might have for the
given address space. What I am missing in your
explanation? Where does this go wrong?<br class="">
</div>
</div>
</blockquote>
Ah, sorry i should have explained better.</div>
<div><br class="">
</div>
<div>What i was describing was a bit of a what-if. If we had an
optimization which propagated the not null to the function
itself, which isn’t difficult now that you’ve added it to all
the eligible call sites, then it would be possible to
incorrectly remove code in the example I gave.<br class="">
</div>
</blockquote>
I'm willing to accept the non-null propagation from the call sites
to the callee for an internal function. However, I'm still not
seeing why the transform is incorrect, If we proved the pointer
can't be null at the one and only call site, the check inside the
function obviously can't ever see null. What's wrong with this
picture? Where'd we go wrong? (Is it just the issue below?)<br>
<blockquote
cite="mid:C23C56ED-627D-402A-BE11-9123C09BB317@apple.com"
type="cite">
<div>
<blockquote type="cite" class="">
<div class="">
<div class=""><br class="">
Are you possibly trying to say that we false concluded it
was nonnull at the call site? i.e. Did you find a bug in
isKnownNonNull for non-zero address space pointers?<br
class="">
</div>
</div>
</blockquote>
But yes, this is the real bug. This is the relevant code, which
really needs to be checking for address spaces.</div>
<div><br class="">
</div>
<div>
<div style="margin: 0px; font-size: 11px; line-height: normal;
font-family: Menlo; color: rgb(0, 132, 0);" class=""><span
style="font-variant-ligatures: no-common-ligatures; color:
#000000" class=""> </span>// Global values are not null
unless extern weak.</div>
<div style="margin: 0px; font-size: 11px; line-height: normal;
font-family: Menlo;" class=""> <span
style="font-variant-ligatures: no-common-ligatures; color:
#bb2ca2" class="">if</span> (<span
style="font-variant-ligatures: no-common-ligatures; color:
#bb2ca2" class="">const</span> <span
style="font-variant-ligatures: no-common-ligatures; color:
#4f8187" class="">GlobalValue</span> *GV =
dyn_cast<GlobalValue>(V))</div>
<div style="margin: 0px; font-size: 11px; line-height: normal;
font-family: Menlo; color: rgb(49, 89, 93);" class=""><span
style="font-variant-ligatures: no-common-ligatures; color:
#000000" class=""> </span><span
style="font-variant-ligatures: no-common-ligatures; color:
#bb2ca2" class="">return</span><span
style="font-variant-ligatures: no-common-ligatures; color:
#000000" class=""> !GV-></span>hasExternalWeakLinkage<span
style="font-variant-ligatures: no-common-ligatures; color:
#000000" class="">();</span></div>
</div>
</blockquote>
Want to send a patch? I'll be happy to review. <br>
<blockquote
cite="mid:C23C56ED-627D-402A-BE11-9123C09BB317@apple.com"
type="cite">
<div><br class="">
</div>
<div>Cheers,</div>
<div>Pete<br class="">
<blockquote type="cite" class="">
<div class="">
<div class=""><br class="">
Philip<br class="">
<br class="">
On 08/25/2015 11:09 AM, Pete Cooper wrote:<br class="">
<blockquote type="cite" class="">Hey Philip<br class="">
<br class="">
We just came across a case internally where this
optimization applied not null to a pointer with an
address space other than 0.<br class="">
<br class="">
Sorry, I reviewed this and really should have thought
about that at the time.<br class="">
<br class="">
What are your thoughts on this? I believe we can only
assume nullness on address space 0 and have to leave all
others alone.<br class="">
<br class="">
I don’t think we have an optimization pipeline which
will expose this, but lets assume that we have something
like:<br class="">
<br class="">
foo(&g)<br class="">
...<br class="">
foo(int *addresspace(1) p) {<br class="">
if (p != null) { bar(); }<br class="">
}<br class="">
<br class="">
then you could imagine us propagating the not null from
the call to the callee (if all calls to the callee have
not null), and so we have<br class="">
<br class="">
foo(&g __attribute__((not null)) )<br class="">
...<br class="">
foo(int *addresspace(1) __attribute__((not null)) p) {<br
class="">
if (p != null) { bar(); }<br class="">
}<br class="">
<br class="">
and then some optimization would constant fold the if to
give us<br class="">
<br class="">
foo(int *addresspace(1) __attribute__((not null)) p) {<br
class="">
bar();<br class="">
}<br class="">
<br class="">
which might be incorrect if 0 was a valid address on
address space 1.<br class="">
<br class="">
Cheers,<br class="">
Pete<br class="">
<blockquote type="cite" class="">On Jun 16, 2015, at
1:24 PM, Philip Reames <<a moz-do-not-send="true"
href="mailto:listmail@philipreames.com" class="">listmail@philipreames.com</a>>
wrote:<br class="">
<br class="">
Author: reames<br class="">
Date: Tue Jun 16 15:24:25 2015<br class="">
New Revision: 239849<br class="">
<br class="">
URL: <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239849-26view-3Drev&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=zCZOTfrNGX-URsmw7bhhRVxYQvKoRUQU_sSrbdhbtX8&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239849-26view-3Drev&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=zCZOTfrNGX-URsmw7bhhRVxYQvKoRUQU_sSrbdhbtX8&e=</a>
Log:<br class="">
Reapply 239795 - [InstCombine] Propagate non-null
facts to call parameters<br class="">
<br class="">
The original change broke clang side tests. I will be
submitting those momentarily. This change includes
post commit feedback on the original change from from
Pete Cooper.<br class="">
<br class="">
Original Submission comments:<br class="">
If a parameter to a function is known non-null, use
the existing parameter attributes to record that fact
at the call site. This has no optimization benefit by
itself - that I know of - but is an enabling change
for <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9129&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=xdQ7r5usnFj24cbkbi7xrqULBEj9KxRiv5IHualA0vA&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9129&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=xdQ7r5usnFj24cbkbi7xrqULBEj9KxRiv5IHualA0vA&e=</a>
.<br class="">
<br class="">
Differential Revision: <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9132&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=_0McocxwRnNqXY2DzhWVljrDylGa8auvq2rGWSwe85c&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9132&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=_0McocxwRnNqXY2DzhWVljrDylGa8auvq2rGWSwe85c&e=</a>
<br class="">
<br class="">
Modified:<br class="">
llvm/trunk/include/llvm/IR/CallSite.h<br class="">
llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp<br
class="">
llvm/trunk/test/CodeGen/NVPTX/intrin-nocapture.ll<br
class="">
llvm/trunk/test/Transforms/Inline/byval-tail-call.ll<br class="">
llvm/trunk/test/Transforms/InstCombine/select.ll<br
class="">
<br class="">
Modified: llvm/trunk/include/llvm/IR/CallSite.h<br
class="">
URL: <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_IR_CallSite.h-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=CVzzdRdB5oRpo9UQEYi2KTvToOeg6iF0XMftoXK5DFo&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_IR_CallSite.h-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=CVzzdRdB5oRpo9UQEYi2KTvToOeg6iF0XMftoXK5DFo&e=</a>
==============================================================================<br
class="">
--- llvm/trunk/include/llvm/IR/CallSite.h (original)<br
class="">
+++ llvm/trunk/include/llvm/IR/CallSite.h Tue Jun 16
15:24:25 2015<br class="">
@@ -27,6 +27,7 @@<br class="">
#define LLVM_IR_CALLSITE_H<br class="">
<br class="">
#include "llvm/ADT/PointerIntPair.h"<br class="">
+#include "llvm/ADT/iterator_range.h"<br class="">
#include "llvm/IR/Attributes.h"<br class="">
#include "llvm/IR/CallingConv.h"<br class="">
#include "llvm/IR/Instructions.h"<br class="">
@@ -150,6 +151,9 @@ public:<br class="">
}<br class="">
<br class="">
IterTy arg_end() const { return (*this)->op_end()
- getArgumentEndOffset(); }<br class="">
+ iterator_range<IterTy> args() const {<br
class="">
+ return iterator_range<IterTy>(arg_begin(),
arg_end());<br class="">
+ }<br class="">
bool arg_empty() const { return arg_end() ==
arg_begin(); }<br class="">
unsigned arg_size() const { return
unsigned(arg_end() - arg_begin()); }<br class="">
<br class="">
<br class="">
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp<br
class="">
URL: <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_InstCombine_InstCombineCalls.cpp-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=BsxlpsGfx6RU9emQe7mFuMYbqKdxo8JJtB7UqpwfeKU&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_InstCombine_InstCombineCalls.cpp-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=BsxlpsGfx6RU9emQe7mFuMYbqKdxo8JJtB7UqpwfeKU&e=</a>
==============================================================================<br
class="">
---
llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
(original)<br class="">
+++
llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
Tue Jun 16 15:24:25 2015<br class="">
@@ -1391,11 +1391,29 @@ static IntrinsicInst
*FindInitTrampoline<br class="">
// visitCallSite - Improvements for call and invoke
instructions.<br class="">
//<br class="">
Instruction *InstCombiner::visitCallSite(CallSite CS)
{<br class="">
+<br class="">
if (isAllocLikeFn(CS.getInstruction(), TLI))<br
class="">
return visitAllocSite(*CS.getInstruction());<br
class="">
<br class="">
bool Changed = false;<br class="">
<br class="">
+ // Mark any parameters that are known to be
non-null with the nonnull<br class="">
+ // attribute. This is helpful for inlining calls
to functions with null<br class="">
+ // checks on their arguments.<br class="">
+ unsigned ArgNo = 0;<br class="">
+ for (Value *V : CS.args()) {<br class="">
+ if (!CS.paramHasAttr(ArgNo+1, Attribute::NonNull)
&&<br class="">
+ isKnownNonNull(V)) {<br class="">
+ AttributeSet AS = CS.getAttributes();<br
class="">
+ AS =
AS.addAttribute(CS.getInstruction()->getContext(),
ArgNo+1,<br class="">
+ Attribute::NonNull);<br
class="">
+ CS.setAttributes(AS);<br class="">
+ Changed = true;<br class="">
+ }<br class="">
+ ArgNo++;<br class="">
+ }<br class="">
+ assert(ArgNo == CS.arg_size() && "sanity
check");<br class="">
+<br class="">
// If the callee is a pointer to a function, attempt
to move any casts to the<br class="">
// arguments of the call/invoke.<br class="">
Value *Callee = CS.getCalledValue();<br class="">
<br class="">
Modified:
llvm/trunk/test/CodeGen/NVPTX/intrin-nocapture.ll<br
class="">
URL: <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_NVPTX_intrin-2Dnocapture.ll-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=kckzUpGGcdQiQaHhAEGRU6W6UAfgOgvxHHo3Wf-D9_4&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_NVPTX_intrin-2Dnocapture.ll-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=kckzUpGGcdQiQaHhAEGRU6W6UAfgOgvxHHo3Wf-D9_4&e=</a>
==============================================================================<br
class="">
--- llvm/trunk/test/CodeGen/NVPTX/intrin-nocapture.ll
(original)<br class="">
+++ llvm/trunk/test/CodeGen/NVPTX/intrin-nocapture.ll
Tue Jun 16 15:24:25 2015<br class="">
@@ -11,7 +11,7 @@ declare i32 addrspace(1)*
@llvm.nvvm.ptr<br class="">
; CHECK: @bar<br class="">
define void @bar() {<br class="">
%t1 = alloca i32<br class="">
-; CHECK: call i32 addrspace(1)*
@llvm.nvvm.ptr.gen.to.global.p1i32.p0i32(i32* %t1)<br
class="">
+; CHECK: call i32 addrspace(1)*
@llvm.nvvm.ptr.gen.to.global.p1i32.p0i32(i32* nonnull
%t1)<br class="">
; CHECK-NEXT: store i32 10, i32* %t1<br class="">
%t2 = call i32 addrspace(1)*
@llvm.nvvm.ptr.gen.to.global.p1i32.p0i32(i32* %t1)<br
class="">
store i32 10, i32* %t1<br class="">
<br class="">
Modified:
llvm/trunk/test/Transforms/Inline/byval-tail-call.ll<br
class="">
URL: <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_Inline_byval-2Dtail-2Dcall.ll-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=jdGpDmu_-liQ4QSf2MasxZbLc3jcwqygDUOa4Yzaxh4&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_Inline_byval-2Dtail-2Dcall.ll-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=jdGpDmu_-liQ4QSf2MasxZbLc3jcwqygDUOa4Yzaxh4&e=</a>
==============================================================================<br
class="">
---
llvm/trunk/test/Transforms/Inline/byval-tail-call.ll
(original)<br class="">
+++
llvm/trunk/test/Transforms/Inline/byval-tail-call.ll
Tue Jun 16 15:24:25 2015<br class="">
@@ -33,7 +33,7 @@ define void @frob(i32* %x) {<br
class="">
; CHECK: %[[POS:.*]] = alloca i32<br class="">
; CHECK: %[[VAL:.*]] = load i32, i32* %x<br class="">
; CHECK: store i32 %[[VAL]], i32* %[[POS]]<br class="">
-; CHECK: {{^ *}}call void @ext(i32* %[[POS]]<br
class="">
+; CHECK: {{^ *}}call void @ext(i32* nonnull %[[POS]]<br
class="">
; CHECK: tail call void @ext(i32* null)<br class="">
; CHECK: ret void<br class="">
tail call void @qux(i32* byval %x)<br class="">
<br class="">
Modified:
llvm/trunk/test/Transforms/InstCombine/select.ll<br
class="">
URL: <a moz-do-not-send="true"
href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_InstCombine_select.ll-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=pW5HrUeNAokTQHaGtkCTws1Ku_LNanlrzInZl5Ykkdo&e="
class="">https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_InstCombine_select.ll-3Frev-3D239849-26r1-3D239848-26r2-3D239849-26view-3Ddiff&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=pW5HrUeNAokTQHaGtkCTws1Ku_LNanlrzInZl5Ykkdo&e=</a>
==============================================================================<br
class="">
--- llvm/trunk/test/Transforms/InstCombine/select.ll
(original)<br class="">
+++ llvm/trunk/test/Transforms/InstCombine/select.ll
Tue Jun 16 15:24:25 2015<br class="">
@@ -1265,7 +1265,7 @@ define i32 @test77(i1 %flag,
i32* %x) {<br class="">
; load does.<br class="">
; CHECK-LABEL: @test77(<br class="">
; CHECK: %[[A:.*]] = alloca i32, align 1<br class="">
-; CHECK: call void @scribble_on_i32(i32* %[[A]])<br
class="">
+; CHECK: call void @scribble_on_i32(i32* nonnull
%[[A]])<br class="">
; CHECK: store i32 0, i32* %x<br class="">
; CHECK: %[[P:.*]] = select i1 %flag, i32* %[[A]],
i32* %x<br class="">
; CHECK: load i32, i32* %[[P]]<br class="">
<br class="">
<br class="">
_______________________________________________<br
class="">
llvm-commits mailing list<br class="">
<a moz-do-not-send="true"
href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br
class="">
<a class="moz-txt-link-freetext" href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.cs.uiuc.edu_mailman_listinfo_llvm-2Dcommits&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=5hlvP4QWrrzH4QOwn4guDATXRPO64TYAQrR4ljD7zYI&e=">https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.cs.uiuc.edu_mailman_listinfo_llvm-2Dcommits&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=03tkj3107244TlY4t3_hEgkDY-UG6gKwwK0wOUS3qjM&m=1F4F5ne45cMxjcevazqUxYm1cFJzKct3OPthe_IDLv8&s=5hlvP4QWrrzH4QOwn4guDATXRPO64TYAQrR4ljD7zYI&e=</a>
<br class="">
</blockquote>
</blockquote>
<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
</blockquote>
<br>
</body>
</html>