<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>142966</bug_id>
          
          <creation_ts>2015-03-23 03:51:07 -0700</creation_ts>
          <short_desc>Optimize typed array access with a masked index</short_desc>
          <delta_ts>2015-05-21 23:35:41 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="dougc">dtc-llvm</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>fpizlo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1079272</commentid>
    <comment_count>0</comment_count>
    <who name="dougc">dtc-llvm</who>
    <bug_when>2015-03-23 03:51:07 -0700</bug_when>
    <thetext>Emscripten now has an experimental mode that emits heap accesses as a[(i &amp; mask) + c &gt;&gt; n] which keeps the index within bounds and is easy for the JS compiler to match and to optimize away bounds checks. The technique is also used in the asm.js jump tables as a[i&amp;mask]. The technique is not asm.js specific and can be used in general JS code. The masked index can often be hoisted using Value Numbering etc, and a small constant offset can be emitted in the load or store instruction addressing mode.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079277</commentid>
    <comment_count>1</comment_count>
      <attachid>249234</attachid>
    <who name="dougc">dtc-llvm</who>
    <bug_when>2015-03-23 04:18:50 -0700</bug_when>
    <thetext>Created attachment 249234
Optimize away bounds checks when given masked typed array indexes.

This is a proof-of-concept patch that implements this optimization for the Speculative-JIT and FTL.

The function indexInBounds has been added that matches the index masking patterns and determines if the index is within bounds. This has currently just been placed at the start of DFGConstantFoldingPhase.cpp, and I could use help on the appropriate file for such functions?

I noticed that the constant folding of CheckInBounds was not running consistently because the cfaFoundConstants block flag was not being set. The patch attempts to fix this by reworking the CheckInBounds handling in DFGAbstractInterpreterInlines.h.

Optimization of (i &amp; -1) to identity has been added in strength reduction, and it appears that BitXor would be more appropriately grouped with BitXor. For Emscripten generated code it might be important to be able to efficiently optimize away the masking when the masks are set to -1.

Feedback and help with this first patch welcomed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079278</commentid>
    <comment_count>2</comment_count>
      <attachid>249235</attachid>
    <who name="dougc">dtc-llvm</who>
    <bug_when>2015-03-23 04:36:34 -0700</bug_when>
    <thetext>Created attachment 249235
Optimize away bounds checks when given masked typed array indexes.

Fix the patch to be relative to the source root.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079280</commentid>
    <comment_count>3</comment_count>
      <attachid>249236</attachid>
    <who name="dougc">dtc-llvm</who>
    <bug_when>2015-03-23 05:39:19 -0700</bug_when>
    <thetext>Created attachment 249236
Optimize away bounds checks when given masked typed array indexes

Fix the missing prototype for indexInBounds(). Just place it in DFGAbstractInterpreterInlines.h for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079286</commentid>
    <comment_count>4</comment_count>
      <attachid>249236</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-03-23 08:40:16 -0700</bug_when>
    <thetext>Comment on attachment 249236
Optimize away bounds checks when given masked typed array indexes

View in context: https://bugs.webkit.org/attachment.cgi?id=249236&amp;action=review

Looks pretty good so far, but please move the helper to a more appropriate place.  And please don&apos;t remove the old flow-sensitive CheckInBounds elimination.

&gt; Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:2301
&gt; +bool indexInBounds(Node* indexNode, int32_t length);

This declaration should be anywhere but here.  It&apos;s wrong to declare a method in X.h and define it in Y.h - at the very least, the header in which it&apos;s declared should correspond to the compilation module in which it is defined.  It&apos;s also wrong to make declarations in Inlines.h files; those are reserved for definitions of inline functions.  This isn&apos;t an inline function, and it&apos;s not a definition.

We often put such universal helpers in Graph.  You can continue this pattern.  Just add a method to Graph called indexInBounds().

&gt; Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp:46
&gt; +// Pattern match an array index expression returning true if it is known to be within
&gt; +// bounds otherwise false. This matches a constant index, or a masked index with an
&gt; +// optional constant offset, and optionally right shifted.
&gt; +bool indexInBounds(Node* indexNode, int32_t length)

See above.  This definition is also in the wrong place.  It&apos;s an anti-pattern to define helpers inside the compilation module for a phase.  (We do make this mistake sometimes, but I&apos;d really rather we stop doing it.)

We usually put such helpers in Graph.h/cpp.

&gt; Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp:269
&gt; -                JSValue left = m_state.forNode(node-&gt;child1()).value();
&gt; +                // The length is obtained in strength reduction.
&gt;                  JSValue right = m_state.forNode(node-&gt;child2()).value();
&gt; -                if (left &amp;&amp; right &amp;&amp; left.isInt32() &amp;&amp; right.isInt32()
&gt; -                    &amp;&amp; static_cast&lt;uint32_t&gt;(left.asInt32()) &lt; static_cast&lt;uint32_t&gt;(right.asInt32())) {
&gt; +                if (!right || !right.isInt32())
&gt; +                    break;
&gt; +                // Array length is known.
&gt; +                int32_t length = right.asInt32();
&gt; +                if (indexInBounds(node-&gt;child1().node(), length)) {

It appears that you&apos;re relying on the left child being folded to a constant, rather than it being proved constant.  There is a small difference, but it&apos;s a difference we prefer to deal with head-on.  The constant folder can theoretically produce flow-sensitive constants.  For example, a node may be constant only along some control flow path.  In that case, this will miss CheckInBounds where the index was such a partial constant.

Can you bring back the old folding rule, that did handle the flow-sensitive case?  I believe it&apos;s just a matter of not removing the old &quot;if (left &amp;&amp; right &amp;&amp; left.isInt32() &amp;&amp; right.isInt32() &amp;&amp; static_cast&lt;uint32_t&gt;(left.asInt32()) &lt; static_cast&lt;uint32_t&gt;(right.asInt32())...&quot; thing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095971</commentid>
    <comment_count>5</comment_count>
      <attachid>249236</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-05-19 09:37:00 -0700</bug_when>
    <thetext>Comment on attachment 249236
Optimize away bounds checks when given masked typed array indexes

View in context: https://bugs.webkit.org/attachment.cgi?id=249236&amp;action=review

&gt; Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp:57
&gt; +        JSValue shiftValue = indexNode-&gt;child2().node()-&gt;value.value();

It is an antipattern to access the abstract value of a node directly.  You should use AbstractInterpreter::forNode(node).  Also, we usually access the inferred constant value using m_value, not value().

&gt; Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp:68
&gt; +        JSValue offsetValue = indexNode-&gt;child2().node()-&gt;value.value();

Ditto.

&gt; Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp:93
&gt; +    JSValue maskValue = indexNode-&gt;child2().node()-&gt;value.value();

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1096796</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-05-21 23:35:41 -0700</bug_when>
    <thetext>Closing this.  My understanding is that this is not the direction that emscripten is taking.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>249234</attachid>
            <date>2015-03-23 04:18:50 -0700</date>
            <delta_ts>2015-03-23 04:36:34 -0700</delta_ts>
            <desc>Optimize away bounds checks when given masked typed array indexes.</desc>
            <filename>pointer-masking-1.patch</filename>
            <type>text/plain</type>
            <size>6118</size>
            <attacher name="dougc">dtc-llvm</attacher>
            
              <data encoding="base64">SW5kZXg6IGRmZy9ERkdBYnN0cmFjdEludGVycHJldGVySW5saW5lcy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IGRmZy9ERkdBYnN0cmFjdEludGVycHJldGVySW5saW5lcy5oCShyZXZpc2lvbiAxODE2ODApCisr
KyBkZmcvREZHQWJzdHJhY3RJbnRlcnByZXRlcklubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAt
MTg3MSwxMyArMTg3MSwxMSBAQAogICAgIH0KIAogICAgIGNhc2UgQ2hlY2tJbkJvdW5kczogewot
ICAgICAgICBKU1ZhbHVlIGxlZnQgPSBmb3JOb2RlKG5vZGUtPmNoaWxkMSgpKS52YWx1ZSgpOwog
ICAgICAgICBKU1ZhbHVlIHJpZ2h0ID0gZm9yTm9kZShub2RlLT5jaGlsZDIoKSkudmFsdWUoKTsK
LSAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQgJiYgbGVmdC5pc0ludDMyKCkgJiYgcmlnaHQuaXNJ
bnQzMigpCi0gICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVmdC5hc0ludDMy
KCkpIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJpZ2h0LmFzSW50MzIoKSkpIHsKKyAgICAgICAg
Ly8gSWYgdGhlIHJpZ2h0IGxlbmd0aCBoYXMgYmVlbiBzZXQgdG8gYSBjb25zdGFudCBieSBzdHJl
bmd0aAorICAgICAgICAvLyByZWR1Y3Rpb24gdGhlbiB0aGlzIG1heSBub3cgYmUgZm9sZGFibGUg
dG8gYSBjb25zdGFudC4KKyAgICAgICAgaWYgKHJpZ2h0ICYmIHJpZ2h0LmlzSW50MzIoKSkKICAg
ICAgICAgICAgIG1fc3RhdGUuc2V0Rm91bmRDb25zdGFudHModHJ1ZSk7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAgICAgICAgIApJbmRleDog
ZGZnL0RGR0NvbnN0YW50Rm9sZGluZ1BoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkZmcvREZHQ29u
c3RhbnRGb2xkaW5nUGhhc2UuY3BwCShyZXZpc2lvbiAxODE2ODApCisrKyBkZmcvREZHQ29uc3Rh
bnRGb2xkaW5nUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw2ICs0MCw3MSBAQAogCiBu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CiAKKy8vIFBhdHRlcm4gbWF0Y2ggYW4gYXJy
YXkgaW5kZXggZXhwcmVzc2lvbiByZXR1cm5pbmcgdHJ1ZSBpZiBpdCBpcyBrbm93biB0byBiZSB3
aXRoaW4KKy8vIGJvdW5kcyBvdGhlcndpc2UgZmFsc2UuIFRoaXMgbWF0Y2hlcyBhIGNvbnN0YW50
IGluZGV4LCBvciBhIG1hc2tlZCBpbmRleCB3aXRoIGFuCisvLyBvcHRpb25hbCBjb25zdGFudCBv
ZmZzZXQsIGFuZCBvcHRpb25hbGx5IHJpZ2h0IHNoaWZ0ZWQuCitib29sIGluZGV4SW5Cb3VuZHMo
Tm9kZSogaW5kZXhOb2RlLCBpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBpZiAoIWluZGV4Tm9kZSB8
fCBsZW5ndGggPCAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQzMl90IHNoaWZ0
ID0gMDsKKyAgICBpbnQzMl90IG9mZnNldCA9IDA7CisgICAgaW50MzJfdCBtYXNrID0gLTE7CisK
KyAgICBpZiAoaW5kZXhOb2RlLT5vcCgpID09IEJpdFJTaGlmdCkgeworICAgICAgICAvLyBhW2V4
cCA+PiBuXQorICAgICAgICBKU1ZhbHVlIHNoaWZ0VmFsdWUgPSBpbmRleE5vZGUtPmNoaWxkMigp
Lm5vZGUoKS0+dmFsdWUudmFsdWUoKTsKKyAgICAgICAgaWYgKCFzaGlmdFZhbHVlIHx8ICFzaGlm
dFZhbHVlLmlzSW50MzIoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc2hp
ZnQgPSBzaGlmdFZhbHVlLmFzSW50MzIoKTsKKyAgICAgICAgaWYgKHNoaWZ0IDwgMCB8fCBzaGlm
dCA+IDB4MWYpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGluZGV4Tm9kZSA9
IGluZGV4Tm9kZS0+Y2hpbGQxKCkubm9kZSgpOworICAgIH0KKworICAgIGlmIChpbmRleE5vZGUt
Pm9wKCkgPT0gQXJpdGhBZGQpIHsKKyAgICAgICAgLy8gYVtleHAgKyBjXSBvciBhW2V4cCArIGMg
Pj4gbl0KKyAgICAgICAgSlNWYWx1ZSBvZmZzZXRWYWx1ZSA9IGluZGV4Tm9kZS0+Y2hpbGQyKCku
bm9kZSgpLT52YWx1ZS52YWx1ZSgpOworICAgICAgICBpZiAoIW9mZnNldFZhbHVlIHx8ICFvZmZz
ZXRWYWx1ZS5pc0ludDMyKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIG9m
ZnNldCA9IG9mZnNldFZhbHVlLmFzSW50MzIoKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IDApCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGluZGV4Tm9kZSA9IGluZGV4Tm9kZS0+
Y2hpbGQxKCkubm9kZSgpOworICAgIH0KKworICAgIGlmIChpbmRleE5vZGUtPmlzSW50MzJDb25z
dGFudCgpKSB7CisgICAgICAgIC8vIENvbnN0YW50IGluZGV4LCBhW2NdIG9yIGFbYyA+PiBuXSBv
ciBhW2sgKyBjXSBvciBhW2sgKyBjID4+IG5dCisgICAgICAgIGludDMyX3QgaW5kZXggPSBpbmRl
eE5vZGUtPmFzSW50MzIoKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAg
IGludDMyX3QgdG90YWwgPSBpbmRleCArIG9mZnNldDsKKyAgICAgICAgICAgIGlmICh0b3RhbCA+
PSAwICYmICh0b3RhbCA+PiBzaGlmdCkgPCBsZW5ndGgpCisgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlm
IChpbmRleE5vZGUtPm9wKCkgIT0gQml0QW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBhW2V4cCAmIG1hc2tdIG9yIGFbZXhwICYgbWFzayA+PiBuXSBvcgorICAgIC8vIGFbKGV4
cCAmIG1hc2spICsgY10gb3IgYVsoZXhwICYgbWFzaykgKyBjID4+IG5dCisgICAgSlNWYWx1ZSBt
YXNrVmFsdWUgPSBpbmRleE5vZGUtPmNoaWxkMigpLm5vZGUoKS0+dmFsdWUudmFsdWUoKTsKKyAg
ICBpZiAoIW1hc2tWYWx1ZSB8fCAhbWFza1ZhbHVlLmlzSW50MzIoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIG1hc2sgPSBtYXNrVmFsdWUuYXNJbnQzMigpOworCisgICAgLy8gRm9sZCBh
d2F5IHRoZSBib3VuZHMgY2hlY2sgaWYgdGhlIG1hc2sgY29uc3RyYWlucyB0aGUgaW5kZXggdG8g
YmUgd2l0aGluIGJvdW5kcy4KKyAgICBpZiAobWFzayA+PSAwKSB7CisgICAgICAgIGludDMyX3Qg
bWF4ID0gKG1hc2sgKyBvZmZzZXQpID4+IHNoaWZ0OworICAgICAgICBpZiAobWF4ID49IDAgJiYg
bGVuZ3RoID49IDAgJiYgbWF4IDwgbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiBjbGFzcyBDb25zdGFudEZvbGRpbmdQaGFz
ZSA6IHB1YmxpYyBQaGFzZSB7CiBwdWJsaWM6CiAgICAgQ29uc3RhbnRGb2xkaW5nUGhhc2UoR3Jh
cGgmIGdyYXBoKQpAQCAtMTk1LDE1ICsyNjAsMTYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAg
ICAgICAgY2FzZSBDaGVja0luQm91bmRzOiB7Ci0gICAgICAgICAgICAgICAgSlNWYWx1ZSBsZWZ0
ID0gbV9zdGF0ZS5mb3JOb2RlKG5vZGUtPmNoaWxkMSgpKS52YWx1ZSgpOworICAgICAgICAgICAg
ICAgIC8vIFRoZSBsZW5ndGggaXMgb2J0YWluZWQgaW4gc3RyZW5ndGggcmVkdWN0aW9uLgogICAg
ICAgICAgICAgICAgIEpTVmFsdWUgcmlnaHQgPSBtX3N0YXRlLmZvck5vZGUobm9kZS0+Y2hpbGQy
KCkpLnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQgJiYgbGVmdC5p
c0ludDMyKCkgJiYgcmlnaHQuaXNJbnQzMigpCi0gICAgICAgICAgICAgICAgICAgICYmIHN0YXRp
Y19jYXN0PHVpbnQzMl90PihsZWZ0LmFzSW50MzIoKSkgPCBzdGF0aWNfY2FzdDx1aW50MzJfdD4o
cmlnaHQuYXNJbnQzMigpKSkgeworICAgICAgICAgICAgICAgIGlmICghcmlnaHQgfHwgIXJpZ2h0
LmlzSW50MzIoKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
Ly8gQXJyYXkgbGVuZ3RoIGlzIGtub3duLgorICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3Ro
ID0gcmlnaHQuYXNJbnQzMigpOworICAgICAgICAgICAgICAgIGlmIChpbmRleEluQm91bmRzKG5v
ZGUtPmNoaWxkMSgpLm5vZGUoKSwgbGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICAgICBub2Rl
LT5jb252ZXJ0VG9QaGFudG9tKCk7CiAgICAgICAgICAgICAgICAgICAgIGVsaW1pbmF0ZWQgPSB0
cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICAgICAgCkluZGV4OiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHJldmlzaW9uIDE4MTY4MCkKKysrIGRmZy9E
RkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyMzksMTQgKzIyMzksMTYg
QEAKIAogfQogCitleHRlcm4gYm9vbCBpbmRleEluQm91bmRzKE5vZGUqIGluZGV4Tm9kZSwgaW50
MzJfdCBsZW5ndGgpOworICAgIAogSklUQ29tcGlsZXI6Okp1bXAgU3BlY3VsYXRpdmVKSVQ6Omp1
bXBGb3JUeXBlZEFycmF5T3V0T2ZCb3VuZHMoTm9kZSogbm9kZSwgR1BSUmVnIGJhc2VHUFIsIEdQ
UlJlZyBpbmRleEdQUikKIHsKICAgICBpZiAobm9kZS0+b3AoKSA9PSBQdXRCeVZhbEFsaWFzKQog
ICAgICAgICByZXR1cm4gSklUQ29tcGlsZXI6Okp1bXAoKTsKICAgICBpZiAoSlNBcnJheUJ1ZmZl
clZpZXcqIHZpZXcgPSBtX2ppdC5ncmFwaCgpLnRyeUdldEZvbGRhYmxlVmlld0ZvckNoaWxkMShu
b2RlKSkgewotICAgICAgICB1aW50MzJfdCBsZW5ndGggPSB2aWV3LT5sZW5ndGgoKTsKKyAgICAg
ICAgaW50MzJfdCBsZW5ndGggPSB2aWV3LT5sZW5ndGgoKTsKICAgICAgICAgTm9kZSogaW5kZXhO
b2RlID0gbV9qaXQuZ3JhcGgoKS5jaGlsZChub2RlLCAxKS5ub2RlKCk7Ci0gICAgICAgIGlmIChp
bmRleE5vZGUtPmlzSW50MzJDb25zdGFudCgpICYmIGluZGV4Tm9kZS0+YXNVSW50MzIoKSA8IGxl
bmd0aCkKKyAgICAgICAgaWYgKGluZGV4SW5Cb3VuZHMoaW5kZXhOb2RlLCBsZW5ndGgpKQogICAg
ICAgICAgICAgcmV0dXJuIEpJVENvbXBpbGVyOjpKdW1wKCk7CiAgICAgICAgIHJldHVybiBtX2pp
dC5icmFuY2gzMigKICAgICAgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpBYm92ZU9yRXF1YWwsIGlu
ZGV4R1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tMzIobGVuZ3RoKSk7CkluZGV4OiBkZmcvREZHU3Ry
ZW5ndGhSZWR1Y3Rpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZGZnL0RGR1N0cmVuZ3RoUmVk
dWN0aW9uUGhhc2UuY3BwCShyZXZpc2lvbiAxODE2ODApCisrKyBkZmcvREZHU3RyZW5ndGhSZWR1
Y3Rpb25QaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcyLDYgKzcyLDcgQEAKICAgICB7CiAg
ICAgICAgIHN3aXRjaCAobV9ub2RlLT5vcCgpKSB7CiAgICAgICAgIGNhc2UgQml0T3I6CisgICAg
ICAgIGNhc2UgQml0WG9yOgogICAgICAgICAgICAgaGFuZGxlQ29tbXV0YXRpdml0eSgpOwogCiAg
ICAgICAgICAgICBpZiAobV9ub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgIW1f
bm9kZS0+Y2hpbGQyKCktPmFzSW50MzIoKSkgewpAQCAtODAsOSArODEsMTMgQEAKICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgQml0
WG9yOgogICAgICAgICBjYXNlIEJpdEFuZDoKICAgICAgICAgICAgIGhhbmRsZUNvbW11dGF0aXZp
dHkoKTsKKworICAgICAgICAgICAgaWYgKG1fbm9kZS0+Y2hpbGQyKCktPmlzSW50MzJDb25zdGFu
dCgpICYmIG1fbm9kZS0+Y2hpbGQyKCktPmFzSW50MzIoKSA9PSAtMSkgeworICAgICAgICAgICAg
ICAgIGNvbnZlcnRUb0lkZW50aXR5T3ZlckNoaWxkMSgpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKICAgICAg
ICAgY2FzZSBCaXRMU2hpZnQ6Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>249235</attachid>
            <date>2015-03-23 04:36:34 -0700</date>
            <delta_ts>2015-03-23 05:39:19 -0700</delta_ts>
            <desc>Optimize away bounds checks when given masked typed array indexes.</desc>
            <filename>pointer-masking-2.patch</filename>
            <type>text/plain</type>
            <size>6382</size>
            <attacher name="dougc">dtc-llvm</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RJbnRlcnByZXRlcklu
bGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fic3Ry
YWN0SW50ZXJwcmV0ZXJJbmxpbmVzLmgJKHJldmlzaW9uIDE4MTY4MCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RJbnRlcnByZXRlcklubGluZXMuaAkod29ya2luZyBj
b3B5KQpAQCAtMTg3MSwxMyArMTg3MSwxMSBAQAogICAgIH0KIAogICAgIGNhc2UgQ2hlY2tJbkJv
dW5kczogewotICAgICAgICBKU1ZhbHVlIGxlZnQgPSBmb3JOb2RlKG5vZGUtPmNoaWxkMSgpKS52
YWx1ZSgpOwogICAgICAgICBKU1ZhbHVlIHJpZ2h0ID0gZm9yTm9kZShub2RlLT5jaGlsZDIoKSku
dmFsdWUoKTsKLSAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQgJiYgbGVmdC5pc0ludDMyKCkgJiYg
cmlnaHQuaXNJbnQzMigpCi0gICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVm
dC5hc0ludDMyKCkpIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJpZ2h0LmFzSW50MzIoKSkpIHsK
KyAgICAgICAgLy8gSWYgdGhlIHJpZ2h0IGxlbmd0aCBoYXMgYmVlbiBzZXQgdG8gYSBjb25zdGFu
dCBieSBzdHJlbmd0aAorICAgICAgICAvLyByZWR1Y3Rpb24gdGhlbiB0aGlzIG1heSBub3cgYmUg
Zm9sZGFibGUgdG8gYSBjb25zdGFudC4KKyAgICAgICAgaWYgKHJpZ2h0ICYmIHJpZ2h0LmlzSW50
MzIoKSkKICAgICAgICAgICAgIG1fc3RhdGUuc2V0Rm91bmRDb25zdGFudHModHJ1ZSk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAgICAgICAg
IApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDb25zdGFudEZvbGRpbmdQaGFz
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDb25zdGFu
dEZvbGRpbmdQaGFzZS5jcHAJKHJldmlzaW9uIDE4MTY4MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHQ29uc3RhbnRGb2xkaW5nUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
MCw2ICs0MCw3MSBAQAogCiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CiAKKy8vIFBh
dHRlcm4gbWF0Y2ggYW4gYXJyYXkgaW5kZXggZXhwcmVzc2lvbiByZXR1cm5pbmcgdHJ1ZSBpZiBp
dCBpcyBrbm93biB0byBiZSB3aXRoaW4KKy8vIGJvdW5kcyBvdGhlcndpc2UgZmFsc2UuIFRoaXMg
bWF0Y2hlcyBhIGNvbnN0YW50IGluZGV4LCBvciBhIG1hc2tlZCBpbmRleCB3aXRoIGFuCisvLyBv
cHRpb25hbCBjb25zdGFudCBvZmZzZXQsIGFuZCBvcHRpb25hbGx5IHJpZ2h0IHNoaWZ0ZWQuCiti
b29sIGluZGV4SW5Cb3VuZHMoTm9kZSogaW5kZXhOb2RlLCBpbnQzMl90IGxlbmd0aCkKK3sKKyAg
ICBpZiAoIWluZGV4Tm9kZSB8fCBsZW5ndGggPCAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpbnQzMl90IHNoaWZ0ID0gMDsKKyAgICBpbnQzMl90IG9mZnNldCA9IDA7CisgICAgaW50
MzJfdCBtYXNrID0gLTE7CisKKyAgICBpZiAoaW5kZXhOb2RlLT5vcCgpID09IEJpdFJTaGlmdCkg
eworICAgICAgICAvLyBhW2V4cCA+PiBuXQorICAgICAgICBKU1ZhbHVlIHNoaWZ0VmFsdWUgPSBp
bmRleE5vZGUtPmNoaWxkMigpLm5vZGUoKS0+dmFsdWUudmFsdWUoKTsKKyAgICAgICAgaWYgKCFz
aGlmdFZhbHVlIHx8ICFzaGlmdFZhbHVlLmlzSW50MzIoKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgc2hpZnQgPSBzaGlmdFZhbHVlLmFzSW50MzIoKTsKKyAgICAgICAgaWYg
KHNoaWZ0IDwgMCB8fCBzaGlmdCA+IDB4MWYpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGluZGV4Tm9kZSA9IGluZGV4Tm9kZS0+Y2hpbGQxKCkubm9kZSgpOworICAgIH0KKwor
ICAgIGlmIChpbmRleE5vZGUtPm9wKCkgPT0gQXJpdGhBZGQpIHsKKyAgICAgICAgLy8gYVtleHAg
KyBjXSBvciBhW2V4cCArIGMgPj4gbl0KKyAgICAgICAgSlNWYWx1ZSBvZmZzZXRWYWx1ZSA9IGlu
ZGV4Tm9kZS0+Y2hpbGQyKCkubm9kZSgpLT52YWx1ZS52YWx1ZSgpOworICAgICAgICBpZiAoIW9m
ZnNldFZhbHVlIHx8ICFvZmZzZXRWYWx1ZS5pc0ludDMyKCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIG9mZnNldCA9IG9mZnNldFZhbHVlLmFzSW50MzIoKTsKKyAgICAgICAg
aWYgKG9mZnNldCA8IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGluZGV4
Tm9kZSA9IGluZGV4Tm9kZS0+Y2hpbGQxKCkubm9kZSgpOworICAgIH0KKworICAgIGlmIChpbmRl
eE5vZGUtPmlzSW50MzJDb25zdGFudCgpKSB7CisgICAgICAgIC8vIENvbnN0YW50IGluZGV4LCBh
W2NdIG9yIGFbYyA+PiBuXSBvciBhW2sgKyBjXSBvciBhW2sgKyBjID4+IG5dCisgICAgICAgIGlu
dDMyX3QgaW5kZXggPSBpbmRleE5vZGUtPmFzSW50MzIoKTsKKyAgICAgICAgaWYgKGluZGV4ID49
IDApIHsKKyAgICAgICAgICAgIGludDMyX3QgdG90YWwgPSBpbmRleCArIG9mZnNldDsKKyAgICAg
ICAgICAgIGlmICh0b3RhbCA+PSAwICYmICh0b3RhbCA+PiBzaGlmdCkgPCBsZW5ndGgpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIGlmIChpbmRleE5vZGUtPm9wKCkgIT0gQml0QW5kKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBhW2V4cCAmIG1hc2tdIG9yIGFbZXhwICYgbWFzayA+PiBu
XSBvcgorICAgIC8vIGFbKGV4cCAmIG1hc2spICsgY10gb3IgYVsoZXhwICYgbWFzaykgKyBjID4+
IG5dCisgICAgSlNWYWx1ZSBtYXNrVmFsdWUgPSBpbmRleE5vZGUtPmNoaWxkMigpLm5vZGUoKS0+
dmFsdWUudmFsdWUoKTsKKyAgICBpZiAoIW1hc2tWYWx1ZSB8fCAhbWFza1ZhbHVlLmlzSW50MzIo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1hc2sgPSBtYXNrVmFsdWUuYXNJbnQzMigp
OworCisgICAgLy8gRm9sZCBhd2F5IHRoZSBib3VuZHMgY2hlY2sgaWYgdGhlIG1hc2sgY29uc3Ry
YWlucyB0aGUgaW5kZXggdG8gYmUgd2l0aGluIGJvdW5kcy4KKyAgICBpZiAobWFzayA+PSAwKSB7
CisgICAgICAgIGludDMyX3QgbWF4ID0gKG1hc2sgKyBvZmZzZXQpID4+IHNoaWZ0OworICAgICAg
ICBpZiAobWF4ID49IDAgJiYgbGVuZ3RoID49IDAgJiYgbWF4IDwgbGVuZ3RoKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiBjbGFzcyBD
b25zdGFudEZvbGRpbmdQaGFzZSA6IHB1YmxpYyBQaGFzZSB7CiBwdWJsaWM6CiAgICAgQ29uc3Rh
bnRGb2xkaW5nUGhhc2UoR3JhcGgmIGdyYXBoKQpAQCAtMTk1LDE1ICsyNjAsMTYgQEAKICAgICAg
ICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBDaGVja0luQm91bmRzOiB7Ci0gICAgICAgICAg
ICAgICAgSlNWYWx1ZSBsZWZ0ID0gbV9zdGF0ZS5mb3JOb2RlKG5vZGUtPmNoaWxkMSgpKS52YWx1
ZSgpOworICAgICAgICAgICAgICAgIC8vIFRoZSBsZW5ndGggaXMgb2J0YWluZWQgaW4gc3RyZW5n
dGggcmVkdWN0aW9uLgogICAgICAgICAgICAgICAgIEpTVmFsdWUgcmlnaHQgPSBtX3N0YXRlLmZv
ck5vZGUobm9kZS0+Y2hpbGQyKCkpLnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlZnQg
JiYgcmlnaHQgJiYgbGVmdC5pc0ludDMyKCkgJiYgcmlnaHQuaXNJbnQzMigpCi0gICAgICAgICAg
ICAgICAgICAgICYmIHN0YXRpY19jYXN0PHVpbnQzMl90PihsZWZ0LmFzSW50MzIoKSkgPCBzdGF0
aWNfY2FzdDx1aW50MzJfdD4ocmlnaHQuYXNJbnQzMigpKSkgeworICAgICAgICAgICAgICAgIGlm
ICghcmlnaHQgfHwgIXJpZ2h0LmlzSW50MzIoKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgLy8gQXJyYXkgbGVuZ3RoIGlzIGtub3duLgorICAgICAgICAgICAg
ICAgIGludDMyX3QgbGVuZ3RoID0gcmlnaHQuYXNJbnQzMigpOworICAgICAgICAgICAgICAgIGlm
IChpbmRleEluQm91bmRzKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbGVuZ3RoKSkgewogICAgICAg
ICAgICAgICAgICAgICBub2RlLT5jb252ZXJ0VG9QaGFudG9tKCk7CiAgICAgICAgICAgICAgICAg
ICAgIGVsaW1pbmF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAkocmV2aXNpb24gMTgxNjgwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTIyMzksMTQgKzIyMzksMTYgQEAKIAogfQogCitleHRlcm4gYm9vbCBpbmRleElu
Qm91bmRzKE5vZGUqIGluZGV4Tm9kZSwgaW50MzJfdCBsZW5ndGgpOworICAgIAogSklUQ29tcGls
ZXI6Okp1bXAgU3BlY3VsYXRpdmVKSVQ6Omp1bXBGb3JUeXBlZEFycmF5T3V0T2ZCb3VuZHMoTm9k
ZSogbm9kZSwgR1BSUmVnIGJhc2VHUFIsIEdQUlJlZyBpbmRleEdQUikKIHsKICAgICBpZiAobm9k
ZS0+b3AoKSA9PSBQdXRCeVZhbEFsaWFzKQogICAgICAgICByZXR1cm4gSklUQ29tcGlsZXI6Okp1
bXAoKTsKICAgICBpZiAoSlNBcnJheUJ1ZmZlclZpZXcqIHZpZXcgPSBtX2ppdC5ncmFwaCgpLnRy
eUdldEZvbGRhYmxlVmlld0ZvckNoaWxkMShub2RlKSkgewotICAgICAgICB1aW50MzJfdCBsZW5n
dGggPSB2aWV3LT5sZW5ndGgoKTsKKyAgICAgICAgaW50MzJfdCBsZW5ndGggPSB2aWV3LT5sZW5n
dGgoKTsKICAgICAgICAgTm9kZSogaW5kZXhOb2RlID0gbV9qaXQuZ3JhcGgoKS5jaGlsZChub2Rl
LCAxKS5ub2RlKCk7Ci0gICAgICAgIGlmIChpbmRleE5vZGUtPmlzSW50MzJDb25zdGFudCgpICYm
IGluZGV4Tm9kZS0+YXNVSW50MzIoKSA8IGxlbmd0aCkKKyAgICAgICAgaWYgKGluZGV4SW5Cb3Vu
ZHMoaW5kZXhOb2RlLCBsZW5ndGgpKQogICAgICAgICAgICAgcmV0dXJuIEpJVENvbXBpbGVyOjpK
dW1wKCk7CiAgICAgICAgIHJldHVybiBtX2ppdC5icmFuY2gzMigKICAgICAgICAgICAgIE1hY3Jv
QXNzZW1ibGVyOjpBYm92ZU9yRXF1YWwsIGluZGV4R1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tMzIo
bGVuZ3RoKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1N0cmVuZ3RoUmVk
dWN0aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHU3RyZW5ndGhSZWR1Y3Rpb25QaGFzZS5jcHAJKHJldmlzaW9uIDE4MTY4MCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3RyZW5ndGhSZWR1Y3Rpb25QaGFzZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTcyLDYgKzcyLDcgQEAKICAgICB7CiAgICAgICAgIHN3aXRjaCAobV9ub2Rl
LT5vcCgpKSB7CiAgICAgICAgIGNhc2UgQml0T3I6CisgICAgICAgIGNhc2UgQml0WG9yOgogICAg
ICAgICAgICAgaGFuZGxlQ29tbXV0YXRpdml0eSgpOwogCiAgICAgICAgICAgICBpZiAobV9ub2Rl
LT5jaGlsZDIoKS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgIW1fbm9kZS0+Y2hpbGQyKCktPmFzSW50
MzIoKSkgewpAQCAtODAsOSArODEsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJy
ZWFrOwogICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgQml0WG9yOgogICAgICAgICBjYXNlIEJp
dEFuZDoKICAgICAgICAgICAgIGhhbmRsZUNvbW11dGF0aXZpdHkoKTsKKworICAgICAgICAgICAg
aWYgKG1fbm9kZS0+Y2hpbGQyKCktPmlzSW50MzJDb25zdGFudCgpICYmIG1fbm9kZS0+Y2hpbGQy
KCktPmFzSW50MzIoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGNvbnZlcnRUb0lkZW50aXR5
T3ZlckNoaWxkMSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKICAgICAgICAgY2FzZSBCaXRMU2hpZnQ6Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>249236</attachid>
            <date>2015-03-23 05:39:19 -0700</date>
            <delta_ts>2015-03-23 05:39:19 -0700</delta_ts>
            <desc>Optimize away bounds checks when given masked typed array indexes</desc>
            <filename>pointer-masking-3.patch</filename>
            <type>text/plain</type>
            <size>6360</size>
            <attacher name="dougc">dtc-llvm</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RJbnRlcnByZXRlcklu
bGluZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fic3Ry
YWN0SW50ZXJwcmV0ZXJJbmxpbmVzLmgJKHJldmlzaW9uIDE4MTY4MCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RJbnRlcnByZXRlcklubGluZXMuaAkod29ya2luZyBj
b3B5KQpAQCAtMTg3MSwxMyArMTg3MSwxMSBAQAogICAgIH0KIAogICAgIGNhc2UgQ2hlY2tJbkJv
dW5kczogewotICAgICAgICBKU1ZhbHVlIGxlZnQgPSBmb3JOb2RlKG5vZGUtPmNoaWxkMSgpKS52
YWx1ZSgpOwogICAgICAgICBKU1ZhbHVlIHJpZ2h0ID0gZm9yTm9kZShub2RlLT5jaGlsZDIoKSku
dmFsdWUoKTsKLSAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQgJiYgbGVmdC5pc0ludDMyKCkgJiYg
cmlnaHQuaXNJbnQzMigpCi0gICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVm
dC5hc0ludDMyKCkpIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJpZ2h0LmFzSW50MzIoKSkpIHsK
KyAgICAgICAgLy8gSWYgdGhlIHJpZ2h0IGxlbmd0aCBoYXMgYmVlbiBzZXQgdG8gYSBjb25zdGFu
dCBieSBzdHJlbmd0aAorICAgICAgICAvLyByZWR1Y3Rpb24gdGhlbiB0aGlzIG1heSBub3cgYmUg
Zm9sZGFibGUgdG8gYSBjb25zdGFudC4KKyAgICAgICAgaWYgKHJpZ2h0ICYmIHJpZ2h0LmlzSW50
MzIoKSkKICAgICAgICAgICAgIG1fc3RhdGUuc2V0Rm91bmRDb25zdGFudHModHJ1ZSk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAgICAgICAg
IApAQCAtMjMwMCw2ICsyMjk4LDggQEAKICAgICByZXR1cm4gQ29udHJhZGljdGlvbjsKIH0KIAor
Ym9vbCBpbmRleEluQm91bmRzKE5vZGUqIGluZGV4Tm9kZSwgaW50MzJfdCBsZW5ndGgpOworCiB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCiAKICNlbmRpZiAvLyBFTkFCTEUoREZHX0pJVCkKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29uc3RhbnRGb2xkaW5nUGhhc2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29uc3RhbnRGb2xk
aW5nUGhhc2UuY3BwCShyZXZpc2lvbiAxODE2ODApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0NvbnN0YW50Rm9sZGluZ1BoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsNiAr
NDAsNzEgQEAKIAogbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgewogCisvLyBQYXR0ZXJu
IG1hdGNoIGFuIGFycmF5IGluZGV4IGV4cHJlc3Npb24gcmV0dXJuaW5nIHRydWUgaWYgaXQgaXMg
a25vd24gdG8gYmUgd2l0aGluCisvLyBib3VuZHMgb3RoZXJ3aXNlIGZhbHNlLiBUaGlzIG1hdGNo
ZXMgYSBjb25zdGFudCBpbmRleCwgb3IgYSBtYXNrZWQgaW5kZXggd2l0aCBhbgorLy8gb3B0aW9u
YWwgY29uc3RhbnQgb2Zmc2V0LCBhbmQgb3B0aW9uYWxseSByaWdodCBzaGlmdGVkLgorYm9vbCBp
bmRleEluQm91bmRzKE5vZGUqIGluZGV4Tm9kZSwgaW50MzJfdCBsZW5ndGgpCit7CisgICAgaWYg
KCFpbmRleE5vZGUgfHwgbGVuZ3RoIDwgMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aW50MzJfdCBzaGlmdCA9IDA7CisgICAgaW50MzJfdCBvZmZzZXQgPSAwOworICAgIGludDMyX3Qg
bWFzayA9IC0xOworCisgICAgaWYgKGluZGV4Tm9kZS0+b3AoKSA9PSBCaXRSU2hpZnQpIHsKKyAg
ICAgICAgLy8gYVtleHAgPj4gbl0KKyAgICAgICAgSlNWYWx1ZSBzaGlmdFZhbHVlID0gaW5kZXhO
b2RlLT5jaGlsZDIoKS5ub2RlKCktPnZhbHVlLnZhbHVlKCk7CisgICAgICAgIGlmICghc2hpZnRW
YWx1ZSB8fCAhc2hpZnRWYWx1ZS5pc0ludDMyKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIHNoaWZ0ID0gc2hpZnRWYWx1ZS5hc0ludDMyKCk7CisgICAgICAgIGlmIChzaGlm
dCA8IDAgfHwgc2hpZnQgPiAweDFmKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBpbmRleE5vZGUgPSBpbmRleE5vZGUtPmNoaWxkMSgpLm5vZGUoKTsKKyAgICB9CisKKyAgICBp
ZiAoaW5kZXhOb2RlLT5vcCgpID09IEFyaXRoQWRkKSB7CisgICAgICAgIC8vIGFbZXhwICsgY10g
b3IgYVtleHAgKyBjID4+IG5dCisgICAgICAgIEpTVmFsdWUgb2Zmc2V0VmFsdWUgPSBpbmRleE5v
ZGUtPmNoaWxkMigpLm5vZGUoKS0+dmFsdWUudmFsdWUoKTsKKyAgICAgICAgaWYgKCFvZmZzZXRW
YWx1ZSB8fCAhb2Zmc2V0VmFsdWUuaXNJbnQzMigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBvZmZzZXQgPSBvZmZzZXRWYWx1ZS5hc0ludDMyKCk7CisgICAgICAgIGlmIChv
ZmZzZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpbmRleE5vZGUg
PSBpbmRleE5vZGUtPmNoaWxkMSgpLm5vZGUoKTsKKyAgICB9CisKKyAgICBpZiAoaW5kZXhOb2Rl
LT5pc0ludDMyQ29uc3RhbnQoKSkgeworICAgICAgICAvLyBDb25zdGFudCBpbmRleCwgYVtjXSBv
ciBhW2MgPj4gbl0gb3IgYVtrICsgY10gb3IgYVtrICsgYyA+PiBuXQorICAgICAgICBpbnQzMl90
IGluZGV4ID0gaW5kZXhOb2RlLT5hc0ludDMyKCk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7
CisgICAgICAgICAgICBpbnQzMl90IHRvdGFsID0gaW5kZXggKyBvZmZzZXQ7CisgICAgICAgICAg
ICBpZiAodG90YWwgPj0gMCAmJiAodG90YWwgPj4gc2hpZnQpIDwgbGVuZ3RoKQorICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBpZiAoaW5kZXhOb2RlLT5vcCgpICE9IEJpdEFuZCkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gYVtleHAgJiBtYXNrXSBvciBhW2V4cCAmIG1hc2sgPj4gbl0gb3IK
KyAgICAvLyBhWyhleHAgJiBtYXNrKSArIGNdIG9yIGFbKGV4cCAmIG1hc2spICsgYyA+PiBuXQor
ICAgIEpTVmFsdWUgbWFza1ZhbHVlID0gaW5kZXhOb2RlLT5jaGlsZDIoKS5ub2RlKCktPnZhbHVl
LnZhbHVlKCk7CisgICAgaWYgKCFtYXNrVmFsdWUgfHwgIW1hc2tWYWx1ZS5pc0ludDMyKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBtYXNrID0gbWFza1ZhbHVlLmFzSW50MzIoKTsKKwor
ICAgIC8vIEZvbGQgYXdheSB0aGUgYm91bmRzIGNoZWNrIGlmIHRoZSBtYXNrIGNvbnN0cmFpbnMg
dGhlIGluZGV4IHRvIGJlIHdpdGhpbiBib3VuZHMuCisgICAgaWYgKG1hc2sgPj0gMCkgeworICAg
ICAgICBpbnQzMl90IG1heCA9IChtYXNrICsgb2Zmc2V0KSA+PiBzaGlmdDsKKyAgICAgICAgaWYg
KG1heCA+PSAwICYmIGxlbmd0aCA+PSAwICYmIG1heCA8IGxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogY2xhc3MgQ29uc3Rh
bnRGb2xkaW5nUGhhc2UgOiBwdWJsaWMgUGhhc2UgewogcHVibGljOgogICAgIENvbnN0YW50Rm9s
ZGluZ1BoYXNlKEdyYXBoJiBncmFwaCkKQEAgLTE5NSwxNSArMjYwLDE2IEBACiAgICAgICAgICAg
ICB9CiAKICAgICAgICAgICAgIGNhc2UgQ2hlY2tJbkJvdW5kczogewotICAgICAgICAgICAgICAg
IEpTVmFsdWUgbGVmdCA9IG1fc3RhdGUuZm9yTm9kZShub2RlLT5jaGlsZDEoKSkudmFsdWUoKTsK
KyAgICAgICAgICAgICAgICAvLyBUaGUgbGVuZ3RoIGlzIG9idGFpbmVkIGluIHN0cmVuZ3RoIHJl
ZHVjdGlvbi4KICAgICAgICAgICAgICAgICBKU1ZhbHVlIHJpZ2h0ID0gbV9zdGF0ZS5mb3JOb2Rl
KG5vZGUtPmNoaWxkMigpKS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChsZWZ0ICYmIHJp
Z2h0ICYmIGxlZnQuaXNJbnQzMigpICYmIHJpZ2h0LmlzSW50MzIoKQotICAgICAgICAgICAgICAg
ICAgICAmJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obGVmdC5hc0ludDMyKCkpIDwgc3RhdGljX2Nh
c3Q8dWludDMyX3Q+KHJpZ2h0LmFzSW50MzIoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJp
Z2h0IHx8ICFyaWdodC5pc0ludDMyKCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIC8vIEFycmF5IGxlbmd0aCBpcyBrbm93bi4KKyAgICAgICAgICAgICAgICBp
bnQzMl90IGxlbmd0aCA9IHJpZ2h0LmFzSW50MzIoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5k
ZXhJbkJvdW5kcyhub2RlLT5jaGlsZDEoKS5ub2RlKCksIGxlbmd0aCkpIHsKICAgICAgICAgICAg
ICAgICAgICAgbm9kZS0+Y29udmVydFRvUGhhbnRvbSgpOwogICAgICAgICAgICAgICAgICAgICBl
bGltaW5hdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAg
ICAgICAgfQogICAgICAgICAgICAgICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHJldmlzaW9uIDE4MTY4MCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yMjQ0LDkgKzIyNDQsOSBAQAogICAgIGlmIChub2RlLT5vcCgpID09IFB1dEJ5VmFsQWxp
YXMpCiAgICAgICAgIHJldHVybiBKSVRDb21waWxlcjo6SnVtcCgpOwogICAgIGlmIChKU0FycmF5
QnVmZmVyVmlldyogdmlldyA9IG1faml0LmdyYXBoKCkudHJ5R2V0Rm9sZGFibGVWaWV3Rm9yQ2hp
bGQxKG5vZGUpKSB7Ci0gICAgICAgIHVpbnQzMl90IGxlbmd0aCA9IHZpZXctPmxlbmd0aCgpOwor
ICAgICAgICBpbnQzMl90IGxlbmd0aCA9IHZpZXctPmxlbmd0aCgpOwogICAgICAgICBOb2RlKiBp
bmRleE5vZGUgPSBtX2ppdC5ncmFwaCgpLmNoaWxkKG5vZGUsIDEpLm5vZGUoKTsKLSAgICAgICAg
aWYgKGluZGV4Tm9kZS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgaW5kZXhOb2RlLT5hc1VJbnQzMigp
IDwgbGVuZ3RoKQorICAgICAgICBpZiAoaW5kZXhJbkJvdW5kcyhpbmRleE5vZGUsIGxlbmd0aCkp
CiAgICAgICAgICAgICByZXR1cm4gSklUQ29tcGlsZXI6Okp1bXAoKTsKICAgICAgICAgcmV0dXJu
IG1faml0LmJyYW5jaDMyKAogICAgICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OkFib3ZlT3JFcXVh
bCwgaW5kZXhHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW0zMihsZW5ndGgpKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3RyZW5ndGhSZWR1Y3Rpb25QaGFzZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTdHJlbmd0aFJlZHVjdGlvblBo
YXNlLmNwcAkocmV2aXNpb24gMTgxNjgwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdTdHJlbmd0aFJlZHVjdGlvblBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzIsNiArNzIs
NyBAQAogICAgIHsKICAgICAgICAgc3dpdGNoIChtX25vZGUtPm9wKCkpIHsKICAgICAgICAgY2Fz
ZSBCaXRPcjoKKyAgICAgICAgY2FzZSBCaXRYb3I6CiAgICAgICAgICAgICBoYW5kbGVDb21tdXRh
dGl2aXR5KCk7CiAKICAgICAgICAgICAgIGlmIChtX25vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29u
c3RhbnQoKSAmJiAhbV9ub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpKSB7CkBAIC04MCw5ICs4MSwx
MyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKLSAg
ICAgICAgY2FzZSBCaXRYb3I6CiAgICAgICAgIGNhc2UgQml0QW5kOgogICAgICAgICAgICAgaGFu
ZGxlQ29tbXV0YXRpdml0eSgpOworCisgICAgICAgICAgICBpZiAobV9ub2RlLT5jaGlsZDIoKS0+
aXNJbnQzMkNvbnN0YW50KCkgJiYgbV9ub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpID09IC0xKSB7
CisgICAgICAgICAgICAgICAgY29udmVydFRvSWRlbnRpdHlPdmVyQ2hpbGQxKCk7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAg
ICAgICAgIAogICAgICAgICBjYXNlIEJpdExTaGlmdDoK
</data>

          </attachment>
      

    </bug>

</bugzilla>