TEST(Simplifier, JumpConstFold) { BCMarker dummy = BCMarker::Dummy(); IRUnit unit(test_context); Simplifier sim(unit); // Folding JmpZero and JmpNZero. { auto tester = [&] (SSATmp* val, Opcode op) { auto jmp = unit.gen(op, dummy, unit.defBlock(), val); return sim.simplify(jmp, false); }; auto resultFalseZero = tester(unit.cns(false), JmpZero); auto resultFalseNZero = tester(unit.cns(false), JmpNZero); auto resultTrueZero = tester(unit.cns(true), JmpZero); auto resultTrueNZero = tester(unit.cns(true), JmpNZero); EXPECT_SINGLE_OP(resultFalseNZero, Nop); EXPECT_SINGLE_OP(resultTrueZero, Nop); EXPECT_SINGLE_OP(resultFalseZero, Jmp); EXPECT_SINGLE_OP(resultTrueNZero, Jmp); } // Folding query jumps. { auto jmpeqTaken = unit.gen(JmpEq, dummy, unit.cns(10), unit.cns(10)); auto result = sim.simplify(jmpeqTaken, false); EXPECT_SINGLE_OP(result, Jmp); auto jmpeqNTaken = unit.gen(JmpEq, dummy, unit.cns(10), unit.cns(400)); result = sim.simplify(jmpeqNTaken, false); EXPECT_SINGLE_OP(result, Nop); } }
TEST(Simplifier, JumpConstFold) { BCMarker dummy = BCMarker::Dummy(); IRUnit unit(test_context); // Folding JmpZero and JmpNZero. { auto tester = [&] (SSATmp* val, Opcode op) { auto jmp = unit.gen(op, dummy, unit.defBlock(), val); return simplify(unit, jmp, false); }; auto resultFalseZero = tester(unit.cns(false), JmpZero); auto resultFalseNZero = tester(unit.cns(false), JmpNZero); auto resultTrueZero = tester(unit.cns(true), JmpZero); auto resultTrueNZero = tester(unit.cns(true), JmpNZero); EXPECT_SINGLE_OP(resultFalseNZero, Nop); EXPECT_SINGLE_OP(resultTrueZero, Nop); EXPECT_SINGLE_OP(resultFalseZero, Jmp); EXPECT_SINGLE_OP(resultTrueNZero, Jmp); } }
TEST(Simplifier, JumpConstFold) { BCMarker dummy = BCMarker::Dummy(); IRUnit unit(0); Simplifier sim(unit); OptionSetter<bool> r(RuntimeOption::EvalHHIRBytecodeControlFlow, false); // Folding JmpZero and JmpNZero. { auto tester = [&] (SSATmp* val, Opcode op) { auto jmp = unit.gen(op, dummy, unit.defBlock(), val); return sim.simplify(jmp, false); }; auto resultFalseZero = tester(unit.cns(false), JmpZero); auto resultFalseNZero = tester(unit.cns(false), JmpNZero); auto resultTrueZero = tester(unit.cns(true), JmpZero); auto resultTrueNZero = tester(unit.cns(true), JmpNZero); EXPECT_SINGLE_OP(resultFalseNZero, Nop); EXPECT_SINGLE_OP(resultTrueZero, Nop); EXPECT_SINGLE_OP(resultFalseZero, Jmp); EXPECT_SINGLE_OP(resultTrueNZero, Jmp); } // Don't do this if bytecode control flow is on. { OptionSetter<bool> r(RuntimeOption::EvalHHIRBytecodeControlFlow, true); auto jmp = unit.gen(JmpNZero, dummy, unit.defBlock(), unit.cns(false)); auto result = sim.simplify(jmp, false); EXPECT_NO_CHANGE(result); ASSERT_TRUE(RuntimeOption::EvalHHIRBytecodeControlFlow); } ASSERT_FALSE(RuntimeOption::EvalHHIRBytecodeControlFlow); // Folding query jumps. { auto jmpeqTaken = unit.gen(JmpEq, dummy, unit.cns(10), unit.cns(10)); auto result = sim.simplify(jmpeqTaken, false); EXPECT_SINGLE_OP(result, Jmp); auto jmpeqNTaken = unit.gen(JmpEq, dummy, unit.cns(10), unit.cns(400)); result = sim.simplify(jmpeqNTaken, false); EXPECT_SINGLE_OP(result, Nop); } }