Added test related to access chains, to be extended when issue 2183 is addressed. (#2192)

diff --git a/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp b/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp
index 3fc6dbf..8388cb2 100644
--- a/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp
+++ b/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp
@@ -3294,6 +3294,147 @@
   CheckEqual(env, after_another_op_0, context.get());
 }
 
+TEST(StructuredLoopToSelectionReductionPassTest, LongAccessChains) {
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %2 "main"
+               OpExecutionMode %2 OriginUpperLeft
+               OpSource ESSL 310
+          %3 = OpTypeVoid
+          %4 = OpTypeFunction %3
+          %5 = OpTypeInt 32 1
+          %6 = OpTypeInt 32 0
+          %7 = OpConstant %6 5
+          %8 = OpTypeArray %5 %7
+          %9 = OpTypeStruct %8
+         %10 = OpTypeStruct %9 %9
+         %11 = OpConstant %6 2
+         %12 = OpTypeArray %10 %11
+         %13 = OpTypeStruct %12
+         %14 = OpTypePointer Function %13
+         %15 = OpConstant %5 0
+         %16 = OpConstant %5 1
+         %17 = OpConstant %5 2
+         %18 = OpConstant %5 3
+         %19 = OpConstant %5 4
+         %20 = OpConstantComposite %8 %15 %16 %17 %18 %19
+         %21 = OpConstantComposite %9 %20
+         %22 = OpConstant %5 5
+         %23 = OpConstant %5 6
+         %24 = OpConstant %5 7
+         %25 = OpConstant %5 8
+         %26 = OpConstant %5 9
+         %27 = OpConstantComposite %8 %22 %23 %24 %25 %26
+         %28 = OpConstantComposite %9 %27
+         %29 = OpConstantComposite %10 %21 %28
+         %30 = OpConstant %5 10
+         %31 = OpConstant %5 11
+         %32 = OpConstant %5 12
+         %33 = OpConstant %5 13
+         %34 = OpConstant %5 14
+         %35 = OpConstantComposite %8 %30 %31 %32 %33 %34
+         %36 = OpConstantComposite %9 %35
+         %37 = OpConstant %5 15
+         %38 = OpConstant %5 16
+         %39 = OpConstant %5 17
+         %40 = OpConstant %5 18
+         %41 = OpConstant %5 19
+         %42 = OpConstantComposite %8 %37 %38 %39 %40 %41
+         %43 = OpConstantComposite %9 %42
+         %44 = OpConstantComposite %10 %36 %43
+         %45 = OpConstantComposite %12 %29 %44
+         %46 = OpConstantComposite %13 %45
+         %47 = OpTypePointer Function %12
+         %48 = OpTypePointer Function %10
+         %49 = OpTypePointer Function %9
+         %50 = OpTypePointer Function %8
+         %51 = OpTypePointer Function %5
+         %52 = OpTypeBool
+         %53 = OpConstantTrue %52
+          %2 = OpFunction %3 None %4
+         %54 = OpLabel
+         %55 = OpVariable %14 Function
+               OpStore %55 %46
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranchConditional %53 %57 %59
+         %59 = OpLabel
+               OpSelectionMerge %60 None
+               OpBranchConditional %53 %61 %57
+         %61 = OpLabel
+         %62 = OpAccessChain %47 %55 %15
+               OpBranch %63
+         %63 = OpLabel
+               OpSelectionMerge %64 None
+               OpBranchConditional %53 %65 %57
+         %65 = OpLabel
+         %66 = OpAccessChain %48 %62 %16
+               OpBranch %67
+         %67 = OpLabel
+               OpSelectionMerge %68 None
+               OpBranchConditional %53 %69 %57
+         %69 = OpLabel
+         %70 = OpAccessChain %49 %66 %16
+               OpBranch %71
+         %71 = OpLabel
+               OpSelectionMerge %72 None
+               OpBranchConditional %53 %73 %57
+         %73 = OpLabel
+         %74 = OpAccessChain %50 %70 %15
+               OpBranch %75
+         %75 = OpLabel
+               OpSelectionMerge %76 None
+               OpBranchConditional %53 %77 %57
+         %77 = OpLabel
+         %78 = OpAccessChain %51 %74 %17
+               OpBranch %79
+         %79 = OpLabel
+               OpSelectionMerge %80 None
+               OpBranchConditional %53 %81 %57
+         %81 = OpLabel
+         %82 = OpLoad %5 %78
+               OpBranch %80
+         %80 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpBranch %56
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption);
+  const auto pass = TestSubclass<StructuredLoopToSelectionReductionPass>(env);
+  auto ops = pass.WrapGetAvailableOpportunities(context.get());
+
+  ASSERT_EQ(1, ops.size());
+  ASSERT_TRUE(ops[0]->PreconditionHolds());
+  ops[0]->TryToApply();
+
+  CheckValid(env, context.get());
+
+  // TODO(2183): When we have a more general solution for handling access
+  // chains, write an expected result for this test.
+  // std::string expected = R"(
+  // Expected text for transformed shader
+  //)";
+  // CheckEqual(env, expected, context.get());
+}
+
 }  // namespace
 }  // namespace reduce
 }  // namespace spvtools