// 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.jasmin;

import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
import com.android.tools.r8.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
import org.junit.Test;

public class Regress72269635 extends JasminTestBase {

  @Test
  public void testDeadBlocksRemoved() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("test", ImmutableList.of("IIII"), "J",
        ".limit stack 3",
        ".limit locals 5",
        "L0:",
        "  iconst_2",
        "  ifge L0",
        "L48:",
        "  iload 3",
        "  ifle L48",
        "  goto L209",
        "  aconst_null",
        "  athrow",
        "L209:",
        "  aconst_null",
        "  iconst_2",
        "  newarray float",
        "  if_acmpne L250",
        "L240:",
        "  iload 3",
        "  pop",
        "L250:",
        "  iload 3",
        "  ifgt L240",
        "  iload 3",
        "  istore 0",
        "  goto L357",
        "L318:",
        "  iinc 0 1",
        "L351:",
        "  iinc 0 1",
        "  goto L351",
        "L357:",
        "  iinc 0 1",
        "L415:",
        "  iinc 0 1",
        "  goto L415"
    );

    // Just compiling this code used to throw exceptions because not all dead blocks
    // were removed.
    AndroidApp originalApplication = builder.build();
    ToolHelper.runD8(originalApplication);
  }
}
