// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang_cc1 -emit-llvm -triple powerpc64-unknown-unknown \
// RUN:   -std=c++20 %s -o - -debug-info-kind=limited | FileCheck %s
// RUN: %clang_cc1 -emit-llvm -triple powerpc64le-unknown-unknown \
// RUN:   -std=c++20 %s -o - -debug-info-kind=limited | FileCheck %s

#include <stdarg.h>

static __ibm128 sgf;
__ibm128 arrgf[10];
__ibm128 func1(__ibm128 arg);

class CTest {
  __ibm128 pf;
  static const __ibm128 scf;
  volatile __ibm128 vf;

public:
  CTest(__ibm128 arg) : pf(arg), vf(arg) {}
  __ibm128 func2(__ibm128 arg) {
    return pf + arg;
  }
  static __ibm128 func3(__ibm128 arg) {
    return arg * CTest::scf;
  }
};

constexpr __ibm128 func_add(__ibm128 a, __ibm128 b) {
  return a + b;
}

constinit const __ibm128 ci = func_add(1.0, 2.0);
__ibm128 gf = ci;

__ibm128 func_arith(__ibm128 a, __ibm128 b, __ibm128 c) {
  __ibm128 v1 = a + b;
  __ibm128 v2 = a - c;
  __ibm128 v3 = v1 * c;
  __ibm128 v4 = v2 / v3;
  return v4;
}

__ibm128 func_vaarg(int n, ...) {
  va_list ap;
  va_start(ap, n);
  __ibm128 r = va_arg(ap, __ibm128);
  va_end(ap);
  return r;
}

template <typename T> struct T1 {
  T mem1;
};
template <> struct T1<__ibm128> {
  __ibm128 mem2;
};

template <__ibm128 Q> struct T2 {
  constexpr static __ibm128 mem = Q;
};

typedef float w128ibm __attribute__((mode(IF)));
typedef _Complex float w128ibm_c __attribute__((mode(IC)));

w128ibm icmode_self(w128ibm x) { return x; }
w128ibm_c icmode_self_complex(w128ibm_c x) { return x; }

int main(void) {
  __ibm128 lf;
  CTest ct(lf);
  T1<__ibm128> tf;
  __ibm128 lfi = tf.mem2 + func1(lf) - CTest::func3(lf);
}

// CHECK: %class.CTest = type { ppc_fp128, ppc_fp128 }
// CHECK: %struct.T1 = type { ppc_fp128 }

// CHECK: @arrgf = global [10 x ppc_fp128] zeroinitializer, align 16
// CHECK: @gf = global ppc_fp128 0xM40080000000000000000000000000000, align 16
// CHECK: @_ZN5CTest3scfE = external constant ppc_fp128, align 16

// CHECK: define dso_local noundef ppc_fp128 @_Z10func_arithggg(ppc_fp128 noundef %a, ppc_fp128 noundef %b, ppc_fp128 noundef %c)
// CHECK: entry:
// CHECK:   store ppc_fp128 %a, ppc_fp128* %a.addr, align 16
// CHECK:   store ppc_fp128 %b, ppc_fp128* %b.addr, align 16
// CHECK:   store ppc_fp128 %c, ppc_fp128* %c.addr, align 16
// CHECK:   %0 = load ppc_fp128, ppc_fp128* %a.addr, align 16
// CHECK:   %1 = load ppc_fp128, ppc_fp128* %b.addr, align 16
// CHECK:   %add = fadd ppc_fp128 %0, %1
// CHECK:   store ppc_fp128 %add, ppc_fp128* %v1, align 16
// CHECK:   %2 = load ppc_fp128, ppc_fp128* %a.addr, align 16
// CHECK:   %3 = load ppc_fp128, ppc_fp128* %c.addr, align 16
// CHECK:   %sub = fsub ppc_fp128 %2, %3
// CHECK:   store ppc_fp128 %sub, ppc_fp128* %v2, align 16
// CHECK:   %4 = load ppc_fp128, ppc_fp128* %v1, align 16
// CHECK:   %5 = load ppc_fp128, ppc_fp128* %c.addr, align 16
// CHECK:   %mul = fmul ppc_fp128 %4, %5
// CHECK:   store ppc_fp128 %mul, ppc_fp128* %v3, align 16
// CHECK:   %6 = load ppc_fp128, ppc_fp128* %v2, align 16
// CHECK:   %7 = load ppc_fp128, ppc_fp128* %v3, align 16
// CHECK:   %div = fdiv ppc_fp128 %6, %7
// CHECK:   store ppc_fp128 %div, ppc_fp128* %v4, align 16
// CHECK:   %8 = load ppc_fp128, ppc_fp128* %v4, align 16
// CHECK:   ret ppc_fp128 %8
// CHECK: }

// CHECK: define dso_local noundef ppc_fp128 @_Z10func_vaargiz(i32 noundef signext %n, ...)
// CHECK: entry:
// CHECK:   store i32 %n, i32* %n.addr, align 4
// CHECK:   %ap1 = bitcast i8** %ap to i8*
// CHECK:   call void @llvm.va_start(i8* %ap1)
// CHECK:   %argp.cur = load i8*, i8** %ap, align 8
// CHECK:   %argp.next = getelementptr inbounds i8, i8* %argp.cur, i64 16
// CHECK:   store i8* %argp.next, i8** %ap, align 8
// CHECK:   %0 = bitcast i8* %argp.cur to ppc_fp128*
// CHECK:   %1 = load ppc_fp128, ppc_fp128* %0, align 8
// CHECK:   store ppc_fp128 %1, ppc_fp128* %r, align 16
// CHECK:   %ap2 = bitcast i8** %ap to i8*
// CHECK:   call void @llvm.va_end(i8* %ap2)
// CHECK:   %2 = load ppc_fp128, ppc_fp128* %r, align 16
// CHECK:   ret ppc_fp128 %2
// CHECK: }

// CHECK: define dso_local noundef ppc_fp128 @_Z11icmode_selfg(ppc_fp128 noundef %x)
// CHECK: define dso_local noundef { ppc_fp128, ppc_fp128 } @_Z19icmode_self_complexCg(ppc_fp128 noundef %x.coerce0, ppc_fp128 noundef %x.coerce1)

// CHECK: define dso_local noundef signext i32 @main()
// CHECK: entry:
// CHECK:   %0 = load ppc_fp128, ppc_fp128* %lf, align 16
// CHECK:   call void @_ZN5CTestC1Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %ct, ppc_fp128 noundef %0)
// CHECK:   %mem2 = getelementptr inbounds %struct.T1, %struct.T1* %tf, i32 0, i32 0
// CHECK:   %1 = load ppc_fp128, ppc_fp128* %mem2, align 16
// CHECK:   %2 = load ppc_fp128, ppc_fp128* %lf, align 16
// CHECK:   %call = call noundef ppc_fp128 @_Z5func1g(ppc_fp128 noundef %2)
// CHECK:   %add = fadd ppc_fp128 %1, %call
// CHECK:   %3 = load ppc_fp128, ppc_fp128* %lf, align 16
// CHECK:   %call1 = call noundef ppc_fp128 @_ZN5CTest5func3Eg(ppc_fp128 noundef %3)
// CHECK:   %sub = fsub ppc_fp128 %add, %call1
// CHECK:   store ppc_fp128 %sub, ppc_fp128* %lfi, align 16
// CHECK:   ret i32 0
// CHECK: }

// CHECK: define linkonce_odr void @_ZN5CTestC1Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %this, ppc_fp128 noundef %arg)
// CHECK: entry:
// CHECK:   store %class.CTest* %this, %class.CTest** %this.addr, align 8
// CHECK:   store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16
// CHECK:   %this1 = load %class.CTest*, %class.CTest** %this.addr, align 8
// CHECK:   %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
// CHECK:   call void @_ZN5CTestC2Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %this1, ppc_fp128 noundef %0)
// CHECK:   ret void
// CHECK: }

// CHECK: define linkonce_odr noundef ppc_fp128 @_ZN5CTest5func3Eg(ppc_fp128 noundef %arg)
// CHECK: entry:
// CHECK:   %arg.addr = alloca ppc_fp128, align 16
// CHECK:   store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16
// CHECK:   %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
// CHECK:   %1 = load ppc_fp128, ppc_fp128* @_ZN5CTest3scfE, align 16
// CHECK:   %mul = fmul ppc_fp128 %0, %1
// CHECK:   ret ppc_fp128 %mul
// CHECK: }

// CHECK: define linkonce_odr void @_ZN5CTestC2Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %this, ppc_fp128 noundef %arg)
// CHECK: entry:
// CHECK:   store %class.CTest* %this, %class.CTest** %this.addr, align 8
// CHECK:   store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16
// CHECK:   %this1 = load %class.CTest*, %class.CTest** %this.addr, align 8
// CHECK:   %pf = getelementptr inbounds %class.CTest, %class.CTest* %this1, i32 0, i32 0
// CHECK:   %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
// CHECK:   store ppc_fp128 %0, ppc_fp128* %pf, align 16
// CHECK:   %vf = getelementptr inbounds %class.CTest, %class.CTest* %this1, i32 0, i32 1
// CHECK:   %1 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
// CHECK:   store volatile ppc_fp128 %1, ppc_fp128* %vf, align 16
// CHECK:   ret void
// CHECK: }

// CHECK: !6 = distinct !DIGlobalVariable(name: "gf", scope: !2, file: !7, line: {{[0-9]+}}, type: !8, isLocal: false, isDefinition: true)
// CHECK: !8 = !DIBasicType(name: "__ibm128", size: 128, encoding: DW_ATE_float)
