11698de28SDuncan P. N. Exon Smith //===- llvm/unittest/IR/UseTest.cpp - Use unit tests ----------------------===//
21698de28SDuncan P. N. Exon Smith //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61698de28SDuncan P. N. Exon Smith //
71698de28SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
81698de28SDuncan P. N. Exon Smith
91698de28SDuncan P. N. Exon Smith #include "llvm/AsmParser/Parser.h"
101698de28SDuncan P. N. Exon Smith #include "llvm/IR/Function.h"
111698de28SDuncan P. N. Exon Smith #include "llvm/IR/LLVMContext.h"
121698de28SDuncan P. N. Exon Smith #include "llvm/IR/Module.h"
131698de28SDuncan P. N. Exon Smith #include "llvm/IR/User.h"
14b7f6584dSNAKAMURA Takumi #include "llvm/Support/Format.h"
151698de28SDuncan P. N. Exon Smith #include "llvm/Support/SourceMgr.h"
161698de28SDuncan P. N. Exon Smith #include "gtest/gtest.h"
17857fd660SDuncan P. N. Exon Smith
181698de28SDuncan P. N. Exon Smith using namespace llvm;
191698de28SDuncan P. N. Exon Smith
201698de28SDuncan P. N. Exon Smith namespace {
211698de28SDuncan P. N. Exon Smith
TEST(UseTest,sort)221698de28SDuncan P. N. Exon Smith TEST(UseTest, sort) {
231698de28SDuncan P. N. Exon Smith LLVMContext C;
241698de28SDuncan P. N. Exon Smith
251698de28SDuncan P. N. Exon Smith const char *ModuleString = "define void @f(i32 %x) {\n"
261698de28SDuncan P. N. Exon Smith "entry:\n"
271698de28SDuncan P. N. Exon Smith " %v0 = add i32 %x, 0\n"
281698de28SDuncan P. N. Exon Smith " %v2 = add i32 %x, 2\n"
291698de28SDuncan P. N. Exon Smith " %v5 = add i32 %x, 5\n"
301698de28SDuncan P. N. Exon Smith " %v1 = add i32 %x, 1\n"
311698de28SDuncan P. N. Exon Smith " %v3 = add i32 %x, 3\n"
321698de28SDuncan P. N. Exon Smith " %v7 = add i32 %x, 7\n"
331698de28SDuncan P. N. Exon Smith " %v6 = add i32 %x, 6\n"
341698de28SDuncan P. N. Exon Smith " %v4 = add i32 %x, 4\n"
351698de28SDuncan P. N. Exon Smith " ret void\n"
361698de28SDuncan P. N. Exon Smith "}\n";
371698de28SDuncan P. N. Exon Smith SMDiagnostic Err;
38b7f6584dSNAKAMURA Takumi char vnbuf[8];
3911c07d7eSRafael Espindola std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
401698de28SDuncan P. N. Exon Smith Function *F = M->getFunction("f");
411698de28SDuncan P. N. Exon Smith ASSERT_TRUE(F);
421698de28SDuncan P. N. Exon Smith ASSERT_TRUE(F->arg_begin() != F->arg_end());
431698de28SDuncan P. N. Exon Smith Argument &X = *F->arg_begin();
441698de28SDuncan P. N. Exon Smith ASSERT_EQ("x", X.getName());
451698de28SDuncan P. N. Exon Smith
461698de28SDuncan P. N. Exon Smith X.sortUseList([](const Use &L, const Use &R) {
471698de28SDuncan P. N. Exon Smith return L.getUser()->getName() < R.getUser()->getName();
481698de28SDuncan P. N. Exon Smith });
491698de28SDuncan P. N. Exon Smith unsigned I = 0;
50b7f6584dSNAKAMURA Takumi for (User *U : X.users()) {
51af09f22cSBenjamin Kramer format("v%u", I++).snprint(vnbuf, sizeof(vnbuf));
52b7f6584dSNAKAMURA Takumi EXPECT_EQ(vnbuf, U->getName());
53b7f6584dSNAKAMURA Takumi }
541698de28SDuncan P. N. Exon Smith ASSERT_EQ(8u, I);
551698de28SDuncan P. N. Exon Smith
561698de28SDuncan P. N. Exon Smith X.sortUseList([](const Use &L, const Use &R) {
571698de28SDuncan P. N. Exon Smith return L.getUser()->getName() > R.getUser()->getName();
581698de28SDuncan P. N. Exon Smith });
591698de28SDuncan P. N. Exon Smith I = 0;
60b7f6584dSNAKAMURA Takumi for (User *U : X.users()) {
61af09f22cSBenjamin Kramer format("v%u", (7 - I++)).snprint(vnbuf, sizeof(vnbuf));
62b7f6584dSNAKAMURA Takumi EXPECT_EQ(vnbuf, U->getName());
63b7f6584dSNAKAMURA Takumi }
641698de28SDuncan P. N. Exon Smith ASSERT_EQ(8u, I);
651698de28SDuncan P. N. Exon Smith }
661698de28SDuncan P. N. Exon Smith
TEST(UseTest,reverse)673441ffe9SDuncan P. N. Exon Smith TEST(UseTest, reverse) {
683441ffe9SDuncan P. N. Exon Smith LLVMContext C;
693441ffe9SDuncan P. N. Exon Smith
703441ffe9SDuncan P. N. Exon Smith const char *ModuleString = "define void @f(i32 %x) {\n"
713441ffe9SDuncan P. N. Exon Smith "entry:\n"
723441ffe9SDuncan P. N. Exon Smith " %v0 = add i32 %x, 0\n"
733441ffe9SDuncan P. N. Exon Smith " %v2 = add i32 %x, 2\n"
743441ffe9SDuncan P. N. Exon Smith " %v5 = add i32 %x, 5\n"
753441ffe9SDuncan P. N. Exon Smith " %v1 = add i32 %x, 1\n"
763441ffe9SDuncan P. N. Exon Smith " %v3 = add i32 %x, 3\n"
773441ffe9SDuncan P. N. Exon Smith " %v7 = add i32 %x, 7\n"
783441ffe9SDuncan P. N. Exon Smith " %v6 = add i32 %x, 6\n"
793441ffe9SDuncan P. N. Exon Smith " %v4 = add i32 %x, 4\n"
803441ffe9SDuncan P. N. Exon Smith " ret void\n"
813441ffe9SDuncan P. N. Exon Smith "}\n";
823441ffe9SDuncan P. N. Exon Smith SMDiagnostic Err;
833441ffe9SDuncan P. N. Exon Smith char vnbuf[8];
8411c07d7eSRafael Espindola std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
853441ffe9SDuncan P. N. Exon Smith Function *F = M->getFunction("f");
863441ffe9SDuncan P. N. Exon Smith ASSERT_TRUE(F);
873441ffe9SDuncan P. N. Exon Smith ASSERT_TRUE(F->arg_begin() != F->arg_end());
883441ffe9SDuncan P. N. Exon Smith Argument &X = *F->arg_begin();
893441ffe9SDuncan P. N. Exon Smith ASSERT_EQ("x", X.getName());
903441ffe9SDuncan P. N. Exon Smith
913441ffe9SDuncan P. N. Exon Smith X.sortUseList([](const Use &L, const Use &R) {
923441ffe9SDuncan P. N. Exon Smith return L.getUser()->getName() < R.getUser()->getName();
933441ffe9SDuncan P. N. Exon Smith });
943441ffe9SDuncan P. N. Exon Smith unsigned I = 0;
953441ffe9SDuncan P. N. Exon Smith for (User *U : X.users()) {
96af09f22cSBenjamin Kramer format("v%u", I++).snprint(vnbuf, sizeof(vnbuf));
973441ffe9SDuncan P. N. Exon Smith EXPECT_EQ(vnbuf, U->getName());
983441ffe9SDuncan P. N. Exon Smith }
993441ffe9SDuncan P. N. Exon Smith ASSERT_EQ(8u, I);
1003441ffe9SDuncan P. N. Exon Smith
1013441ffe9SDuncan P. N. Exon Smith X.reverseUseList();
1023441ffe9SDuncan P. N. Exon Smith I = 0;
1033441ffe9SDuncan P. N. Exon Smith for (User *U : X.users()) {
104af09f22cSBenjamin Kramer format("v%u", (7 - I++)).snprint(vnbuf, sizeof(vnbuf));
1053441ffe9SDuncan P. N. Exon Smith EXPECT_EQ(vnbuf, U->getName());
1063441ffe9SDuncan P. N. Exon Smith }
1073441ffe9SDuncan P. N. Exon Smith ASSERT_EQ(8u, I);
1083441ffe9SDuncan P. N. Exon Smith }
1093441ffe9SDuncan P. N. Exon Smith
1101698de28SDuncan P. N. Exon Smith } // end anonymous namespace
111