[llvm] r322683 - Add tests for ConstantFoldTerminator preserving DomTree

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 17 09:04:41 PST 2018


Thanks for doing so BTW.  I agree they add value.


On 01/17/2018 08:27 AM, Matt Arsenault via llvm-commits wrote:
> Author: arsenm
> Date: Wed Jan 17 08:27:17 2018
> New Revision: 322683
>
> URL: http://llvm.org/viewvc/llvm-project?rev=322683&view=rev
> Log:
> Add tests for ConstantFoldTerminator preserving DomTree
>
> With my bad luck I separately implemented the DomTree preservation
> for ConstantFoldTerminator before r322401 was committed. Commit the
> tests which I think still provide some value.
>
> Modified:
>      llvm/trunk/unittests/Transforms/Utils/Local.cpp
>
> Modified: llvm/trunk/unittests/Transforms/Utils/Local.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/Local.cpp?rev=322683&r1=322682&r2=322683&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Transforms/Utils/Local.cpp (original)
> +++ llvm/trunk/unittests/Transforms/Utils/Local.cpp Wed Jan 17 08:27:17 2018
> @@ -212,3 +212,128 @@ TEST(Local, MergeBasicBlockIntoOnlyPred)
>           EXPECT_TRUE(DT->verify());
>         });
>   }
> +
> +TEST(Local, ConstantFoldTerminator) {
> +  LLVMContext C;
> +
> +  std::unique_ptr<Module> M = parseIR(
> +      C,
> +      "define void @br_same_dest() {\n"
> +      "entry:\n"
> +      "  br i1 false, label %bb0, label %bb0\n"
> +      "bb0:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @br_different_dest() {\n"
> +      "entry:\n"
> +      "  br i1 true, label %bb0, label %bb1\n"
> +      "bb0:\n"
> +      "  br label %exit\n"
> +      "bb1:\n"
> +      "  br label %exit\n"
> +      "exit:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @switch_2_different_dest() {\n"
> +      "entry:\n"
> +      "  switch i32 0, label %default [ i32 0, label %bb0 ]\n"
> +      "default:\n"
> +      "  ret void\n"
> +      "bb0:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "define void @switch_2_different_dest_default() {\n"
> +      "entry:\n"
> +      "  switch i32 1, label %default [ i32 0, label %bb0 ]\n"
> +      "default:\n"
> +      "  ret void\n"
> +      "bb0:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "define void @switch_3_different_dest() {\n"
> +      "entry:\n"
> +      "  switch i32 0, label %default [ i32 0, label %bb0\n"
> +      "                                 i32 1, label %bb1 ]\n"
> +      "default:\n"
> +      "  ret void\n"
> +      "bb0:\n"
> +      "  ret void\n"
> +      "bb1:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @switch_variable_2_default_dest(i32 %arg) {\n"
> +      "entry:\n"
> +      "  switch i32 %arg, label %default [ i32 0, label %default ]\n"
> +      "default:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @switch_constant_2_default_dest() {\n"
> +      "entry:\n"
> +      "  switch i32 1, label %default [ i32 0, label %default ]\n"
> +      "default:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @switch_constant_3_repeated_dest() {\n"
> +      "entry:\n"
> +      "  switch i32 0, label %default [ i32 0, label %bb0\n"
> +      "                                 i32 1, label %bb0 ]\n"
> +      " bb0:\n"
> +      "   ret void\n"
> +      "default:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @indirectbr() {\n"
> +      "entry:\n"
> +      "  indirectbr i8* blockaddress(@indirectbr, %bb0), [label %bb0, label %bb1]\n"
> +      "bb0:\n"
> +      "  ret void\n"
> +      "bb1:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @indirectbr_repeated() {\n"
> +      "entry:\n"
> +      "  indirectbr i8* blockaddress(@indirectbr_repeated, %bb0), [label %bb0, label %bb0]\n"
> +      "bb0:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +      "define void @indirectbr_unreachable() {\n"
> +      "entry:\n"
> +      "  indirectbr i8* blockaddress(@indirectbr_unreachable, %bb0), [label %bb1]\n"
> +      "bb0:\n"
> +      "  ret void\n"
> +      "bb1:\n"
> +      "  ret void\n"
> +      "}\n"
> +      "\n"
> +    );
> +
> +  auto CFAllTerminators = [&](Function &F, DominatorTree *DT) {
> +    DeferredDominance DDT(*DT);
> +    for (Function::iterator I = F.begin(), E = F.end(); I != E;) {
> +      BasicBlock *BB = &*I++;
> +      ConstantFoldTerminator(BB, true, nullptr, &DDT);
> +    }
> +
> +    EXPECT_TRUE(DDT.flush().verify());
> +  };
> +
> +  runWithDomTree(*M, "br_same_dest", CFAllTerminators);
> +  runWithDomTree(*M, "br_different_dest", CFAllTerminators);
> +  runWithDomTree(*M, "switch_2_different_dest", CFAllTerminators);
> +  runWithDomTree(*M, "switch_2_different_dest_default", CFAllTerminators);
> +  runWithDomTree(*M, "switch_3_different_dest", CFAllTerminators);
> +  runWithDomTree(*M, "switch_variable_2_default_dest", CFAllTerminators);
> +  runWithDomTree(*M, "switch_constant_2_default_dest", CFAllTerminators);
> +  runWithDomTree(*M, "switch_constant_3_repeated_dest", CFAllTerminators);
> +  runWithDomTree(*M, "indirectbr", CFAllTerminators);
> +  runWithDomTree(*M, "indirectbr_repeated", CFAllTerminators);
> +  runWithDomTree(*M, "indirectbr_unreachable", CFAllTerminators);
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list