SpirvConstantTest.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //===- unittests/SPIRV/SpirvConstantTest.cpp --- SPIR-V Constant tests ----===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "SpirvTestBase.h"
  10. #include "clang/SPIRV/SpirvInstruction.h"
  11. using namespace clang::spirv;
  12. namespace {
  13. class SpirvConstantTest : public SpirvTestBase {};
  14. TEST_F(SpirvConstantTest, BoolFalse) {
  15. clang::ASTContext &astContext = getAstContext();
  16. const bool val = false;
  17. SpirvConstantBoolean constant(astContext.BoolTy, val);
  18. EXPECT_EQ(val, constant.getValue());
  19. }
  20. TEST_F(SpirvConstantTest, BoolTrue) {
  21. clang::ASTContext &astContext = getAstContext();
  22. const bool val = true;
  23. SpirvConstantBoolean constant(astContext.BoolTy, val);
  24. EXPECT_EQ(val, constant.getValue());
  25. }
  26. TEST_F(SpirvConstantTest, Uint16) {
  27. clang::ASTContext &astContext = getAstContext();
  28. const auto u16 = llvm::APInt(16, 12u);
  29. SpirvConstantInteger constant(astContext.UnsignedShortTy, u16);
  30. EXPECT_EQ(u16, constant.getValue());
  31. }
  32. TEST_F(SpirvConstantTest, Int16) {
  33. clang::ASTContext &astContext = getAstContext();
  34. const auto i16 = llvm::APInt(16, -12, /*isSigned*/ true);
  35. SpirvConstantInteger constant(astContext.ShortTy, i16);
  36. EXPECT_EQ(i16, constant.getValue());
  37. }
  38. TEST_F(SpirvConstantTest, Uint32) {
  39. clang::ASTContext &astContext = getAstContext();
  40. const auto u32 = llvm::APInt(32, 65536);
  41. SpirvConstantInteger constant(astContext.UnsignedIntTy, u32);
  42. EXPECT_EQ(u32, constant.getValue());
  43. }
  44. TEST_F(SpirvConstantTest, Int32) {
  45. clang::ASTContext &astContext = getAstContext();
  46. const auto i32 = llvm::APInt(32, -65536, /*isSigned*/ true);
  47. SpirvConstantInteger constant(astContext.IntTy, i32);
  48. EXPECT_EQ(i32, constant.getValue());
  49. }
  50. TEST_F(SpirvConstantTest, Uint64) {
  51. clang::ASTContext &astContext = getAstContext();
  52. const auto u64 = llvm::APInt(64, 4294967296);
  53. SpirvConstantInteger constant(astContext.UnsignedLongLongTy, u64);
  54. EXPECT_EQ(u64, constant.getValue());
  55. }
  56. TEST_F(SpirvConstantTest, Int64) {
  57. clang::ASTContext &astContext = getAstContext();
  58. const auto i64 = llvm::APInt(64, -4294967296, /*isSigned*/ true);
  59. SpirvConstantInteger constant(astContext.LongLongTy, i64);
  60. EXPECT_EQ(i64, constant.getValue());
  61. }
  62. TEST_F(SpirvConstantTest, Float32) {
  63. clang::ASTContext &astContext = getAstContext();
  64. const auto f32 = llvm::APFloat(1.5f);
  65. SpirvConstantFloat constant(astContext.FloatTy, f32);
  66. EXPECT_EQ(1.5f, constant.getValue().convertToFloat());
  67. }
  68. TEST_F(SpirvConstantTest, CheckOperatorEqualOnBool) {
  69. clang::ASTContext &astContext = getAstContext();
  70. const bool val = true;
  71. SpirvConstantBoolean constant1(astContext.BoolTy, val);
  72. SpirvConstantBoolean constant2(astContext.BoolTy, val);
  73. EXPECT_TRUE(constant1 == constant2);
  74. }
  75. TEST_F(SpirvConstantTest, CheckOperatorEqualOnInt) {
  76. clang::ASTContext &astContext = getAstContext();
  77. const auto i32 = llvm::APInt(32, -65536, /*isSigned*/ true);
  78. SpirvConstantInteger constant1(astContext.IntTy, i32);
  79. SpirvConstantInteger constant2(astContext.IntTy, i32);
  80. EXPECT_TRUE(constant1 == constant2);
  81. }
  82. TEST_F(SpirvConstantTest, CheckOperatorEqualOnFloat) {
  83. clang::ASTContext &astContext = getAstContext();
  84. const auto f32 = llvm::APFloat(1.5f);
  85. SpirvConstantFloat constant1(astContext.FloatTy, f32);
  86. SpirvConstantFloat constant2(astContext.FloatTy, f32);
  87. EXPECT_TRUE(constant1 == constant2);
  88. }
  89. TEST_F(SpirvConstantTest, CheckOperatorEqualOnNull) {
  90. clang::ASTContext &astContext = getAstContext();
  91. SpirvConstantNull constant1(astContext.IntTy);
  92. SpirvConstantNull constant2(astContext.IntTy);
  93. EXPECT_TRUE(constant1 == constant2);
  94. }
  95. TEST_F(SpirvConstantTest, CheckOperatorEqualOnBool2) {
  96. clang::ASTContext &astContext = getAstContext();
  97. SpirvConstantBoolean constant1(astContext.BoolTy, true);
  98. SpirvConstantBoolean constant2(astContext.BoolTy, false);
  99. EXPECT_FALSE(constant1 == constant2);
  100. }
  101. TEST_F(SpirvConstantTest, CheckOperatorEqualOnInt2) {
  102. clang::ASTContext &astContext = getAstContext();
  103. const auto i1 = llvm::APInt(32, 5, /*isSigned*/ true);
  104. const auto i2 = llvm::APInt(32, 7, /*isSigned*/ true);
  105. SpirvConstantInteger constant1(astContext.IntTy, i1);
  106. SpirvConstantInteger constant2(astContext.IntTy, i2);
  107. EXPECT_FALSE(constant1 == constant2);
  108. }
  109. TEST_F(SpirvConstantTest, CheckOperatorEqualOnFloat2) {
  110. clang::ASTContext &astContext = getAstContext();
  111. const auto f1 = llvm::APFloat(1.5f);
  112. const auto f2 = llvm::APFloat(1.6f);
  113. SpirvConstantFloat constant1(astContext.FloatTy, f1);
  114. SpirvConstantFloat constant2(astContext.FloatTy, f2);
  115. EXPECT_FALSE(constant1 == constant2);
  116. }
  117. TEST_F(SpirvConstantTest, CheckOperatorEqualOnInt3) {
  118. // Different signedness should mean different constants.
  119. clang::ASTContext &astContext = getAstContext();
  120. const auto i32 = llvm::APInt(32, 7, /*isSigned*/ true);
  121. SpirvConstantInteger constant1(astContext.UnsignedIntTy, i32);
  122. SpirvConstantInteger constant2(astContext.IntTy, i32);
  123. EXPECT_FALSE(constant1 == constant2);
  124. }
  125. TEST_F(SpirvConstantTest, CheckOperatorEqualOnFloat3) {
  126. // Different bitwidth should mean different constants.
  127. clang::ASTContext &astContext = getAstContext();
  128. const auto f32 = llvm::APFloat(1.5f);
  129. SpirvConstantFloat constant1(astContext.DoubleTy, f32);
  130. SpirvConstantFloat constant2(astContext.FloatTy, f32);
  131. EXPECT_FALSE(constant1 == constant2);
  132. }
  133. TEST_F(SpirvConstantTest, CheckOperatorEqualOnInt4) {
  134. // Different bitwidth should mean different constants.
  135. clang::ASTContext &astContext = getAstContext();
  136. const auto i32 = llvm::APInt(32, 7, /*isSigned*/ true);
  137. SpirvConstantInteger constant1(astContext.ShortTy, i32);
  138. SpirvConstantInteger constant2(astContext.IntTy, i32);
  139. EXPECT_FALSE(constant1 == constant2);
  140. }
  141. TEST_F(SpirvConstantTest, CheckOperatorEqualOnNull2) {
  142. clang::ASTContext &astContext = getAstContext();
  143. SpirvConstantNull constant1(astContext.IntTy);
  144. SpirvConstantNull constant2(astContext.UnsignedIntTy);
  145. EXPECT_FALSE(constant1 == constant2);
  146. }
  147. TEST_F(SpirvConstantTest, BoolConstNotEqualSpecConst) {
  148. clang::ASTContext &astContext = getAstContext();
  149. SpirvConstantBoolean constant1(astContext.BoolTy, true, /*SpecConst*/ true);
  150. SpirvConstantBoolean constant2(astContext.BoolTy, false, /*SpecConst*/ false);
  151. EXPECT_FALSE(constant1 == constant2);
  152. }
  153. TEST_F(SpirvConstantTest, IntConstNotEqualSpecConst) {
  154. clang::ASTContext &astContext = getAstContext();
  155. const auto i32 = llvm::APInt(32, 7, /*isSigned*/ true);
  156. SpirvConstantInteger constant1(astContext.IntTy, i32, /*SpecConst*/ false);
  157. SpirvConstantInteger constant2(astContext.IntTy, i32, /*SpecConst*/ true);
  158. EXPECT_FALSE(constant1 == constant2);
  159. }
  160. TEST_F(SpirvConstantTest, FloatConstNotEqualSpecConst) {
  161. clang::ASTContext &astContext = getAstContext();
  162. const auto f32 = llvm::APFloat(1.5f);
  163. SpirvConstantFloat constant1(astContext.FloatTy, f32, /*SpecConst*/ false);
  164. SpirvConstantFloat constant2(astContext.FloatTy, f32, /*SpecConst*/ true);
  165. EXPECT_FALSE(constant1 == constant2);
  166. }
  167. } // anonymous namespace