71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- ReplaceConstant.cpp - Replace LLVM constant expression--------------===//
 | |
| //
 | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | |
| // See https://llvm.org/LICENSE.txt for license information.
 | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file implements a utility function for replacing LLVM constant
 | |
| // expressions by instructions.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/IR/ReplaceConstant.h"
 | |
| #include "llvm/IR/IRBuilder.h"
 | |
| #include "llvm/IR/Instructions.h"
 | |
| #include "llvm/IR/NoFolder.h"
 | |
| 
 | |
| namespace llvm {
 | |
| // Replace a constant expression by instructions with equivalent operations at
 | |
| // a specified location.
 | |
| Instruction *createReplacementInstr(ConstantExpr *CE, Instruction *Instr) {
 | |
|   IRBuilder<NoFolder> Builder(Instr);
 | |
|   unsigned OpCode = CE->getOpcode();
 | |
|   switch (OpCode) {
 | |
|   case Instruction::GetElementPtr: {
 | |
|     SmallVector<Value *, 4> CEOpVec(CE->operands());
 | |
|     ArrayRef<Value *> CEOps(CEOpVec);
 | |
|     return dyn_cast<Instruction>(
 | |
|         Builder.CreateInBoundsGEP(cast<GEPOperator>(CE)->getSourceElementType(),
 | |
|                                   CEOps[0], CEOps.slice(1)));
 | |
|   }
 | |
|   case Instruction::Add:
 | |
|   case Instruction::Sub:
 | |
|   case Instruction::Mul:
 | |
|   case Instruction::UDiv:
 | |
|   case Instruction::SDiv:
 | |
|   case Instruction::FDiv:
 | |
|   case Instruction::URem:
 | |
|   case Instruction::SRem:
 | |
|   case Instruction::FRem:
 | |
|   case Instruction::Shl:
 | |
|   case Instruction::LShr:
 | |
|   case Instruction::AShr:
 | |
|   case Instruction::And:
 | |
|   case Instruction::Or:
 | |
|   case Instruction::Xor:
 | |
|     return dyn_cast<Instruction>(
 | |
|         Builder.CreateBinOp((Instruction::BinaryOps)OpCode, CE->getOperand(0),
 | |
|                             CE->getOperand(1), CE->getName()));
 | |
|   case Instruction::Trunc:
 | |
|   case Instruction::ZExt:
 | |
|   case Instruction::SExt:
 | |
|   case Instruction::FPToUI:
 | |
|   case Instruction::FPToSI:
 | |
|   case Instruction::UIToFP:
 | |
|   case Instruction::SIToFP:
 | |
|   case Instruction::FPTrunc:
 | |
|   case Instruction::FPExt:
 | |
|   case Instruction::PtrToInt:
 | |
|   case Instruction::IntToPtr:
 | |
|   case Instruction::BitCast:
 | |
|     return dyn_cast<Instruction>(
 | |
|         Builder.CreateCast((Instruction::CastOps)OpCode, CE->getOperand(0),
 | |
|                            CE->getType(), CE->getName()));
 | |
|   default:
 | |
|     llvm_unreachable("Unhandled constant expression!\n");
 | |
|   }
 | |
| }
 | |
| } // namespace llvm
 |