/*
* Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.openjdk.bench.vm.compiler;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import java.util.concurrent.TimeUnit;
/**
* Tests for removal of redundant stores. It's crucial for the tests to be valid that inlining and allocation is
* performed as described in this file.
*/
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Thread)
public class StoreAfterStore {
public int s1 = 1, s2 = 2, s3 = 3, s4 = 4, s5 = 5, s6 = 6, s7 = 7, s8 = 8;
/**
* Test removal of redundant zero stores following an object allocation.
*/
@Benchmark
public AllocAndZeroStoreHelper testAllocAndZeroStore() throws Exception {
return new AllocAndZeroStoreHelper(s1, s2, s3, s4, s5, s6, s7, s8);
}
/**
* Test removal of stores followed by stores to the same memory location.
*/
@Benchmark
public StoreAndStoreHelper testStoreAndStore() throws Exception {
return new StoreAndStoreHelper(s1, s2, s3, s4, s5, s6, s7, s8);
}
/**
* Helper for alloc followed by zero store testing.
*/
static class AllocAndZeroStoreHelper {
public volatile int vf1, vf2, vf3, vf4, vf5, vf6, vf7, vf8;
public static int s1, s2, s3, s4, s5, s6, s7, s8;
private AllocAndZeroStoreHelper() {
this.vf1 = 0;
this.vf2 = 0;
this.vf3 = 0;
this.vf4 = 0;
this.vf5 = 0;
this.vf6 = 0;
this.vf7 = 0;
this.vf8 = 0;
}
private AllocAndZeroStoreHelper(int l1, int l2, int l3, int l4, int l5, int l6, int l7, int l8) {
this(); // Redundant initialization to zero here
// dummy stores
s1 = l1;
s2 = l2;
s3 = l3;
s4 = l4;
s5 = l5;
s6 = l6;
s7 = l7;
s8 = l8;
}
}
/**
* Helper for store made redundant by subsequent store testing.
*/
static class StoreAndStoreHelper {
public volatile int vf1, vf2, vf3, vf4, vf5, vf6, vf7, vf8;
private StoreAndStoreHelper() {
this.vf1 = -1;
this.vf2 = -1;
this.vf3 = -1;
this.vf4 = -1;
this.vf5 = -1;
this.vf6 = -1;
this.vf7 = -1;
this.vf8 = -1;
}
private StoreAndStoreHelper(int l1, int l2, int l3, int l4, int l5, int l6, int l7, int l8) {
this(); // Initialize all to -1 here, redundant wrt to the below stores
this.vf1 = l1;
this.vf2 = l2;
this.vf3 = l3;
this.vf4 = l4;
this.vf5 = l5;
this.vf6 = l6;
this.vf7 = l7;
this.vf8 = l8;
}
}
}