// Copyright 2023 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "src/tint/lang/spirv/writer/raise/merge_return.h"

#include <utility>

#include "src/tint/lang/core/ir/transform/helper_test.h"

namespace tint::spirv::writer::raise {
namespace {

using namespace tint::core::fluent_types;     // NOLINT
using namespace tint::core::number_suffixes;  // NOLINT

using SpirvWriter_MergeReturnTest = core::ir::transform::TransformTest;

TEST_F(SpirvWriter_MergeReturnTest, NoModify_SingleReturnInRootBlock) {
    auto* in = b.FunctionParam(ty.i32());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({in});

    b.Append(func->Block(), [&] { b.Return(func, b.Add(ty.i32(), in, 1_i)); });

    auto* src = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %3:i32 = add %2, 1i
    ret %3
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = src;

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, NoModify_SingleReturnInMergeBlock) {
    auto* in = b.FunctionParam(ty.i32());
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({in});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        ifelse->SetResults(b.InstructionResult(ty.i32()));
        b.Append(ifelse->True(), [&] { b.ExitIf(ifelse, b.Add(ty.i32(), in, 1_i)); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse, b.Add(ty.i32(), in, 2_i)); });

        b.Return(func, ifelse->Result(0));
    });
    auto* src = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %3:i32 = if %4 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        %5:i32 = add %2, 1i
        exit_if %5  # if_1
      }
      %b3 = block {  # false
        %6:i32 = add %2, 2i
        exit_if %6  # if_1
      }
    }
    ret %3
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = src;

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, NoModify_SingleReturnInNestedMergeBlock) {
    auto* in = b.FunctionParam(ty.i32());
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({in});

    b.Append(func->Block(), [&] {
        auto* swtch = b.Switch(in);
        b.Append(b.DefaultCase(swtch), [&] { b.ExitSwitch(swtch); });

        auto* l = b.Loop();
        b.Append(l->Body(), [&] { b.ExitLoop(l); });

        auto* ifelse = b.If(cond);
        ifelse->SetResults(b.InstructionResult(ty.i32()));
        b.Append(ifelse->True(), [&] { b.ExitIf(ifelse, b.Add(ty.i32(), in, 1_i)); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse, b.Add(ty.i32(), in, 2_i)); });

        b.Return(func, ifelse->Result(0));
    });

    auto* src = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    switch %2 [c: (default, %b2)] {  # switch_1
      %b2 = block {  # case
        exit_switch  # switch_1
      }
    }
    loop [b: %b3] {  # loop_1
      %b3 = block {  # body
        exit_loop  # loop_1
      }
    }
    %3:i32 = if %4 [t: %b4, f: %b5] {  # if_1
      %b4 = block {  # true
        %5:i32 = add %2, 1i
        exit_if %5  # if_1
      }
      %b5 = block {  # false
        %6:i32 = add %2, 2i
        exit_if %6  # if_1
      }
    }
    ret %3
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = src;

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_OneSideReturns) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.void_());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        b.Append(ifelse->True(), [&] { b.Return(func); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });

        b.Return(func);
    });

    auto* src = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        ret
      }
      %b3 = block {  # false
        exit_if  # if_1
      }
    }
    ret
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        exit_if  # if_1
      }
      %b3 = block {  # false
        exit_if  # if_1
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

// This is the same as the above tests, but we create the return instructions in a different order
// to make sure that creation order doesn't matter.
TEST_F(SpirvWriter_MergeReturnTest, IfElse_OneSideReturns_ReturnsCreatedInDifferentOrder) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.void_());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        b.Return(func);

        b.Append(ifelse->True(), [&] { b.Return(func); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });
    });

    auto* src = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        ret
      }
      %b3 = block {  # false
        exit_if  # if_1
      }
    }
    ret
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        exit_if  # if_1
      }
      %b3 = block {  # false
        exit_if  # if_1
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_OneSideReturns_WithValue) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        b.Append(ifelse->True(), [&] { b.Return(func, 1_i); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });

        b.Return(func, 2_i);
    });

    auto* src = R"(
%foo = func(%2:bool):i32 -> %b1 {
  %b1 = block {
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        ret 1i
      }
      %b3 = block {  # false
        exit_if  # if_1
      }
    }
    ret 2i
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        store %continue_execution, false
        store %return_value, 1i
        exit_if  # if_1
      }
      %b3 = block {  # false
        exit_if  # if_1
      }
    }
    %5:bool = load %continue_execution
    if %5 [t: %b4] {  # if_2
      %b4 = block {  # true
        store %return_value, 2i
        exit_if  # if_2
      }
    }
    %6:i32 = load %return_value
    ret %6
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_OneSideReturns_WithValue_MergeHasBasicBlockArguments) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        ifelse->SetResults(b.InstructionResult(ty.i32()));
        b.Append(ifelse->True(), [&] { b.Return(func, 1_i); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse, 2_i); });

        b.Return(func, ifelse->Result(0));
    });

    auto* src = R"(
%foo = func(%2:bool):i32 -> %b1 {
  %b1 = block {
    %3:i32 = if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        ret 1i
      }
      %b3 = block {  # false
        exit_if 2i  # if_1
      }
    }
    ret %3
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    %5:i32 = if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        store %continue_execution, false
        store %return_value, 1i
        exit_if undef  # if_1
      }
      %b3 = block {  # false
        exit_if 2i  # if_1
      }
    }
    %6:bool = load %continue_execution
    if %6 [t: %b4] {  # if_2
      %b4 = block {  # true
        store %return_value, %5
        exit_if  # if_2
      }
    }
    %7:i32 = load %return_value
    ret %7
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest,
       IfElse_OneSideReturns_WithValue_MergeHasUndefBasicBlockArguments) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        ifelse->SetResults(b.InstructionResult(ty.i32()));
        b.Append(ifelse->True(), [&] { b.Return(func, 1_i); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse, nullptr); });

        b.Return(func, ifelse->Result(0));
    });

    auto* src = R"(
%foo = func(%2:bool):i32 -> %b1 {
  %b1 = block {
    %3:i32 = if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        ret 1i
      }
      %b3 = block {  # false
        exit_if undef  # if_1
      }
    }
    ret %3
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    %5:i32 = if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        store %continue_execution, false
        store %return_value, 1i
        exit_if undef  # if_1
      }
      %b3 = block {  # false
        exit_if undef  # if_1
      }
    }
    %6:bool = load %continue_execution
    if %6 [t: %b4] {  # if_2
      %b4 = block {  # true
        store %return_value, %5
        exit_if  # if_2
      }
    }
    %7:i32 = load %return_value
    ret %7
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_BothSidesReturn) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.void_());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        b.Append(ifelse->True(), [&] { b.Return(func); });
        b.Append(ifelse->False(), [&] { b.Return(func); });

        b.Unreachable();
    });

    auto* src = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        ret
      }
      %b3 = block {  # false
        ret
      }
    }
    unreachable
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        exit_if  # if_1
      }
      %b3 = block {  # false
        exit_if  # if_1
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_BothSidesReturn_NestedInAnotherIfWithResults) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.void_());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* outer = b.If(cond);
        outer->SetResults(b.InstructionResult(ty.i32()), b.InstructionResult(ty.f32()));
        b.Append(outer->True(), [&] {
            auto* inner = b.If(cond);
            b.Append(inner->True(), [&] {  //
                b.Return(func);
            });
            b.Append(inner->False(), [&] {  //
                b.Return(func);
            });
            b.Unreachable();
        });
        b.Append(outer->False(), [&] {  //
            b.Return(func);
        });
        b.Unreachable();
    });

    auto* src = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    %3:i32, %4:f32 = if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        if %2 [t: %b4, f: %b5] {  # if_2
          %b4 = block {  # true
            ret
          }
          %b5 = block {  # false
            ret
          }
        }
        unreachable
      }
      %b3 = block {  # false
        ret
      }
    }
    unreachable
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    %3:i32, %4:f32 = if %2 [t: %b2, f: %b3] {  # if_1
      %b2 = block {  # true
        if %2 [t: %b4, f: %b5] {  # if_2
          %b4 = block {  # true
            exit_if  # if_2
          }
          %b5 = block {  # false
            exit_if  # if_2
          }
        }
        exit_if undef, undef  # if_1
      }
      %b3 = block {  # false
        exit_if undef, undef  # if_1
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_BothSidesReturn_NestedInLoop) {
    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.void_());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Body(), [&] {
            auto* inner = b.If(cond);
            b.Append(inner->True(), [&] {  //
                b.Return(func);
            });
            b.Append(inner->False(), [&] {  //
                b.Return(func);
            });
            b.Unreachable();
        });
        b.Unreachable();
    });

    auto* src = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    loop [b: %b2] {  # loop_1
      %b2 = block {  # body
        if %2 [t: %b3, f: %b4] {  # if_1
          %b3 = block {  # true
            ret
          }
          %b4 = block {  # false
            ret
          }
        }
        unreachable
      }
    }
    unreachable
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:bool):void -> %b1 {
  %b1 = block {
    loop [b: %b2] {  # loop_1
      %b2 = block {  # body
        if %2 [t: %b3, f: %b4] {  # if_1
          %b3 = block {  # true
            exit_if  # if_1
          }
          %b4 = block {  # false
            exit_if  # if_1
          }
        }
        exit_loop  # loop_1
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_ThenStatements) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.void_());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        b.Append(ifelse->True(), [&] { b.Return(func); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });

        b.Store(global, 42_i);
        b.Return(func);
    });

    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):void -> %b2 {
  %b2 = block {
    if %3 [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        ret
      }
      %b4 = block {  # false
        exit_if  # if_1
      }
    }
    store %1, 42i
    ret
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):void -> %b2 {
  %b2 = block {
    %continue_execution:ptr<function, bool, read_write> = var, true
    if %3 [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        store %continue_execution, false
        exit_if  # if_1
      }
      %b4 = block {  # false
        exit_if  # if_1
      }
    }
    %5:bool = load %continue_execution
    if %5 [t: %b5] {  # if_2
      %b5 = block {  # true
        store %1, 42i
        exit_if  # if_2
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

// This is the same as the above tests, but we create the return instructions in a different order
// to make sure that creation order doesn't matter.
TEST_F(SpirvWriter_MergeReturnTest, IfElse_ThenStatements_ReturnsCreatedInDifferentOrder) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.void_());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* ifelse = b.If(cond);
        b.Store(global, 42_i);
        b.Return(func);

        b.Append(ifelse->True(), [&] { b.Return(func); });
        b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });
    });

    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):void -> %b2 {
  %b2 = block {
    if %3 [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        ret
      }
      %b4 = block {  # false
        exit_if  # if_1
      }
    }
    store %1, 42i
    ret
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):void -> %b2 {
  %b2 = block {
    %continue_execution:ptr<function, bool, read_write> = var, true
    if %3 [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        store %continue_execution, false
        exit_if  # if_1
      }
      %b4 = block {  # false
        exit_if  # if_1
      }
    }
    %5:bool = load %continue_execution
    if %5 [t: %b5] {  # if_2
      %b5 = block {  # true
        store %1, 42i
        exit_if  # if_2
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_Nested) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* func = b.Function("foo", ty.i32());
    auto* condA = b.FunctionParam("condA", ty.bool_());
    auto* condB = b.FunctionParam("condB", ty.bool_());
    auto* condC = b.FunctionParam("condC", ty.bool_());
    func->SetParams({condA, condB, condC});

    b.Append(func->Block(), [&] {
        auto* ifelse_outer = b.If(condA);
        b.Append(ifelse_outer->True(), [&] { b.Return(func, 3_i); });
        b.Append(ifelse_outer->False(), [&] {
            auto* ifelse_middle = b.If(condB);
            b.Append(ifelse_middle->True(), [&] {
                auto* ifelse_inner = b.If(condC);
                b.Append(ifelse_inner->True(), [&] { b.Return(func, 1_i); });
                b.Append(ifelse_inner->False(), [&] { b.ExitIf(ifelse_inner); });

                b.Store(global, 1_i);
                b.Return(func, 2_i);
            });
            b.Append(ifelse_middle->False(), [&] { b.ExitIf(ifelse_middle); });
            b.Store(global, 2_i);
            b.ExitIf(ifelse_outer);
        });
        b.Store(global, 3_i);
        b.Return(func, b.Add(ty.i32(), 5_i, 6_i));
    });

    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
  %b2 = block {
    if %condA [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        ret 3i
      }
      %b4 = block {  # false
        if %condB [t: %b5, f: %b6] {  # if_2
          %b5 = block {  # true
            if %condC [t: %b7, f: %b8] {  # if_3
              %b7 = block {  # true
                ret 1i
              }
              %b8 = block {  # false
                exit_if  # if_3
              }
            }
            store %1, 1i
            ret 2i
          }
          %b6 = block {  # false
            exit_if  # if_2
          }
        }
        store %1, 2i
        exit_if  # if_1
      }
    }
    store %1, 3i
    %6:i32 = add 5i, 6i
    ret %6
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
  %b2 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    if %condA [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        store %continue_execution, false
        store %return_value, 3i
        exit_if  # if_1
      }
      %b4 = block {  # false
        if %condB [t: %b5, f: %b6] {  # if_2
          %b5 = block {  # true
            if %condC [t: %b7, f: %b8] {  # if_3
              %b7 = block {  # true
                store %continue_execution, false
                store %return_value, 1i
                exit_if  # if_3
              }
              %b8 = block {  # false
                exit_if  # if_3
              }
            }
            %8:bool = load %continue_execution
            if %8 [t: %b9] {  # if_4
              %b9 = block {  # true
                store %1, 1i
                store %continue_execution, false
                store %return_value, 2i
                exit_if  # if_4
              }
            }
            exit_if  # if_2
          }
          %b6 = block {  # false
            exit_if  # if_2
          }
        }
        %9:bool = load %continue_execution
        if %9 [t: %b10] {  # if_5
          %b10 = block {  # true
            store %1, 2i
            exit_if  # if_5
          }
        }
        exit_if  # if_1
      }
    }
    %10:bool = load %continue_execution
    if %10 [t: %b11] {  # if_6
      %b11 = block {  # true
        store %1, 3i
        %11:i32 = add 5i, 6i
        store %return_value, %11
        exit_if  # if_6
      }
    }
    %12:i32 = load %return_value
    ret %12
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_Nested_TrivialMerge) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* func = b.Function("foo", ty.i32());
    auto* condA = b.FunctionParam("condA", ty.bool_());
    auto* condB = b.FunctionParam("condB", ty.bool_());
    auto* condC = b.FunctionParam("condC", ty.bool_());
    func->SetParams({condA, condB, condC});

    b.Append(func->Block(), [&] {
        auto* ifelse_outer = b.If(condA);
        b.Append(ifelse_outer->True(), [&] { b.Return(func, 3_i); });
        b.Append(ifelse_outer->False(), [&] {
            auto* ifelse_middle = b.If(condB);
            b.Append(ifelse_middle->True(), [&] {
                auto* ifelse_inner = b.If(condC);
                b.Append(ifelse_inner->True(), [&] { b.Return(func, 1_i); });
                b.Append(ifelse_inner->False(), [&] { b.ExitIf(ifelse_inner); });

                b.ExitIf(ifelse_middle);
            });
            b.Append(ifelse_middle->False(), [&] { b.ExitIf(ifelse_middle); });

            b.ExitIf(ifelse_outer);
        });
        b.Return(func, 3_i);
    });
    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
  %b2 = block {
    if %condA [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        ret 3i
      }
      %b4 = block {  # false
        if %condB [t: %b5, f: %b6] {  # if_2
          %b5 = block {  # true
            if %condC [t: %b7, f: %b8] {  # if_3
              %b7 = block {  # true
                ret 1i
              }
              %b8 = block {  # false
                exit_if  # if_3
              }
            }
            exit_if  # if_2
          }
          %b6 = block {  # false
            exit_if  # if_2
          }
        }
        exit_if  # if_1
      }
    }
    ret 3i
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
  %b2 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    if %condA [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        store %continue_execution, false
        store %return_value, 3i
        exit_if  # if_1
      }
      %b4 = block {  # false
        if %condB [t: %b5, f: %b6] {  # if_2
          %b5 = block {  # true
            if %condC [t: %b7, f: %b8] {  # if_3
              %b7 = block {  # true
                store %continue_execution, false
                store %return_value, 1i
                exit_if  # if_3
              }
              %b8 = block {  # false
                exit_if  # if_3
              }
            }
            exit_if  # if_2
          }
          %b6 = block {  # false
            exit_if  # if_2
          }
        }
        exit_if  # if_1
      }
    }
    %8:bool = load %continue_execution
    if %8 [t: %b9] {  # if_4
      %b9 = block {  # true
        store %return_value, 3i
        exit_if  # if_4
      }
    }
    %9:i32 = load %return_value
    ret %9
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_Nested_WithBasicBlockArguments) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* func = b.Function("foo", ty.i32());
    auto* condA = b.FunctionParam("condA", ty.bool_());
    auto* condB = b.FunctionParam("condB", ty.bool_());
    auto* condC = b.FunctionParam("condC", ty.bool_());
    func->SetParams({condA, condB, condC});

    b.Append(func->Block(), [&] {
        auto* ifelse_outer = b.If(condA);
        ifelse_outer->SetResults(b.InstructionResult(ty.i32()));
        b.Append(ifelse_outer->True(), [&] { b.Return(func, 3_i); });
        b.Append(ifelse_outer->False(), [&] {
            auto* ifelse_middle = b.If(condB);
            ifelse_middle->SetResults(b.InstructionResult(ty.i32()));
            b.Append(ifelse_middle->True(), [&] {
                auto* ifelse_inner = b.If(condC);

                b.Append(ifelse_inner->True(), [&] { b.Return(func, 1_i); });
                b.Append(ifelse_inner->False(), [&] { b.ExitIf(ifelse_inner); });

                b.ExitIf(ifelse_middle, b.Add(ty.i32(), 42_i, 1_i));
            });
            b.Append(ifelse_middle->False(),
                     [&] { b.ExitIf(ifelse_middle, b.Add(ty.i32(), 43_i, 2_i)); });
            b.ExitIf(ifelse_outer, b.Add(ty.i32(), ifelse_middle->Result(0), 1_i));
        });

        b.Return(func, b.Add(ty.i32(), ifelse_outer->Result(0), 1_i));
    });

    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
  %b2 = block {
    %6:i32 = if %condA [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        ret 3i
      }
      %b4 = block {  # false
        %7:i32 = if %condB [t: %b5, f: %b6] {  # if_2
          %b5 = block {  # true
            if %condC [t: %b7, f: %b8] {  # if_3
              %b7 = block {  # true
                ret 1i
              }
              %b8 = block {  # false
                exit_if  # if_3
              }
            }
            %8:i32 = add 42i, 1i
            exit_if %8  # if_2
          }
          %b6 = block {  # false
            %9:i32 = add 43i, 2i
            exit_if %9  # if_2
          }
        }
        %10:i32 = add %7, 1i
        exit_if %10  # if_1
      }
    }
    %11:i32 = add %6, 1i
    ret %11
  }
}
)";

    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%condA:bool, %condB:bool, %condC:bool):i32 -> %b2 {
  %b2 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    %8:i32 = if %condA [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        store %continue_execution, false
        store %return_value, 3i
        exit_if undef  # if_1
      }
      %b4 = block {  # false
        %9:i32 = if %condB [t: %b5, f: %b6] {  # if_2
          %b5 = block {  # true
            if %condC [t: %b7, f: %b8] {  # if_3
              %b7 = block {  # true
                store %continue_execution, false
                store %return_value, 1i
                exit_if  # if_3
              }
              %b8 = block {  # false
                exit_if  # if_3
              }
            }
            %10:bool = load %continue_execution
            %11:i32 = if %10 [t: %b9] {  # if_4
              %b9 = block {  # true
                %12:i32 = add 42i, 1i
                exit_if %12  # if_4
              }
              # implicit false block: exit_if undef
            }
            exit_if %11  # if_2
          }
          %b6 = block {  # false
            %13:i32 = add 43i, 2i
            exit_if %13  # if_2
          }
        }
        %14:bool = load %continue_execution
        %15:i32 = if %14 [t: %b10] {  # if_5
          %b10 = block {  # true
            %16:i32 = add %9, 1i
            exit_if %16  # if_5
          }
          # implicit false block: exit_if undef
        }
        exit_if %15  # if_1
      }
    }
    %17:bool = load %continue_execution
    if %17 [t: %b11] {  # if_6
      %b11 = block {  # true
        %18:i32 = add %8, 1i
        store %return_value, %18
        exit_if  # if_6
      }
    }
    %19:i32 = load %return_value
    ret %19
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_Consecutive) {
    auto* value = b.FunctionParam(ty.i32());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({value});

    b.Append(func->Block(), [&] {
        {
            auto* ifelse = b.If(b.Equal(ty.bool_(), value, 1_i));
            b.Append(ifelse->True(), [&] { b.Return(func, 101_i); });
        }
        {
            auto* ifelse = b.If(b.Equal(ty.bool_(), value, 2_i));
            b.Append(ifelse->True(), [&] { b.Return(func, 202_i); });
        }
        {
            auto* ifelse = b.If(b.Equal(ty.bool_(), value, 3_i));
            b.Append(ifelse->True(), [&] { b.Return(func, 303_i); });
        }
        b.Return(func, 404_i);
    });

    auto* src = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %3:bool = eq %2, 1i
    if %3 [t: %b2] {  # if_1
      %b2 = block {  # true
        ret 101i
      }
    }
    %4:bool = eq %2, 2i
    if %4 [t: %b3] {  # if_2
      %b3 = block {  # true
        ret 202i
      }
    }
    %5:bool = eq %2, 3i
    if %5 [t: %b4] {  # if_3
      %b4 = block {  # true
        ret 303i
      }
    }
    ret 404i
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    %5:bool = eq %2, 1i
    if %5 [t: %b2] {  # if_1
      %b2 = block {  # true
        store %continue_execution, false
        store %return_value, 101i
        exit_if  # if_1
      }
    }
    %6:bool = load %continue_execution
    if %6 [t: %b3] {  # if_2
      %b3 = block {  # true
        %7:bool = eq %2, 2i
        if %7 [t: %b4] {  # if_3
          %b4 = block {  # true
            store %continue_execution, false
            store %return_value, 202i
            exit_if  # if_3
          }
        }
        %8:bool = load %continue_execution
        if %8 [t: %b5] {  # if_4
          %b5 = block {  # true
            %9:bool = eq %2, 3i
            if %9 [t: %b6] {  # if_5
              %b6 = block {  # true
                store %continue_execution, false
                store %return_value, 303i
                exit_if  # if_5
              }
            }
            %10:bool = load %continue_execution
            if %10 [t: %b7] {  # if_6
              %b7 = block {  # true
                store %return_value, 404i
                exit_if  # if_6
              }
            }
            exit_if  # if_4
          }
        }
        exit_if  # if_2
      }
    }
    %11:i32 = load %return_value
    ret %11
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, IfElse_Consecutive_ThenUnreachable) {
    auto* value = b.FunctionParam(ty.i32());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({value});

    b.Append(func->Block(), [&] {
        {
            auto* if_ = b.If(b.Equal(ty.bool_(), value, 1_i));
            b.Append(if_->True(), [&] { b.Return(func, 101_i); });
        }
        {
            auto* ifelse = b.If(b.Equal(ty.bool_(), value, 2_i));
            b.Append(ifelse->True(), [&] { b.Return(func, 202_i); });
            b.Append(ifelse->False(), [&] { b.Return(func, 303_i); });
        }
        b.Unreachable();
    });

    auto* src = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %3:bool = eq %2, 1i
    if %3 [t: %b2] {  # if_1
      %b2 = block {  # true
        ret 101i
      }
    }
    %4:bool = eq %2, 2i
    if %4 [t: %b3, f: %b4] {  # if_2
      %b3 = block {  # true
        ret 202i
      }
      %b4 = block {  # false
        ret 303i
      }
    }
    unreachable
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    %5:bool = eq %2, 1i
    if %5 [t: %b2] {  # if_1
      %b2 = block {  # true
        store %continue_execution, false
        store %return_value, 101i
        exit_if  # if_1
      }
    }
    %6:bool = load %continue_execution
    if %6 [t: %b3] {  # if_2
      %b3 = block {  # true
        %7:bool = eq %2, 2i
        if %7 [t: %b4, f: %b5] {  # if_3
          %b4 = block {  # true
            store %continue_execution, false
            store %return_value, 202i
            exit_if  # if_3
          }
          %b5 = block {  # false
            store %continue_execution, false
            store %return_value, 303i
            exit_if  # if_3
          }
        }
        exit_if  # if_2
      }
    }
    %8:i32 = load %return_value
    ret %8
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, Loop_UnconditionalReturnInBody) {
    auto* func = b.Function("foo", ty.i32());

    b.Append(func->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Body(), [&] { b.Return(func, 42_i); });

        b.Unreachable();
    });
    auto* src = R"(
%foo = func():i32 -> %b1 {
  %b1 = block {
    loop [b: %b2] {  # loop_1
      %b2 = block {  # body
        ret 42i
      }
    }
    unreachable
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func():i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    loop [b: %b2] {  # loop_1
      %b2 = block {  # body
        store %return_value, 42i
        exit_loop  # loop_1
      }
    }
    %3:i32 = load %return_value
    ret %3
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, Loop_ConditionalReturnInBody) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Body(), [&] {
            auto* ifelse = b.If(cond);
            b.Append(ifelse->True(), [&] { b.Return(func, 42_i); });
            b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });

            b.Store(global, 2_i);
            b.Continue(loop);
        });

        b.Append(loop->Continuing(), [&] {
            b.Store(global, 1_i);
            b.BreakIf(loop, true);
        });

        b.Store(global, 3_i);
        b.Return(func, 43_i);
    });

    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):i32 -> %b2 {
  %b2 = block {
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        if %3 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            ret 42i
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        store %1, 2i
        continue %b4
      }
      %b4 = block {  # continuing
        store %1, 1i
        break_if true %b3
      }
    }
    store %1, 3i
    ret 43i
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):i32 -> %b2 {
  %b2 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        if %3 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            store %continue_execution, false
            store %return_value, 42i
            exit_if  # if_1
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        %6:bool = load %continue_execution
        if %6 [t: %b7] {  # if_2
          %b7 = block {  # true
            store %1, 2i
            continue %b4
          }
        }
        exit_loop  # loop_1
      }
      %b4 = block {  # continuing
        store %1, 1i
        break_if true %b3
      }
    }
    %7:bool = load %continue_execution
    if %7 [t: %b8] {  # if_3
      %b8 = block {  # true
        store %1, 3i
        store %return_value, 43i
        exit_if  # if_3
      }
    }
    %8:i32 = load %return_value
    ret %8
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, Loop_ConditionalReturnInBody_UnreachableMerge) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Body(), [&] {
            auto* ifelse = b.If(cond);

            b.Append(ifelse->True(), [&] { b.Return(func, 42_i); });
            b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });

            b.Store(global, 2_i);
            b.Continue(loop);
        });

        b.Append(loop->Continuing(), [&] {
            b.Store(global, 1_i);
            b.NextIteration(loop);
        });

        b.Unreachable();
    });

    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):i32 -> %b2 {
  %b2 = block {
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        if %3 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            ret 42i
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        store %1, 2i
        continue %b4
      }
      %b4 = block {  # continuing
        store %1, 1i
        next_iteration %b3
      }
    }
    unreachable
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):i32 -> %b2 {
  %b2 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        if %3 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            store %continue_execution, false
            store %return_value, 42i
            exit_if  # if_1
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        %6:bool = load %continue_execution
        if %6 [t: %b7] {  # if_2
          %b7 = block {  # true
            store %1, 2i
            continue %b4
          }
        }
        exit_loop  # loop_1
      }
      %b4 = block {  # continuing
        store %1, 1i
        next_iteration %b3
      }
    }
    %7:i32 = load %return_value
    ret %7
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, DISABLED_Loop_WithBasicBlockArgumentsOnMerge) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* cond = b.FunctionParam(ty.bool_());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* loop = b.Loop();
        loop->SetResults(b.InstructionResult(ty.i32()));
        b.Append(loop->Body(), [&] {
            auto* ifelse = b.If(cond);
            b.Append(ifelse->True(), [&] { b.Return(func, 42_i); });
            b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });

            b.Store(global, 2_i);
            b.Continue(loop);
        });

        b.Append(loop->Continuing(), [&] {
            b.Store(global, 1_i);
            b.BreakIf(loop, true, 4_i);
        });

        b.Store(global, 3_i);
        b.Return(func, loop->Result(0));
    });
    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):i32 -> %b2 {
  %b2 = block {
    %4:i32 = loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        if %3 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            ret 42i
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        store %1, 2i
        continue %b4
      }
      %b4 = block {  # continuing
        store %1, 1i
        break_if true %b3 4i
      }
    }
    store %1, 3i
    ret %4
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:bool):i32 -> %b2 {
  %b2 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    %6:i32 = loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        if %3 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            store %continue_execution, false
            store %return_value, 42i
            exit_if  # if_1
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        %7:bool = load %continue_execution
        if %7 [t: %b7] {  # if_2
          %b7 = block {  # true
            store %1, 2i
            continue %b4
          }
        }
        exit_loop  # loop_1
      }
      %b4 = block {  # continuing
        store %1, 1i
        break_if true %b3 4i
      }
    }
    %8:bool = load %continue_execution
    if %8 [t: %b8] {  # if_3
      %b8 = block {  # true
        store %1, 3i
        store %return_value, %6
        exit_if  # if_3
      }
    }
    %9:i32 = load %return_value
    ret %9
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, Switch_UnconditionalReturnInCase) {
    auto* cond = b.FunctionParam(ty.i32());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* sw = b.Switch(cond);
        b.Append(b.Case(sw, {b.Constant(1_i)}), [&] { b.Return(func, 42_i); });
        b.Append(b.DefaultCase(sw), [&] { b.ExitSwitch(sw); });

        b.Return(func, 0_i);
    });

    auto* src = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    switch %2 [c: (1i, %b2), c: (default, %b3)] {  # switch_1
      %b2 = block {  # case
        ret 42i
      }
      %b3 = block {  # case
        exit_switch  # switch_1
      }
    }
    ret 0i
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    switch %2 [c: (1i, %b2), c: (default, %b3)] {  # switch_1
      %b2 = block {  # case
        store %continue_execution, false
        store %return_value, 42i
        exit_switch  # switch_1
      }
      %b3 = block {  # case
        exit_switch  # switch_1
      }
    }
    %5:bool = load %continue_execution
    if %5 [t: %b4] {  # if_1
      %b4 = block {  # true
        store %return_value, 0i
        exit_if  # if_1
      }
    }
    %6:i32 = load %return_value
    ret %6
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, Switch_ConditionalReturnInBody) {
    auto* global = b.Var(ty.ptr<private_, i32>());
    mod.root_block->Append(global);

    auto* cond = b.FunctionParam(ty.i32());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* sw = b.Switch(cond);
        b.Append(b.Case(sw, {b.Constant(1_i)}), [&] {
            auto* ifcond = b.Equal(ty.bool_(), cond, 1_i);
            auto* ifelse = b.If(ifcond);
            b.Append(ifelse->True(), [&] { b.Return(func, 42_i); });
            b.Append(ifelse->False(), [&] { b.ExitIf(ifelse); });

            b.Store(global, 2_i);
            b.ExitSwitch(sw);
        });

        b.Append(b.DefaultCase(sw), [&] { b.ExitSwitch(sw); });

        b.Return(func, 0_i);
    });

    auto* src = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:i32):i32 -> %b2 {
  %b2 = block {
    switch %3 [c: (1i, %b3), c: (default, %b4)] {  # switch_1
      %b3 = block {  # case
        %4:bool = eq %3, 1i
        if %4 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            ret 42i
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        store %1, 2i
        exit_switch  # switch_1
      }
      %b4 = block {  # case
        exit_switch  # switch_1
      }
    }
    ret 0i
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%b1 = block {  # root
  %1:ptr<private, i32, read_write> = var
}

%foo = func(%3:i32):i32 -> %b2 {
  %b2 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    switch %3 [c: (1i, %b3), c: (default, %b4)] {  # switch_1
      %b3 = block {  # case
        %6:bool = eq %3, 1i
        if %6 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            store %continue_execution, false
            store %return_value, 42i
            exit_if  # if_1
          }
          %b6 = block {  # false
            exit_if  # if_1
          }
        }
        %7:bool = load %continue_execution
        if %7 [t: %b7] {  # if_2
          %b7 = block {  # true
            store %1, 2i
            exit_switch  # switch_1
          }
        }
        exit_switch  # switch_1
      }
      %b4 = block {  # case
        exit_switch  # switch_1
      }
    }
    %8:bool = load %continue_execution
    if %8 [t: %b8] {  # if_3
      %b8 = block {  # true
        store %return_value, 0i
        exit_if  # if_3
      }
    }
    %9:i32 = load %return_value
    ret %9
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, Switch_WithBasicBlockArgumentsOnMerge) {
    auto* cond = b.FunctionParam(ty.i32());
    auto* func = b.Function("foo", ty.i32());
    func->SetParams({cond});

    b.Append(func->Block(), [&] {
        auto* sw = b.Switch(cond);
        sw->SetResults(b.InstructionResult(ty.i32()));  // NOLINT: false detection of std::tuple
        b.Append(b.Case(sw, {b.Constant(1_i)}), [&] { b.Return(func, 42_i); });
        b.Append(b.Case(sw, {b.Constant(2_i)}), [&] { b.Return(func, 99_i); });
        b.Append(b.Case(sw, {b.Constant(3_i)}), [&] { b.ExitSwitch(sw, 1_i); });
        b.Append(b.DefaultCase(sw), [&] { b.ExitSwitch(sw, 0_i); });

        b.Return(func, sw->Result(0));
    });

    auto* src = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %3:i32 = switch %2 [c: (1i, %b2), c: (2i, %b3), c: (3i, %b4), c: (default, %b5)] {  # switch_1
      %b2 = block {  # case
        ret 42i
      }
      %b3 = block {  # case
        ret 99i
      }
      %b4 = block {  # case
        exit_switch 1i  # switch_1
      }
      %b5 = block {  # case
        exit_switch 0i  # switch_1
      }
    }
    ret %3
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func(%2:i32):i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    %5:i32 = switch %2 [c: (1i, %b2), c: (2i, %b3), c: (3i, %b4), c: (default, %b5)] {  # switch_1
      %b2 = block {  # case
        store %continue_execution, false
        store %return_value, 42i
        exit_switch undef  # switch_1
      }
      %b3 = block {  # case
        store %continue_execution, false
        store %return_value, 99i
        exit_switch undef  # switch_1
      }
      %b4 = block {  # case
        exit_switch 1i  # switch_1
      }
      %b5 = block {  # case
        exit_switch 0i  # switch_1
      }
    }
    %6:bool = load %continue_execution
    if %6 [t: %b6] {  # if_1
      %b6 = block {  # true
        store %return_value, %5
        exit_if  # if_1
      }
    }
    %7:i32 = load %return_value
    ret %7
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, LoopIfReturnThenContinue) {
    auto* func = b.Function("foo", ty.void_());

    b.Append(func->Block(), [&] {
        auto* loop = b.Loop();
        b.Append(loop->Body(), [&] {
            b.Append(b.If(true)->True(), [&] { b.Return(func); });
            b.Continue(loop);
        });
        b.Unreachable();
    });

    auto* src = R"(
%foo = func():void -> %b1 {
  %b1 = block {
    loop [b: %b2] {  # loop_1
      %b2 = block {  # body
        if true [t: %b3] {  # if_1
          %b3 = block {  # true
            ret
          }
        }
        continue %b4
      }
    }
    unreachable
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func():void -> %b1 {
  %b1 = block {
    %continue_execution:ptr<function, bool, read_write> = var, true
    loop [b: %b2] {  # loop_1
      %b2 = block {  # body
        if true [t: %b3] {  # if_1
          %b3 = block {  # true
            store %continue_execution, false
            exit_if  # if_1
          }
        }
        %3:bool = load %continue_execution
        if %3 [t: %b4] {  # if_2
          %b4 = block {  # true
            continue %b5
          }
        }
        exit_loop  # loop_1
      }
    }
    ret
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

TEST_F(SpirvWriter_MergeReturnTest, NestedIfsWithReturns) {
    auto* func = b.Function("foo", ty.i32());

    b.Append(func->Block(), [&] {
        b.Append(b.If(true)->True(), [&] {
            b.Append(b.If(true)->True(), [&] { b.Return(func, 1_i); });
            b.Return(func, 2_i);
        });
        b.Return(func, 3_i);
    });

    auto* src = R"(
%foo = func():i32 -> %b1 {
  %b1 = block {
    if true [t: %b2] {  # if_1
      %b2 = block {  # true
        if true [t: %b3] {  # if_2
          %b3 = block {  # true
            ret 1i
          }
        }
        ret 2i
      }
    }
    ret 3i
  }
}
)";
    EXPECT_EQ(src, str());

    auto* expect = R"(
%foo = func():i32 -> %b1 {
  %b1 = block {
    %return_value:ptr<function, i32, read_write> = var
    %continue_execution:ptr<function, bool, read_write> = var, true
    if true [t: %b2] {  # if_1
      %b2 = block {  # true
        if true [t: %b3] {  # if_2
          %b3 = block {  # true
            store %continue_execution, false
            store %return_value, 1i
            exit_if  # if_2
          }
        }
        %4:bool = load %continue_execution
        if %4 [t: %b4] {  # if_3
          %b4 = block {  # true
            store %continue_execution, false
            store %return_value, 2i
            exit_if  # if_3
          }
        }
        exit_if  # if_1
      }
    }
    %5:bool = load %continue_execution
    if %5 [t: %b5] {  # if_4
      %b5 = block {  # true
        store %return_value, 3i
        exit_if  # if_4
      }
    }
    %6:i32 = load %return_value
    ret %6
  }
}
)";

    Run(MergeReturn);

    EXPECT_EQ(expect, str());
}

}  // namespace
}  // namespace tint::spirv::writer::raise
