//===- llvm/tools/gollvm/unittests/BackendCore/BackendArrayStruct.cpp ---===//
//
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
//===----------------------------------------------------------------------===//

#include "TestUtils.h"
#include "go-llvm-backend.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "gtest/gtest.h"

//using namespace llvm;
using namespace goBackendUnitTests;

namespace {

class BackendArrayStructTests
    : public testing::TestWithParam<llvm::CallingConv::ID> {};

INSTANTIATE_TEST_SUITE_P(
    UnitTest, BackendArrayStructTests,
    goBackendUnitTests::CConvs,
    [](const testing::TestParamInfo<BackendArrayStructTests::ParamType> &info) {
      std::string name = goBackendUnitTests::ccName(info.param);
      return name;
    });

TEST_P(BackendArrayStructTests, TestStructFieldExprs) {
  auto cc = GetParam();
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();

  //
  // type X struct {
  //    f1 *bool
  //    f2 int32
  // }
  // var loc1 X
  //
  Location loc;
  Btype *bt = be->bool_type();
  Btype *pbt = be->pointer_type(bt);
  Btype *bi32t = be->integer_type(false, 32);
  Btype *s2t = mkBackendStruct(be, pbt, "f1", bi32t, "f2", nullptr);
  Bvariable *loc1 = h.mkLocal("loc1", s2t);

  // var loc2 *X = &loc1
  Btype *ps2t = be->pointer_type(s2t);
  Bexpression *bl1vex = be->var_expression(loc1, loc);
  Bexpression *adl1 = be->address_expression(bl1vex, loc);
  Bvariable *loc2 = h.mkLocal("loc2", ps2t, adl1);

  // var x int32
  // x = loc1.f2
  Bvariable *x = h.mkLocal("x", bi32t);
  Bexpression *vex = be->var_expression(x, loc);
  Bexpression *sex = be->var_expression(loc1, loc);
  Bexpression *fex = be->struct_field_expression(sex, 1, loc);
  h.mkAssign(vex, fex);

  // var b2 bool
  // loc1.f1 = &b2
  Bvariable *b2 = h.mkLocal("b2", bt);
  Bexpression *lvex = be->var_expression(loc1, loc);
  Bexpression *bfex = be->struct_field_expression(lvex, 0, loc);
  Bexpression *b2ex = be->var_expression(b2, loc);
  Bexpression *adb2 = be->address_expression(b2ex, loc);
  h.mkAssign(bfex, adb2);

  // loc2.f2 = 2 (equivalent to (*loc2).f2 = 2)
  Bexpression *lvexi = be->var_expression(loc2, loc);
  bool knValid = false;
  Bexpression *lindx = be->indirect_expression(s2t, lvexi, knValid, loc);
  Bexpression *bfex2 = be->struct_field_expression(lindx, 1, loc);
  Bexpression *bc2 = mkInt32Const(be, 2);
  h.mkAssign(bfex2, bc2);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast { i8*, i32 }* %loc1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.0, i8* align 8 bitcast ({ i8*, i32 }* @const.0 to i8*), i64 16, i1 false)
    store { i8*, i32 }* %loc1, { i8*, i32 }** %loc2, align 8
    store i32 0, i32* %x, align 4
    %field.0 = getelementptr inbounds { i8*, i32 }, { i8*, i32 }* %loc1, i32 0, i32 1
    %loc1.field.ld.0 = load i32, i32* %field.0, align 4
    store i32 %loc1.field.ld.0, i32* %x, align 4
    store i8 0, i8* %b2, align 1
    %field.1 = getelementptr inbounds { i8*, i32 }, { i8*, i32 }* %loc1, i32 0, i32 0
    store i8* %b2, i8** %field.1, align 8
    %loc2.ld.0 = load { i8*, i32 }*, { i8*, i32 }** %loc2, align 8
    %field.2 = getelementptr inbounds { i8*, i32 }, { i8*, i32 }* %loc2.ld.0, i32 0, i32 1
    store i32 2, i32* %field.2, align 4
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, TestStructFieldExprs2) {
  auto cc = GetParam();
  // Testing struct field expression for composites.
  FcnTestHarness h(cc);
  Llvm_backend *be = h.be();
  BFunctionType *befty = mkFuncTyp(be, L_END);
  Bfunction *func = h.mkFunction("foo", befty);

  // type X struct {
  //    f1 *bool
  //    f2 int32
  // }
  Location loc;
  Btype *bt = be->bool_type();
  Btype *pbt = be->pointer_type(bt);
  Btype *bi32t = be->integer_type(false, 32);
  Btype *s2t = mkBackendStruct(be, pbt, "f1", bi32t, "f2", nullptr);

  // Taking a field of non-constant composite.
  // var x, y int32
  // x = X{nil, y}.f2
  Bvariable *x = h.mkLocal("x", bi32t);
  Bvariable *y = h.mkLocal("y", bi32t);
  std::vector<Bexpression *> vals1;
  vals1.push_back(be->zero_expression(pbt));
  vals1.push_back(be->var_expression(y, loc));
  Bexpression *vex1 = be->var_expression(x, loc);
  Bexpression *sex1 = be->constructor_expression(s2t, vals1, loc);
  Bexpression *fex1 = be->struct_field_expression(sex1, 1, loc);
  h.mkAssign(vex1, fex1);

  // Taking a field of constant composite.
  // var z int32
  // z = X{nil, 42}.f2
  Bvariable *z = h.mkLocal("z", bi32t);
  std::vector<Bexpression *> vals2;
  vals2.push_back(be->zero_expression(pbt));
  vals2.push_back(mkInt32Const(be, int32_t(42)));
  Bexpression *vex2 = be->var_expression(z, loc);
  Bexpression *sex2 = be->constructor_expression(s2t, vals2, loc);
  Bexpression *fex2 = be->struct_field_expression(sex2, 1, loc);
  h.mkAssign(vex2, fex2);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    define void @foo(i8* nest %nest.0) #0 {
  entry:
    %tmp.0 = alloca { i8*, i32 }, align 8
    %x = alloca i32, align 4
    %y = alloca i32, align 4
    %z = alloca i32, align 4
    store i32 0, i32* %x, align 4
    store i32 0, i32* %y, align 4
    %y.ld.0 = load i32, i32* %y, align 4
    %field.0 = getelementptr inbounds { i8*, i32 }, { i8*, i32 }* %tmp.0, i32 0, i32 0
    store i8* null, i8** %field.0, align 8
    %field.1 = getelementptr inbounds { i8*, i32 }, { i8*, i32 }* %tmp.0, i32 0, i32 1
    store i32 %y.ld.0, i32* %field.1, align 4
    %field.2 = getelementptr inbounds { i8*, i32 }, { i8*, i32 }* %tmp.0, i32 0, i32 1
    %.field.ld.0 = load i32, i32* %field.2, align 4
    store i32 %.field.ld.0, i32* %x, align 4
    store i32 0, i32* %z, align 4
    store i32 42, i32* %z, align 4
    ret void
  }
  )RAW_RESULT");

  bool broken = h.finish(StripDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");

  bool isOK = h.expectValue(func->function(), exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");
}

TEST_P(BackendArrayStructTests, TestArrayIndexingExprs) {
  auto cc = GetParam();
  // Testing array indexing expression for composites.
  FcnTestHarness h(cc);
  Llvm_backend *be = h.be();
  BFunctionType *befty = mkFuncTyp(be, L_END);
  Bfunction *func = h.mkFunction("foo", befty);

  // type T [4]int64
  Location loc;
  Bexpression *val4 = mkInt64Const(be, int64_t(4));
  Btype *bi64t = be->integer_type(false, 64);
  Btype *at4 = be->array_type(bi64t, val4);

  // Taking an element of non-constant composite.
  // var x, y int64
  // x = T{y, 3, 2, 1}[1]
  Bvariable *x = h.mkLocal("x", bi64t);
  Bvariable *y = h.mkLocal("y", bi64t);
  std::vector<unsigned long> indexes = { 0, 1, 2, 3 };
  std::vector<Bexpression *> vals1;
  vals1.push_back(be->var_expression(y, loc));
  vals1.push_back(mkInt64Const(be, 3));
  vals1.push_back(mkInt64Const(be, 2));
  vals1.push_back(mkInt64Const(be, 1));
  Bexpression *aex1 = be->array_constructor_expression(at4, indexes, vals1, loc);
  Bexpression *vex1 = be->var_expression(x, loc);
  Bexpression *bi32one = mkInt32Const(be, 1);
  Bexpression *eex1 = be->array_index_expression(aex1, bi32one, loc);
  h.mkAssign(vex1, eex1);

  // Taking an element of constant composite.
  // var z int64
  // z = T{4, 3, 2, 1}[1]
  Bvariable *z = h.mkLocal("z", bi64t);
  std::vector<Bexpression *> vals2;
  for (int64_t v : {4, 3, 2, 1})
    vals2.push_back(mkInt64Const(be, v));
  Bexpression *aex2 = be->array_constructor_expression(at4, indexes, vals2, loc);
  Bexpression *vex2 = be->var_expression(z, loc);
  Bexpression *eex2 = be->array_index_expression(aex2, bi32one, loc);
  h.mkAssign(vex2, eex2);

  // Taking an element of constant composite with non-constant index.
  // var w int64
  // w = T{4, 3, 2, 1}[x]
  Bvariable *w = h.mkLocal("w", bi64t);
  std::vector<Bexpression *> vals3;
  for (int64_t v : {4, 3, 2, 1})
    vals3.push_back(mkInt64Const(be, v));
  Bexpression *aex3 = be->array_constructor_expression(at4, indexes, vals3, loc);
  Bexpression *vex3 = be->var_expression(w, loc);
  Bexpression *iex3 = be->var_expression(x, loc);
  Bexpression *eex3 = be->array_index_expression(aex3, iex3, loc);
  h.mkAssign(vex3, eex3);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    define void @foo(i8* nest %nest.0) #0 {
  entry:
    %tmp.0 = alloca [4 x i64], align 8
    %x = alloca i64, align 8
    %y = alloca i64, align 8
    %z = alloca i64, align 8
    %w = alloca i64, align 8
    store i64 0, i64* %x, align 8
    store i64 0, i64* %y, align 8
    %y.ld.0 = load i64, i64* %y, align 8
    %index.0 = getelementptr [4 x i64], [4 x i64]* %tmp.0, i32 0, i32 0
    store i64 %y.ld.0, i64* %index.0, align 8
    %index.1 = getelementptr [4 x i64], [4 x i64]* %tmp.0, i32 0, i32 1
    store i64 3, i64* %index.1, align 8
    %index.2 = getelementptr [4 x i64], [4 x i64]* %tmp.0, i32 0, i32 2
    store i64 2, i64* %index.2, align 8
    %index.3 = getelementptr [4 x i64], [4 x i64]* %tmp.0, i32 0, i32 3
    store i64 1, i64* %index.3, align 8
    %index.4 = getelementptr [4 x i64], [4 x i64]* %tmp.0, i32 0, i32 1
    %.index.ld.0 = load i64, i64* %index.4, align 8
    store i64 %.index.ld.0, i64* %x, align 8
    store i64 0, i64* %z, align 8
    store i64 3, i64* %z, align 8
    store i64 0, i64* %w, align 8
    %x.ld.0 = load i64, i64* %x, align 8
    %index.5 = getelementptr [4 x i64], [4 x i64]* @const.0, i32 0, i64 %x.ld.0
    %.index.ld.1 = load i64, i64* %index.5, align 8
    store i64 %.index.ld.1, i64* %w, align 8
    ret void
  }
  )RAW_RESULT");

  bool broken = h.finish(StripDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");

  bool isOK = h.expectValue(func->function(), exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");
}

TEST_P(BackendArrayStructTests, CreateArrayConstructionExprs) {
  auto cc = GetParam();
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();

  // var aa [4]int64 = { 4, 3, 2, 1 }
  Location loc;
  Bexpression *val4 = mkInt64Const(be, int64_t(4));
  Btype *bi64t = be->integer_type(false, 64);
  Btype *at4 = be->array_type(bi64t, val4);
  std::vector<unsigned long> indexes1 = { 0, 1, 2, 3 };
  std::vector<Bexpression *> vals1;
  for (int64_t v : {4, 3, 2, 1})
    vals1.push_back(mkInt64Const(be, v));
  Bexpression *arcon1 =
      be->array_constructor_expression(at4, indexes1, vals1, loc);
  h.mkLocal("aa", at4, arcon1);

  // var ab [4]int64 = { 2:3 }
  std::vector<unsigned long> indexes2 = { 2 };
  std::vector<Bexpression *> vals2;
  vals2.push_back(mkInt64Const(be, int64_t(3)));
  Bexpression *arcon2 =
    be->array_constructor_expression(at4, indexes2, vals2, loc);
  h.mkLocal("ab", at4, arcon2);

  // var ac [4]int64 = { 1:z }
  Bvariable *z = h.mkLocal("z", bi64t);
  std::vector<unsigned long> indexes3 = { 1 };
  std::vector<Bexpression *> vals3;
  vals3.push_back(be->var_expression(z, loc));
  Bexpression *arcon3 =
      be->array_constructor_expression(at4, indexes3, vals3, loc);
  h.mkLocal("ac", at4, arcon3);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast [4 x i64]* %aa to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.0, i8* align 8 bitcast ([4 x i64]* @const.0 to i8*), i64 32, i1 false)
    %cast.1 = bitcast [4 x i64]* %ab to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.1, i8* align 8 bitcast ([4 x i64]* @const.1 to i8*), i64 32, i1 false)
    store i64 0, i64* %z, align 8
    %z.ld.0 = load i64, i64* %z, align 8
    %index.0 = getelementptr [4 x i64], [4 x i64]* %ac, i32 0, i32 0
    store i64 0, i64* %index.0, align 8
    %index.1 = getelementptr [4 x i64], [4 x i64]* %ac, i32 0, i32 1
    store i64 %z.ld.0, i64* %index.1, align 8
    %index.2 = getelementptr [4 x i64], [4 x i64]* %ac, i32 0, i32 2
    store i64 0, i64* %index.2, align 8
    %index.3 = getelementptr [4 x i64], [4 x i64]* %ac, i32 0, i32 3
    store i64 0, i64* %index.3, align 8
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, CreateStructConstructionExprs) {
  auto cc = GetParam();
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();
  Bfunction *func = h.func();
  Location loc;

  // type X struct {
  //    f1 *int32
  //    f2 int32
  // }
  // func foo(param1, param2 int32) int64 {
  // var loc1 X = { nil, 101 }
  // var loc2 X = { &param1, loc1.f2 }

  // var loc1 X = { nil, 101 }
  Btype *bi32t = be->integer_type(false, 32);
  Btype *pbi32t = be->pointer_type(bi32t);
  Btype *s2t = mkBackendStruct(be, pbi32t, "f1", bi32t, "f2", nullptr);
  std::vector<Bexpression *> vals1;
  vals1.push_back(be->zero_expression(pbi32t));
  vals1.push_back(mkInt32Const(be, int32_t(101)));
  Bexpression *scon1 = be->constructor_expression(s2t, vals1, loc);
  Bvariable *loc1 = h.mkLocal("loc1", s2t, scon1);

  // var loc2 X = { &param1, loc1.f2 }
  Bvariable *p1 = func->getNthParamVar(0);
  Bexpression *ve1 = be->var_expression(p1, loc);
  Bexpression *adp = be->address_expression(ve1, loc);
  Bexpression *ve2 = be->var_expression(loc1, loc);
  Bexpression *fex = be->struct_field_expression(ve2, 1, loc);
  std::vector<Bexpression *> vals2;
  vals2.push_back(adp);
  vals2.push_back(fex);
  Bexpression *scon2 = be->constructor_expression(s2t, vals2, loc);
  h.mkLocal("loc2", s2t, scon2);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast { i32*, i32 }* %loc1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.0, i8* align 8 bitcast ({ i32*, i32 }* @const.0 to i8*), i64 16, i1 false)
    %field.0 = getelementptr inbounds { i32*, i32 }, { i32*, i32 }* %loc1, i32 0, i32 1
    %loc1.field.ld.0 = load i32, i32* %field.0, align 4
    %field.1 = getelementptr inbounds { i32*, i32 }, { i32*, i32 }* %loc2, i32 0, i32 0
    store i32* %param1.addr, i32** %field.1, align 8
    %field.2 = getelementptr inbounds { i32*, i32 }, { i32*, i32 }* %loc2, i32 0, i32 1
    store i32 %loc1.field.ld.0, i32* %field.2, align 4
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, CreateNestedStructConstructionExprs) {
  auto cc = GetParam();
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();
  Bfunction *func = h.func();
  Location loc;

  // type X struct {
  //    f1 *int32
  //    f2 int32
  // }
  // type Y struct {
  //    f1 X
  //    f2 float32
  // }
  Btype *bi32t = be->integer_type(false, 32);
  Btype *bf32t = be->float_type(32);
  Btype *pbi32t = be->pointer_type(bi32t);
  Btype *sxt = mkBackendStruct(be, pbi32t, "f1", bi32t, "f2", nullptr);
  Btype *syt = mkBackendStruct(be, sxt, "f1", bf32t, "f2", nullptr);

  // var l1 Y = Y{ X{nil, 3}, 3.0}
  std::vector<Bexpression *> vals1;
  Bvariable *p1 = func->getNthParamVar(0);
  Bexpression *ve1 = be->var_expression(p1, loc);
  Bexpression *adp = be->address_expression(ve1, loc);
  vals1.push_back(adp);
  vals1.push_back(mkInt32Const(be, int32_t(3)));
  Bexpression *scon1 = be->constructor_expression(sxt, vals1, loc);
  std::vector<Bexpression *> vals2;
  vals2.push_back(scon1);
  Bexpression *ci3 = mkInt32Const(be, int32_t(3));
  vals2.push_back(be->convert_expression(bf32t, ci3, loc));
  Bexpression *scon2 = be->constructor_expression(syt, vals2, loc);
  Bvariable *loc1 = h.mkLocal("loc1", syt);
  Bexpression *vex = be->var_expression(loc1, loc);
  h.mkAssign(vex, scon2);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast { { i32*, i32 }, float }* %loc1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.0, i8* align 8 bitcast ({ { i32*, i32 }, float }* @const.0 to i8*), i64 24, i1 false)
    %field.0 = getelementptr inbounds { i32*, i32 }, { i32*, i32 }* %tmp.0, i32 0, i32 0
    store i32* %param1.addr, i32** %field.0, align 8
    %field.1 = getelementptr inbounds { i32*, i32 }, { i32*, i32 }* %tmp.0, i32 0, i32 1
    store i32 3, i32* %field.1, align 4
    %field.2 = getelementptr inbounds { { i32*, i32 }, float }, { { i32*, i32 }, float }* %loc1, i32 0, i32 0
    %cast.1 = bitcast { i32*, i32 }* %field.2 to i8*
    %cast.2 = bitcast { i32*, i32 }* %tmp.0 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.1, i8* align 8 %cast.2, i64 16, i1 false)
    %field.3 = getelementptr inbounds { { i32*, i32 }, float }, { { i32*, i32 }, float }* %loc1, i32 0, i32 1
    store float 3.000000e+00, float* %field.3, align 4
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, CreateStructConstructionExprs2) {
  auto cc = GetParam();
  FcnTestHarness h(cc);
  Llvm_backend *be = h.be();

  Btype *bi32t = be->integer_type(false, 32);
  Btype *pbi32t = be->pointer_type(bi32t);
  Btype *s2t = mkBackendStruct(be, pbi32t, "f1", bi32t, "f2", nullptr);
  Btype *ps2t = be->pointer_type(s2t);
  BFunctionType *befty1 = mkFuncTyp(be,
                                    L_PARM, ps2t,
                                    L_PARM, pbi32t,
                                    L_END);
  Bfunction *func = h.mkFunction("blah", befty1);
  Location loc;

  // *p0 = { p1, 101 }
  Bvariable *p0 = func->getNthParamVar(0);
  Bvariable *p1 = func->getNthParamVar(1);
  Bexpression *ve = be->var_expression(p0, loc);
  Bexpression *dex = be->indirect_expression(s2t, ve, false, loc);
  std::vector<Bexpression *> vals;
  vals.push_back(be->var_expression(p1, loc));
  vals.push_back(mkInt32Const(be, int32_t(101)));
  Bexpression *scon = be->constructor_expression(s2t, vals, loc);
  h.mkAssign(dex, scon);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %p0.ld.0 = load { i32*, i32 }*, { i32*, i32 }** %p0.addr, align 8
    %p1.ld.0 = load i32*, i32** %p1.addr, align 8
    %field.0 = getelementptr inbounds { i32*, i32 }, { i32*, i32 }* %p0.ld.0, i32 0, i32 0
    store i32* %p1.ld.0, i32** %field.0, align 8
    %field.1 = getelementptr inbounds { i32*, i32 }, { i32*, i32 }* %p0.ld.0, i32 0, i32 1
    store i32 101, i32* %field.1, align 4
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, CreateStructConstructionExprs3) {
  auto cc = GetParam();
  // Test struct construction involving global variables.
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();
  Location loc;

  // type T struct {
  //    f1 int32
  // }
  Btype *bi32t = be->integer_type(false, 32);
  Btype *s1t = mkBackendStruct(be, bi32t, "f1", nullptr);

  // Construct a struct with a global var field
  // var x int32  // global
  // var t = T{x} // global
  unsigned int emptyflags = 0;
  Bvariable *x = be->global_variable("x", "x", bi32t, emptyflags, loc);
  Bexpression *xvex = be->var_expression(x, loc);
  std::vector<Bexpression *> vals1 = {xvex};
  Bexpression *scon1 = be->constructor_expression(s1t, vals1, loc);
  Bvariable *t = be->global_variable("t", "t", s1t, emptyflags, loc);
  Bexpression *tvex = be->var_expression(t, loc);
  h.mkAssign(tvex, scon1);

  // Construct a struct with a field from a field of global var
  // var t2 = T{t.x}
  Bexpression *tvex2 = be->var_expression(t, loc);
  Bexpression *fex = be->struct_field_expression(tvex2, 0, loc);
  std::vector<Bexpression *> vals2 = {fex};
  Bexpression *scon2 = be->constructor_expression(s1t, vals2, loc);
  h.mkLocal("t2", s1t, scon2);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %x.ld.0 = load i32, i32* @x, align 4
    store i32 %x.ld.0, i32* getelementptr inbounds ({ i32 }, { i32 }* @t, i32 0, i32 0), align 4
    %t.field.ld.0 = load i32, i32* getelementptr inbounds ({ i32 }, { i32 }* @t, i32 0, i32 0), align 4
    %field.2 = getelementptr inbounds { i32 }, { i32 }* %t2, i32 0, i32 0
    store i32 %t.field.ld.0, i32* %field.2, align 4
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, CreateArrayIndexingExprs) {
  auto cc = GetParam();
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();

  // var aa [4]int64 = { 4, 3, 2, 1 }
  Location loc;
  Bexpression *val4 = mkInt64Const(be, int64_t(4));
  Btype *bi64t = be->integer_type(false, 64);
  Btype *at4 = be->array_type(bi64t, val4);
  std::vector<unsigned long> indexes1 = { 0, 1, 2, 3 };
  std::vector<Bexpression *> vals1;
  for (int64_t v : {4, 3, 2, 1})
    vals1.push_back(mkInt64Const(be, v));
  Bexpression *arcon1 =
    be->array_constructor_expression(at4, indexes1, vals1, loc);
  Bvariable *aa = h.mkLocal("aa", at4, arcon1);

  // aa[1]
  Bexpression *bi32one = mkInt32Const(be, 1);
  Bexpression *vea1 = be->var_expression(aa, loc);
  Bexpression *aa1 = be->array_index_expression(vea1, bi32one, loc);

  // aa[3]
  Bexpression *bi64three = mkInt64Const(be, 3);
  Bexpression *vea2 = be->var_expression(aa, loc);
  Bexpression *aa2 = be->array_index_expression(vea2, bi64three, loc);

  // aa[aa[3]]
  Bexpression *vea3 = be->var_expression(aa, loc);
  Bexpression *aa3 = be->array_index_expression(vea3, aa2, loc);

  // aa[aa[1]]
  Bexpression *vea4 = be->var_expression(aa, loc);
  Bexpression *aa4 = be->array_index_expression(vea4, aa1, loc);

  // aa[aa[1]] = aa[aa[3]]
  h.mkAssign(aa4, aa3);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast [4 x i64]* %aa to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.0, i8* align 8 bitcast ([4 x i64]* @const.0 to i8*), i64 32, i1 false)
    %index.0 = getelementptr [4 x i64], [4 x i64]* %aa, i32 0, i32 1
    %aa.index.ld.0 = load i64, i64* %index.0, align 8
    %index.1 = getelementptr [4 x i64], [4 x i64]* %aa, i32 0, i64 %aa.index.ld.0
    %index.2 = getelementptr [4 x i64], [4 x i64]* %aa, i32 0, i64 3
    %aa.index.ld.1 = load i64, i64* %index.2, align 8
    %index.3 = getelementptr [4 x i64], [4 x i64]* %aa, i32 0, i64 %aa.index.ld.1
    %aa.index.ld.2 = load i64, i64* %index.3, align 8
    store i64 %aa.index.ld.2, i64* %index.1, align 8
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, CreateComplexIndexingAndFieldExprs) {
  auto cc = GetParam();
  FcnTestHarness h(cc, "foo");

  // Create type that incorporates structures, arrays, and pointers:
  //
  //   type sA struct {
  //      x, y int64
  //   }
  //   type asA [4]*sA
  //   type sB struct {
  //      y  bool
  //      ar asA
  //      n  bool
  //   }
  //   type psB *sB
  //   type t [10]psB
  //
  Llvm_backend *be = h.be();
  Btype *bi64t = be->integer_type(false, 64);
  Btype *sA = mkBackendStruct(be, bi64t, "x", bi64t, "y", nullptr);
  Btype *psA = be->pointer_type(sA);
  Bexpression *val4 = mkInt64Const(be, int64_t(4));
  Btype *asA = be->array_type(psA, val4);
  Btype *bt = be->bool_type();
  Btype *sB = mkBackendStruct(be, bt, "y", asA, "ar", bt, "n", nullptr);
  Btype *psB = be->pointer_type(sB);
  Bexpression *val10 = mkInt64Const(be, int64_t(10));
  Btype *t = be->array_type(psB, val10);
  Location loc;

  // var t1 t
  Bvariable *t1 = h.mkLocal("t1", t);

  // t1[7].ar[3].x = 5
  {
    Bexpression *vt = be->var_expression(t1, loc);
    Bexpression *bi32sev = mkInt32Const(be, 7);
    Bexpression *ti7 = be->array_index_expression(vt, bi32sev, loc);
    bool knValid = true;
    Bexpression *iti7 = be->indirect_expression(sB, ti7, knValid, loc);
    Bexpression *far = be->struct_field_expression(iti7, 1, loc);
    Bexpression *bi32three = mkInt32Const(be, 3);
    Bexpression *ar3 = be->array_index_expression(far, bi32three, loc);
    Bexpression *iar3 = be->indirect_expression(sA, ar3, knValid, loc);
    Bexpression *fx = be->struct_field_expression(iar3, 0, loc);
    Bexpression *bi64five = mkInt64Const(be, 5);
    h.mkAssign(fx, bi64five);

    DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast [10 x { i8, [4 x { i64, i64 }*], i8 }*]* %t1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.0, i8* align 8 bitcast ([10 x { i8, [4 x { i64, i64 }*], i8 }*]* @const.0 to i8*), i64 80, i1 false)
    %index.0 = getelementptr [10 x { i8, [4 x { i64, i64 }*], i8 }*], [10 x { i8, [4 x { i64, i64 }*], i8 }*]* %t1, i32 0, i32 7
    %t1.index.ld.0 = load { i8, [4 x { i64, i64 }*], i8 }*, { i8, [4 x { i64, i64 }*], i8 }** %index.0, align 8
    %field.0 = getelementptr inbounds { i8, [4 x { i64, i64 }*], i8 }, { i8, [4 x { i64, i64 }*], i8 }* %t1.index.ld.0, i32 0, i32 1
    %index.1 = getelementptr [4 x { i64, i64 }*], [4 x { i64, i64 }*]* %field.0, i32 0, i32 3
    %.field.index.ld.0 = load { i64, i64 }*, { i64, i64 }** %index.1, align 8
    %field.1 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %.field.index.ld.0, i32 0, i32 0
    store i64 5, i64* %field.1, align 8
    )RAW_RESULT");

    bool isOK = h.expectBlock(exp);
    EXPECT_TRUE(isOK && "Block does not have expected contents");
  }

  h.newBlock();

  // q := t1[0].ar[0].y
  {
    Bexpression *vt = be->var_expression(t1, loc);
    Bexpression *bi32zero = mkInt32Const(be, 0);
    Bexpression *ti0 = be->array_index_expression(vt, bi32zero, loc);
    bool knValid = true;
    Bexpression *iti0 = be->indirect_expression(sB, ti0, knValid, loc);
    Bexpression *far = be->struct_field_expression(iti0, 1, loc);
    Bexpression *ar3 = be->array_index_expression(far, bi32zero, loc);
    Bexpression *iar3 = be->indirect_expression(sA, ar3, knValid, loc);
    Bexpression *fx = be->struct_field_expression(iar3, 1, loc);
    h.mkLocal("q", bi64t, fx);

    DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %index.2 = getelementptr [10 x { i8, [4 x { i64, i64 }*], i8 }*], [10 x { i8, [4 x { i64, i64 }*], i8 }*]* %t1, i32 0, i32 0
    %t1.index.ld.1 = load { i8, [4 x { i64, i64 }*], i8 }*, { i8, [4 x { i64, i64 }*], i8 }** %index.2, align 8
    %field.2 = getelementptr inbounds { i8, [4 x { i64, i64 }*], i8 }, { i8, [4 x { i64, i64 }*], i8 }* %t1.index.ld.1, i32 0, i32 1
    %index.3 = getelementptr [4 x { i64, i64 }*], [4 x { i64, i64 }*]* %field.2, i32 0, i32 0
    %.field.index.ld.1 = load { i64, i64 }*, { i64, i64 }** %index.3, align 8
    %field.3 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %.field.index.ld.1, i32 0, i32 1
    %.field.ld.0 = load i64, i64* %field.3, align 8
    store i64 %.field.ld.0, i64* %q, align 8
    )RAW_RESULT");

    bool isOK = h.expectBlock(exp);
    EXPECT_TRUE(isOK && "Block does not have expected contents");
  }

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, TestStructAssignment) {
  auto cc = GetParam();
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();

  // type T1 struct { f1 bool }
  // type T2 struct { f1, f2, f3, f4, f5, f6 int64 }
  Location loc;
  Btype *bt = be->bool_type();
  Btype *pbt = be->pointer_type(bt);
  Btype *bi64t = be->integer_type(false, 64);
  Btype *s1t = mkBackendStruct(be, pbt, "f1", nullptr);
  Btype *s2t = mkBackendStruct(be, bi64t, "f1", bi64t, "f2", bi64t, "f3",
                               bi64t, "f4", bi64t, "f5", bi64t, "f6", nullptr);

  // var x1, y1 T1
  // var x2, y2 T2
  Bvariable *x1 = h.mkLocal("x1", s1t);
  Bvariable *y1 = h.mkLocal("y1", s1t);
  Bvariable *x2 = h.mkLocal("x2", s2t);
  Bvariable *y2 = h.mkLocal("y2", s2t);

  // x1 = y1
  // x2 = y2
  Bexpression *ve1 = be->var_expression(x1, loc);
  Bexpression *ve2 = be->var_expression(y1, loc);
  h.mkAssign(ve1, ve2);
  Bexpression *ve3 = be->var_expression(x2, loc);
  Bexpression *ve4 = be->var_expression(y2, loc);
  h.mkAssign(ve3, ve4);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast { i8* }* %x1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.0, i8* align 8 bitcast ({ i8* }* @const.0 to i8*), i64 8, i1 false)
    %cast.1 = bitcast { i8* }* %y1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.1, i8* align 8 bitcast ({ i8* }* @const.0 to i8*), i64 8, i1 false)
    %cast.2 = bitcast { i64, i64, i64, i64, i64, i64 }* %x2 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.2, i8* align 8 bitcast ({ i64, i64, i64, i64, i64, i64 }* @const.1 to i8*), i64 48, i1 false)
    %cast.3 = bitcast { i64, i64, i64, i64, i64, i64 }* %y2 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.3, i8* align 8 bitcast ({ i64, i64, i64, i64, i64, i64 }* @const.1 to i8*), i64 48, i1 false)
    %cast.4 = bitcast { i8* }* %x1 to i8*
    %cast.5 = bitcast { i8* }* %y1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.4, i8* align 8 %cast.5, i64 8, i1 false)
    %cast.6 = bitcast { i64, i64, i64, i64, i64, i64 }* %x2 to i8*
    %cast.7 = bitcast { i64, i64, i64, i64, i64, i64 }* %y2 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %cast.6, i8* align 8 %cast.7, i64 48, i1 false)
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

TEST_P(BackendArrayStructTests, TestStructFieldAddressExpr) {
  auto cc = GetParam();
  // Test address expression of struct field.
  FcnTestHarness h(cc, "foo");
  Llvm_backend *be = h.be();
  Location loc;

  // type T struct {
  //    f1 int32
  // }
  Btype *bi32t = be->integer_type(false, 32);
  Btype *bpi32t = be->pointer_type(bi32t);
  Btype *s1t = mkBackendStruct(be, bi32t, "f1", nullptr);

  // var t1 T // local
  // var t2 T // global
  // var a1 = &t1.f1
  // var a2 = &t2.f1
  Bvariable *t1 = h.mkLocal("t1", s1t);
  Bexpression *t1vex = be->var_expression(t1, loc);
  Bexpression *fex1 = be->struct_field_expression(t1vex, 0, loc);
  Bexpression *aex1 = be->address_expression(fex1, loc);
  h.mkLocal("a1", bpi32t, aex1);

  unsigned int t2flags = 0;
  Bvariable *t2 = be->global_variable("t2", "t2", s1t, t2flags, loc);
  Bexpression *t2vex = be->var_expression(t2, loc);
  Bexpression *fex2 = be->struct_field_expression(t2vex, 0, loc);
  Bexpression *aex2 = be->address_expression(fex2, loc);
  h.mkLocal("a2", bpi32t, aex2);

  DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT(
    %cast.0 = bitcast { i32 }* %t1 to i8*
    call addrspace(0) void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %cast.0, i8* align 4 bitcast ({ i32 }* @const.0 to i8*), i64 4, i1 false)
    %field.0 = getelementptr inbounds { i32 }, { i32 }* %t1, i32 0, i32 0
    store i32* %field.0, i32** %a1, align 8
    store i32* getelementptr inbounds ({ i32 }, { i32 }* @t2, i32 0, i32 0), i32** %a2, align 8
  )RAW_RESULT");

  bool isOK = h.expectBlock(exp);
  EXPECT_TRUE(isOK && "Block does not have expected contents");

  bool broken = h.finish(PreserveDebugInfo);
  EXPECT_FALSE(broken && "Module failed to verify.");
}

} // namespace
