load-elimination-const-field.js 5.18 KB
Newer Older
1 2 3 4
// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
// Flags: --allow-natives-syntax
6 7 8 9 10

// Check that load elimination on const-marked fields works
(function() {
    function maybe_sideeffect(b) { return 42; }

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
    %NeverOptimizeFunction(maybe_sideeffect);

    class B {
        constructor(x) {
            this.value = x;
        }
    }
    %EnsureFeedbackVectorForFunction(B);


    function lit_const_smi() {
        let b = { value: 123 };
        maybe_sideeffect(b);
        let v1 = b.value;
        maybe_sideeffect(b);
        let v2 = b.value;
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, 123));
    }

31
    %PrepareFunctionForOptimization(lit_const_smi);
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
    lit_const_smi(); lit_const_smi();
    %OptimizeFunctionOnNextCall(lit_const_smi); lit_const_smi();


    function lit_const_object() {
        let o = {x: 123};
        let b = { value: o };
        maybe_sideeffect(b);
        let v1 = b.value;
        maybe_sideeffect(b);
        let v2 = b.value;
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, o));
    }

47
    %PrepareFunctionForOptimization(lit_const_object);
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    lit_const_object(); lit_const_object();
    %OptimizeFunctionOnNextCall(lit_const_object); lit_const_object();


    function lit_computed_smi(k) {
        let kk = 2 * k;
        let b = { value: kk };
        maybe_sideeffect(b);
        let v1 = b.value;
        maybe_sideeffect(b);
        let v2 = b.value;
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, kk));
    }

63
    %PrepareFunctionForOptimization(lit_computed_smi);
64 65 66 67 68 69 70 71 72
    lit_computed_smi(1); lit_computed_smi(2);
    %OptimizeFunctionOnNextCall(lit_computed_smi); lit_computed_smi(3);

    // TODO(bmeurer): Fix const tracking for double fields in object literals
    // lit_computed_smi(1.1); lit_computed_smi(2.2);
    // %OptimizeFunctionOnNextCall(lit_computed_smi); lit_computed_smi(3.3);


    function lit_param_object(k) {
73 74 75 76 77
        let b = { value: k };
        maybe_sideeffect(b);
        let v1 = b.value;
        maybe_sideeffect(b);
        let v2 = b.value;
78 79
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, k));
80 81
    }

82
    %PrepareFunctionForOptimization(lit_param_object);
83 84 85 86 87 88 89 90 91 92 93 94 95 96
    lit_param_object({x: 1}); lit_param_object({x: 2});
    %OptimizeFunctionOnNextCall(lit_param_object); lit_param_object({x: 3});


    function nested_lit_param(k) {
        let b = { x: { value: k } };
        maybe_sideeffect(b);
        let v1 = b.x.value;
        maybe_sideeffect(b);
        let v2 = b.x.value;
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, k));
    }

97
    %PrepareFunctionForOptimization(nested_lit_param);
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
    nested_lit_param(1); nested_lit_param(2);
    %OptimizeFunctionOnNextCall(nested_lit_param); nested_lit_param(3);

    // TODO(bmeurer): Fix const tracking for double fields in object literals
    // nested_lit_param(1.1); nested_lit_param(2.2);
    // %OptimizeFunctionOnNextCall(nested_lit_param); nested_lit_param(3.3);


    function nested_lit_param_object(k) {
        let b = { x: { value: k } };
        maybe_sideeffect(b);
        let v1 = b.x.value;
        maybe_sideeffect(b);
        let v2 = b.x.value;
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, k));
    }

116
    %PrepareFunctionForOptimization(nested_lit_param_object);
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
    nested_lit_param_object({x: 1}); nested_lit_param_object({x: 2});
    %OptimizeFunctionOnNextCall(nested_lit_param_object);
    nested_lit_param_object({x: 3});


    function inst_param(k) {
        let b = new B(k);
        maybe_sideeffect(b);
        let v1 = b.value;
        maybe_sideeffect(b);
        let v2 = b.value;
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, k));
    }

132 133
    %EnsureFeedbackVectorForFunction(B);
    %PrepareFunctionForOptimization(inst_param);
134 135 136 137 138 139 140 141
    inst_param(1); inst_param(2);
    %OptimizeFunctionOnNextCall(inst_param); inst_param(3);

    // TODO(gsps): Reenable once we fully support const field information
    //   tracking in the presence of pointer compression.
    // inst_param(1.1); inst_param(2.2);
    // %OptimizeFunctionOnNextCall(inst_param); inst_param(3.3);

142
    %PrepareFunctionForOptimization(inst_param);
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
    inst_param({x: 1}); inst_param({x: 2});
    %OptimizeFunctionOnNextCall(inst_param); inst_param({x: 3});


    function inst_computed(k) {
        let kk = 2 * k;
        let b = new B(kk);
        maybe_sideeffect(b);
        let v1 = b.value;
        maybe_sideeffect(b);
        let v2 = b.value;
        %TurbofanStaticAssert(Object.is(v1, v2));
        %TurbofanStaticAssert(Object.is(v2, kk));
    }

158 159
    %EnsureFeedbackVectorForFunction(B);
    %PrepareFunctionForOptimization(inst_computed);
160 161 162
    inst_computed(1); inst_computed(2);
    %OptimizeFunctionOnNextCall(inst_computed); inst_computed(3);

163
    %PrepareFunctionForOptimization(inst_computed);
164 165
    inst_computed(1.1); inst_computed(2.2);
    %OptimizeFunctionOnNextCall(inst_computed); inst_computed(3.3);
166
})();