<div dir="ltr">FWIW, I'm continuing to work on a test case.<div><br></div><div>I'm trying to bugpoint reduce in a way that will target a massive compile time hit that *only* reproduces with this change (I check that a compiler with this change commented out is at least 3x faster to compile). In practice so far, I'm down to 1242 instructions in the test case and well over 10x compile time difference before/after this patch (ms -> 7s). But it doesn't in fact inf-loop in the test case I'm reducing.</div><div><br></div><div>Waiting to see how small bugpoint can get it before I try to clean it up and post it.</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Feb 5, 2018 at 1:55 PM Sanjay Patel <<a href="mailto:spatel@rotateright.com">spatel@rotateright.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Thanks for the example. I've reverted at r324276.<br></div>But it's not clear to me if the multi-use case alone is the problem. Ie, can't we cause a compile-time explosion with single-use values too given that the canEvaluate* functions don't have any recursion depth limit?<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 5, 2018 at 10:46 AM, Aboud, Amjad <span dir="ltr"><<a href="mailto:amjad.aboud@intel.com" target="_blank">amjad.aboud@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div link="blue" vlink="purple" lang="EN-US">
<div class="m_-2411230069671742697m_-7920113833564556198WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Hi Sanjay,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Please see this example, where aggressive-instcombine manage to reduce the expression “immediately”, while instcombine runs for minutes.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">define i16 @foo(i16 %in) {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">ENTRY:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %x = zext i16 %in to i32<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a1 = mul i32 %x, %x<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a2 = mul i32 %a1, %a1<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a3 = mul i32 %a2, %a2<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a4 = mul i32 %a3, %a3<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a5 = mul i32 %a4, %a4<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a6 = mul i32 %a5, %a5<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a7 = mul i32 %a6, %a6<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a8 = mul i32 %a7, %a7<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a9 = mul i32 %a8, %a8<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a10 = mul i32 %a9, %a9<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a11 = mul i32 %a10, %a10<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a12 = mul i32 %a11, %a11<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a13 = mul i32 %a12, %a12<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a14 = mul i32 %a13, %a13<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a15 = mul i32 %a14, %a14<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a16 = mul i32 %a15, %a15<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a17 = mul i32 %a16, %a16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a18 = mul i32 %a17, %a17<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a19 = mul i32 %a18, %a18<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a20 = mul i32 %a19, %a19<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a21 = mul i32 %a20, %a20<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a22 = mul i32 %a21, %a21<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a23 = mul i32 %a22, %a22<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %a24 = mul i32 %a23, %a23<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> %T = trunc i32 %a24 to i16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> ret i16 %T<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">}<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">The reason is that you did not optimize the function “</span><span style="font-size:9.5pt;font-family:Consolas;color:black">canEvaluateTruncated</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">”,
notice that same issue exists for other canEvaluate* functions.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Regards,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Amjad<u></u><u></u></span></p>
<p class="MsoNormal"><a name="m_-2411230069671742697_m_-7920113833564556198__MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></a></p>
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><a name="m_-2411230069671742697_m_-7920113833564556198______replyseparator"></a><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Sanjay Patel [mailto:<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>]
<br>
<b>Sent:</b> Monday, February 05, 2018 19:32<br>
<b>To:</b> Chandler Carruth <<a href="mailto:chandlerc@gmail.com" target="_blank">chandlerc@gmail.com</a>><br>
<b>Cc:</b> llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>>; Aboud, Amjad <<a href="mailto:amjad.aboud@intel.com" target="_blank">amjad.aboud@intel.com</a>><br>
<b>Subject:</b> Re: [llvm] r324014 - [InstCombine] allow multi-use values in canEvaluate* if all uses are in 1 inst<u></u><u></u></span></p>
</div>
</div><div><div class="m_-2411230069671742697h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">As Amjad noted in <a href="https://reviews.llvm.org/D42739" target="_blank">
D42739</a>, I failed to account for select / PHI ops with multi-uses in this patch. I've attempted to close that gap with:<br>
<a href="https://reviews.llvm.org/rL324252" target="_blank">https://reviews.llvm.org/rL324252</a><u></u><u></u></p>
</div>
<p class="MsoNormal">Please let me know if the inf-loop is gone with that change. I'm still trying to create a test that would find that gap, but assuming that was the bug, if we can get a reduction from whatever real program hit it, that would be great. Thanks!<u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Mon, Feb 5, 2018 at 7:28 AM, Sanjay Patel <<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">Thanks for letting me know. Sounds like an inf-loop.<br>
<br>
Since this patch is duplicating a transform that occurs in -aggressive-instcombine, it's possible that the bug already exists apart from this change, but might take the benign form of a transform reversal across passes, or it might be masked in that case.<u></u><u></u></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Sat, Feb 3, 2018 at 8:02 PM, Chandler Carruth <<a href="mailto:chandlerc@gmail.com" target="_blank">chandlerc@gmail.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<p class="MsoNormal">On Thu, Feb 1, 2018 at 1:57 PM Sanjay Patel via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Author: spatel<br>
Date: Thu Feb 1 13:55:53 2018<br>
New Revision: 324014<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=324014&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=324014&view=rev</a><br>
Log:<br>
[InstCombine] allow multi-use values in canEvaluate* if all uses are in 1 inst<br>
<br>
This is the enhancement suggested in D42536 to fix a shortcoming in<br>
regular InstCombine's canEvaluate* functionality.<br>
When we have multiple uses of a value, but they're all in one instruction, we can<br>
allow that expression to be narrowed or widened for the same cost as a single-use<br>
value.<br>
<br>
AFAICT, this can only matter for multiply: sub/and/or/xor/select would be simplified<br>
away if the operands are the same value; add becomes shl; shifts with a variable shift<br>
amount aren't handled.<u></u><u></u></p>
</blockquote>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">FWIW, we have at least one case which is now either inf-looping or taking dramatically longer to compile after this commit (way over 2x from what I can tell).<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We're working on building a test case, but just wanted to send a heads-up in case others are hitting slow compiles.<u></u><u></u></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal"><br>
Differential Revision: <a href="https://reviews.llvm.org/D42739" target="_blank">
https://reviews.llvm.org/D42739</a><br>
<br>
Modified:<br>
llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp<br>
llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll<br>
llvm/trunk/test/Transforms/InstCombine/icmp-mul-zext.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=324014&r1=324013&r2=324014&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=324014&r1=324013&r2=324014&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Thu Feb 1 13:55:53 2018<br>
@@ -185,8 +185,14 @@ Value *InstCombiner::EvaluateInDifferent<br>
case Instruction::Shl:<br>
case Instruction::UDiv:<br>
case Instruction::URem: {<br>
- Value *LHS = EvaluateInDifferentType(I->getOperand(0), Ty, isSigned);<br>
- Value *RHS = EvaluateInDifferentType(I->getOperand(1), Ty, isSigned);<br>
+ Value *LHS, *RHS;<br>
+ if (I->getOperand(0) == I->getOperand(1)) {<br>
+ // Don't create an unnecessary value if the operands are repeated.<br>
+ LHS = RHS = EvaluateInDifferentType(I->getOperand(0), Ty, isSigned);<br>
+ } else {<br>
+ LHS = EvaluateInDifferentType(I->getOperand(0), Ty, isSigned);<br>
+ RHS = EvaluateInDifferentType(I->getOperand(1), Ty, isSigned);<br>
+ }<br>
Res = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS);<br>
break;<br>
}<br>
@@ -320,10 +326,12 @@ static bool canNotEvaluateInType(Value *<br>
assert(!isa<Constant>(V) && "Constant should already be handled.");<br>
if (!isa<Instruction>(V))<br>
return true;<br>
- // We can't extend or shrink something that has multiple uses: doing so would<br>
- // require duplicating the instruction in general, which isn't profitable.<br>
+ // We can't extend or shrink something that has multiple uses -- unless those<br>
+ // multiple uses are all in the same instruction -- doing so would require<br>
+ // duplicating the instruction which isn't profitable.<br>
if (!V->hasOneUse())<br>
- return true;<br>
+ if (any_of(V->users(), [&](User *U) { return U != V->user_back(); }))<br>
+ return true;<br>
<br>
return false;<br>
}<br>
<br>
Modified: llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll?rev=324014&r1=324013&r2=324014&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll?rev=324014&r1=324013&r2=324014&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll (original)<br>
+++ llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll Thu Feb 1 13:55:53 2018<br>
@@ -49,11 +49,9 @@ define i8 @select2(i1 %cond, i8 %x, i8 %<br>
<br>
define i32 @eval_trunc_multi_use_in_one_inst(i32 %x) {<br>
; CHECK-LABEL: @eval_trunc_multi_use_in_one_inst(<br>
-; CHECK-NEXT: [[Z:%.*]] = zext i32 [[X:%.*]] to i64<br>
-; CHECK-NEXT: [[A:%.*]] = add nuw nsw i64 [[Z]], 15<br>
-; CHECK-NEXT: [[M:%.*]] = mul i64 [[A]], [[A]]<br>
-; CHECK-NEXT: [[T:%.*]] = trunc i64 [[M]] to i32<br>
-; CHECK-NEXT: ret i32 [[T]]<br>
+; CHECK-NEXT: [[A:%.*]] = add i32 [[X:%.*]], 15<br>
+; CHECK-NEXT: [[M:%.*]] = mul i32 [[A]], [[A]]<br>
+; CHECK-NEXT: ret i32 [[M]]<br>
;<br>
%z = zext i32 %x to i64<br>
%a = add nsw nuw i64 %z, 15<br>
@@ -64,11 +62,9 @@ define i32 @eval_trunc_multi_use_in_one_<br>
<br>
define i32 @eval_zext_multi_use_in_one_inst(i32 %x) {<br>
; CHECK-LABEL: @eval_zext_multi_use_in_one_inst(<br>
-; CHECK-NEXT: [[T:%.*]] = trunc i32 [[X:%.*]] to i16<br>
-; CHECK-NEXT: [[A:%.*]] = and i16 [[T]], 5<br>
-; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i16 [[A]], [[A]]<br>
-; CHECK-NEXT: [[R:%.*]] = zext i16 [[M]] to i32<br>
-; CHECK-NEXT: ret i32 [[R]]<br>
+; CHECK-NEXT: [[A:%.*]] = and i32 [[X:%.*]], 5<br>
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[A]], [[A]]<br>
+; CHECK-NEXT: ret i32 [[M]]<br>
;<br>
%t = trunc i32 %x to i16<br>
%a = and i16 %t, 5<br>
@@ -79,12 +75,10 @@ define i32 @eval_zext_multi_use_in_one_i<br>
<br>
define i32 @eval_sext_multi_use_in_one_inst(i32 %x) {<br>
; CHECK-LABEL: @eval_sext_multi_use_in_one_inst(<br>
-; CHECK-NEXT: [[T:%.*]] = trunc i32 [[X:%.*]] to i16<br>
-; CHECK-NEXT: [[A:%.*]] = and i16 [[T]], 14<br>
-; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i16 [[A]], [[A]]<br>
-; CHECK-NEXT: [[O:%.*]] = or i16 [[M]], -32768<br>
-; CHECK-NEXT: [[R:%.*]] = sext i16 [[O]] to i32<br>
-; CHECK-NEXT: ret i32 [[R]]<br>
+; CHECK-NEXT: [[A:%.*]] = and i32 [[X:%.*]], 14<br>
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[A]], [[A]]<br>
+; CHECK-NEXT: [[O:%.*]] = or i32 [[M]], -32768<br>
+; CHECK-NEXT: ret i32 [[O]]<br>
;<br>
%t = trunc i32 %x to i16<br>
%a = and i16 %t, 14<br>
<br>
Modified: llvm/trunk/test/Transforms/InstCombine/icmp-mul-zext.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp-mul-zext.ll?rev=324014&r1=324013&r2=324014&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp-mul-zext.ll?rev=324014&r1=324013&r2=324014&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/icmp-mul-zext.ll (original)<br>
+++ llvm/trunk/test/Transforms/InstCombine/icmp-mul-zext.ll Thu Feb 1 13:55:53 2018<br>
@@ -55,13 +55,12 @@ lor.end:<br>
<br>
define void @PR33765(i8 %beth) {<br>
; CHECK-LABEL: @PR33765(<br>
-; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[BETH:%.*]] to i32<br>
+; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[BETH:%.*]] to i16<br>
; CHECK-NEXT: br i1 false, label [[IF_THEN9:%.*]], label [[IF_THEN9]]<br>
; CHECK: if.then9:<br>
-; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[CONV]], [[CONV]]<br>
+; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[CONV]], [[CONV]]<br>
; CHECK-NEXT: [[TINKY:%.*]] = load i16, i16* @glob, align 2<br>
-; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[MUL]] to i16<br>
-; CHECK-NEXT: [[CONV14:%.*]] = and i16 [[TINKY]], [[TMP1]]<br>
+; CHECK-NEXT: [[CONV14:%.*]] = and i16 [[TINKY]], [[MUL]]<br>
; CHECK-NEXT: store i16 [[CONV14]], i16* @glob, align 2<br>
; CHECK-NEXT: ret void<br>
;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><u></u><u></u></p>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</blockquote>
</div>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div></div></div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>
<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></div>
</blockquote></div><br></div>
</blockquote></div>