brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 2272cfc Raw
89 lines · cpp
1//===- IntrinsicInstTest.cpp ----------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/SandboxIR/IntrinsicInst.h"10#include "llvm/AsmParser/Parser.h"11#include "llvm/IR/BasicBlock.h"12#include "llvm/IR/Function.h"13#include "llvm/IR/Instruction.h"14#include "llvm/IR/IntrinsicInst.h"15#include "llvm/IR/Value.h"16#include "llvm/SandboxIR/Context.h"17#include "llvm/SandboxIR/Function.h"18#include "llvm/Support/SourceMgr.h"19#include "gtest/gtest.h"20 21using namespace llvm;22 23struct IntrinsicInstTest : public testing::Test {24  LLVMContext C;25  std::unique_ptr<Module> M;26 27  void parseIR(LLVMContext &C, const char *IR) {28    SMDiagnostic Err;29    M = parseAssemblyString(IR, Err, C);30    if (!M)31      Err.print("SandboxIRTest", errs());32  }33  BasicBlock *getBasicBlockByName(Function &F, StringRef Name) {34    for (BasicBlock &BB : F)35      if (BB.getName() == Name)36        return &BB;37    llvm_unreachable("Expected to find basic block!");38  }39};40 41TEST_F(IntrinsicInstTest, Basic) {42  parseIR(C, R"IR(43declare void @llvm.sideeffect()44declare void @llvm.assume(i1)45declare i8 @llvm.uadd.sat.i8(i8, i8)46declare i8 @llvm.smax.i8(i8, i8)47 48define void @foo(i8 %v1, i1 %cond) {49  call void @llvm.sideeffect()50  call void @llvm.assume(i1 %cond)51  call i8 @llvm.uadd.sat.i8(i8 %v1, i8 %v1)52  call i8 @llvm.smax.i8(i8 %v1, i8 %v1)53  ret void54}55)IR");56 57  llvm::Function *LLVMF = &*M->getFunction("foo");58  auto *LLVMBB = &*LLVMF->begin();59  auto LLVMIt = LLVMBB->begin();60 61  sandboxir::Context Ctx(C);62  sandboxir::Function *F = Ctx.createFunction(LLVMF);63  auto *BB = &*F->begin();64  auto It = BB->begin();65  auto ItE = BB->getTerminator()->getIterator();66  for (; It != ItE; ++It, ++LLVMIt) {67    auto *I = &*It;68    auto *LLVMI = &*LLVMIt;69    // Check classof().70    EXPECT_TRUE(isa<sandboxir::IntrinsicInst>(I));71    // Check getIntrinsicID().72    EXPECT_EQ(cast<sandboxir::IntrinsicInst>(I)->getIntrinsicID(),73              cast<llvm::IntrinsicInst>(LLVMI)->getIntrinsicID());74    // Check isAssociative().75    EXPECT_EQ(cast<sandboxir::IntrinsicInst>(I)->isAssociative(),76              cast<llvm::IntrinsicInst>(LLVMI)->isAssociative());77    // Check isCommutative().78    EXPECT_EQ(cast<sandboxir::IntrinsicInst>(I)->isCommutative(),79              cast<llvm::IntrinsicInst>(LLVMI)->isCommutative());80    // Check isAssumeLikeIntrinsic().81    EXPECT_EQ(cast<sandboxir::IntrinsicInst>(I)->isAssumeLikeIntrinsic(),82              cast<llvm::IntrinsicInst>(LLVMI)->isAssumeLikeIntrinsic());83    // Check mayLowerToFunctionCall().84    auto ID = cast<sandboxir::IntrinsicInst>(I)->getIntrinsicID();85    EXPECT_EQ(sandboxir::IntrinsicInst::mayLowerToFunctionCall(ID),86              llvm::IntrinsicInst::mayLowerToFunctionCall(ID));87  }88}89