UserTest.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //===- llvm/unittest/IR/UserTest.cpp - User unit tests --------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/IR/User.h"
  9. #include "llvm/AsmParser/Parser.h"
  10. #include "llvm/IR/Function.h"
  11. #include "llvm/IR/Instructions.h"
  12. #include "llvm/IR/LLVMContext.h"
  13. #include "llvm/IR/Module.h"
  14. #include "llvm/Support/SourceMgr.h"
  15. #include "gtest/gtest.h"
  16. using namespace llvm;
  17. namespace {
  18. TEST(UserTest, ValueOpIteration) {
  19. LLVMContext C;
  20. const char *ModuleString = "define void @f(i32 %x, i32 %y) {\n"
  21. "entry:\n"
  22. " switch i32 undef, label %s0\n"
  23. " [ i32 1, label %s1\n"
  24. " i32 2, label %s2\n"
  25. " i32 3, label %s3\n"
  26. " i32 4, label %s4\n"
  27. " i32 5, label %s5\n"
  28. " i32 6, label %s6\n"
  29. " i32 7, label %s7\n"
  30. " i32 8, label %s8\n"
  31. " i32 9, label %s9 ]\n"
  32. "\n"
  33. "s0:\n"
  34. " br label %exit\n"
  35. "s1:\n"
  36. " br label %exit\n"
  37. "s2:\n"
  38. " br label %exit\n"
  39. "s3:\n"
  40. " br label %exit\n"
  41. "s4:\n"
  42. " br label %exit\n"
  43. "s5:\n"
  44. " br label %exit\n"
  45. "s6:\n"
  46. " br label %exit\n"
  47. "s7:\n"
  48. " br label %exit\n"
  49. "s8:\n"
  50. " br label %exit\n"
  51. "s9:\n"
  52. " br label %exit\n"
  53. "\n"
  54. "exit:\n"
  55. " %phi = phi i32 [ 0, %s0 ], [ 1, %s1 ],\n"
  56. " [ 2, %s2 ], [ 3, %s3 ],\n"
  57. " [ 4, %s4 ], [ 5, %s5 ],\n"
  58. " [ 6, %s6 ], [ 7, %s7 ],\n"
  59. " [ 8, %s8 ], [ 9, %s9 ]\n"
  60. " ret void\n"
  61. "}\n";
  62. SMDiagnostic Err;
  63. std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
  64. Function *F = M->getFunction("f");
  65. BasicBlock &ExitBB = F->back();
  66. PHINode &P = cast<PHINode>(ExitBB.front());
  67. EXPECT_TRUE(P.value_op_begin() == P.value_op_begin());
  68. EXPECT_FALSE(P.value_op_begin() == P.value_op_end());
  69. EXPECT_TRUE(P.value_op_begin() != P.value_op_end());
  70. EXPECT_FALSE(P.value_op_end() != P.value_op_end());
  71. EXPECT_TRUE(P.value_op_begin() < P.value_op_end());
  72. EXPECT_FALSE(P.value_op_begin() < P.value_op_begin());
  73. EXPECT_TRUE(P.value_op_end() > P.value_op_begin());
  74. EXPECT_FALSE(P.value_op_begin() > P.value_op_begin());
  75. EXPECT_TRUE(P.value_op_begin() <= P.value_op_begin());
  76. EXPECT_FALSE(P.value_op_end() <= P.value_op_begin());
  77. EXPECT_TRUE(P.value_op_begin() >= P.value_op_begin());
  78. EXPECT_FALSE(P.value_op_begin() >= P.value_op_end());
  79. EXPECT_EQ(10, std::distance(P.value_op_begin(), P.value_op_end()));
  80. // const value op iteration
  81. const PHINode *IP = &P;
  82. EXPECT_TRUE(IP->value_op_begin() == IP->value_op_begin());
  83. EXPECT_FALSE(IP->value_op_begin() == IP->value_op_end());
  84. EXPECT_TRUE(IP->value_op_begin() != IP->value_op_end());
  85. EXPECT_FALSE(IP->value_op_end() != IP->value_op_end());
  86. EXPECT_TRUE(IP->value_op_begin() < IP->value_op_end());
  87. EXPECT_FALSE(IP->value_op_begin() < IP->value_op_begin());
  88. EXPECT_TRUE(IP->value_op_end() > IP->value_op_begin());
  89. EXPECT_FALSE(IP->value_op_begin() > IP->value_op_begin());
  90. EXPECT_TRUE(IP->value_op_begin() <= IP->value_op_begin());
  91. EXPECT_FALSE(IP->value_op_end() <= IP->value_op_begin());
  92. EXPECT_TRUE(IP->value_op_begin() >= IP->value_op_begin());
  93. EXPECT_FALSE(IP->value_op_begin() >= IP->value_op_end());
  94. EXPECT_EQ(10, std::distance(IP->value_op_begin(), IP->value_op_end()));
  95. User::value_op_iterator I = P.value_op_begin();
  96. I += 3;
  97. EXPECT_EQ(std::next(P.value_op_begin(), 3), I);
  98. EXPECT_EQ(P.getOperand(3), *I);
  99. I++;
  100. EXPECT_EQ(P.getOperand(6), I[2]);
  101. EXPECT_EQ(P.value_op_end(), (I - 2) + 8);
  102. // const value op
  103. User::const_value_op_iterator CI = IP->value_op_begin();
  104. CI += 3;
  105. EXPECT_EQ(std::next(IP->value_op_begin(), 3), CI);
  106. EXPECT_EQ(IP->getOperand(3), *CI);
  107. CI++;
  108. EXPECT_EQ(IP->getOperand(6), CI[2]);
  109. EXPECT_EQ(IP->value_op_end(), (CI - 2) + 8);
  110. }
  111. TEST(UserTest, PersonalityUser) {
  112. LLVMContext Context;
  113. Module M("", Context);
  114. FunctionType *RetVoidTy = FunctionType::get(Type::getVoidTy(Context), false);
  115. Function *PersonalityF = Function::Create(
  116. RetVoidTy, GlobalValue::ExternalLinkage, "PersonalityFn", &M);
  117. Function *TestF =
  118. Function::Create(RetVoidTy, GlobalValue::ExternalLinkage, "TestFn", &M);
  119. // Set up the personality function
  120. TestF->setPersonalityFn(PersonalityF);
  121. auto PersonalityUsers = PersonalityF->user_begin();
  122. // One user and that user is the Test function
  123. EXPECT_EQ(*PersonalityUsers, TestF);
  124. EXPECT_EQ(++PersonalityUsers, PersonalityF->user_end());
  125. // Reset the personality function
  126. TestF->setPersonalityFn(nullptr);
  127. // No users should remain
  128. EXPECT_TRUE(TestF->user_empty());
  129. }
  130. } // end anonymous namespace