blob: da19669400db9b51a7640cc5dfa16d14269bba23 [file] [log] [blame]
// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ThrowableConsumer;
import com.android.tools.r8.ir.optimize.nonnull.FieldAccessTest;
import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterArrayAccess;
import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterFieldAccess;
import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterInvoke;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.InstructionSubject;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Streams;
import java.util.List;
import org.junit.Test;
public class SimplifyIfNotNullTest extends TestBase {
private void verifyAbsenceOfIf(
CodeInspector codeInspector, Class<?> testClass, List<MethodSignature> signatures) {
for (MethodSignature signature : signatures) {
MethodSubject method =
codeInspector.clazz(testClass).method(signature);
long count = Streams.stream(method.iterateInstructions(InstructionSubject::isIf)).count();
assertEquals(0, count);
}
}
private void testR8(Class<?> testClass, List<MethodSignature> signatures) throws Exception {
testR8(testClass, signatures, null);
}
private void testR8(
Class<?> testClass,
List<MethodSignature> signatures,
ThrowableConsumer<R8FullTestBuilder> configuration)
throws Exception {
CodeInspector codeInspector =
testForR8(Backend.DEX)
.addProgramClasses(testClass)
.addKeepRules("-keep class " + testClass.getCanonicalName() + " { *; }")
.apply(configuration)
.compile()
.inspector();
verifyAbsenceOfIf(codeInspector, testClass, signatures);
}
@Test
public void nonNullAfterSafeInvokes() throws Exception {
MethodSignature foo =
new MethodSignature("foo", "int", new String[]{"java.lang.String"});
MethodSignature bar =
new MethodSignature("bar", "int", new String[]{"java.lang.String"});
testR8(NonNullAfterInvoke.class, ImmutableList.of(foo, bar));
}
@Test
public void nonNullAfterSafeArrayAccess() throws Exception {
MethodSignature foo =
new MethodSignature("foo", "int", new String[]{"java.lang.String[]"});
MethodSignature bar =
new MethodSignature("bar", "int", new String[]{"java.lang.String[]"});
testR8(NonNullAfterArrayAccess.class, ImmutableList.of(foo, bar));
}
@Test
public void nonNullAfterSafeFieldAccess() throws Exception {
MethodSignature foo = new MethodSignature("foo", "int",
new String[]{FieldAccessTest.class.getCanonicalName()});
MethodSignature bar = new MethodSignature("bar", "int",
new String[]{FieldAccessTest.class.getCanonicalName()});
MethodSignature foo2 = new MethodSignature("foo2", "int",
new String[]{FieldAccessTest.class.getCanonicalName()});
testR8(
NonNullAfterFieldAccess.class,
ImmutableList.of(foo, bar, foo2),
testBuilder -> testBuilder.addProgramClasses(FieldAccessTest.class));
}
}