From 6bb09d96a05f9cfab4b0ef4a2b834d6ff4e6caa5 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 27 Jun 2001 23:31:34 +0000 Subject: [PATCH] Add instructions to fold unary and binary instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@87 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ConstantHandling.h | 32 ++++++++++++++++++++++++++++++++ lib/VMCore/ConstantFold.h | 32 ++++++++++++++++++++++++++++++++ lib/VMCore/ConstantFolding.h | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) diff --git a/include/llvm/ConstantHandling.h b/include/llvm/ConstantHandling.h index 3227e3995f6..4facdc38e1f 100644 --- a/include/llvm/ConstantHandling.h +++ b/include/llvm/ConstantHandling.h @@ -36,6 +36,7 @@ #define LLVM_OPT_CONSTANTHANDLING_H #include "llvm/ConstPoolVals.h" +#include "llvm/Instruction.h" #include "llvm/Type.h" //===----------------------------------------------------------------------===// @@ -142,4 +143,35 @@ inline ConstPoolBool *operator<=(const ConstPoolVal &V1, return Result; // !(V1 > V2) } + +//===----------------------------------------------------------------------===// +// Implement higher level instruction folding type instructions +//===----------------------------------------------------------------------===// + +inline ConstPoolVal *ConstantFoldUnaryInstruction(unsigned Opcode, + ConstPoolVal *V) { + switch (Opcode) { + case Instruction::Not: return !*V; + case Instruction::Neg: return -*V; + } + return 0; +} + +inline ConstPoolVal *ConstantFoldBinaryInstruction(unsigned Opcode, + ConstPoolVal *V1, + ConstPoolVal *V2) { + switch (Opcode) { + case Instruction::Add: return *V1 + *V2; + case Instruction::Sub: return *V1 - *V2; + + case Instruction::SetEQ: return *V1 == *V2; + case Instruction::SetNE: return *V1 != *V2; + case Instruction::SetLE: return *V1 <= *V2; + case Instruction::SetGE: return *V1 >= *V2; + case Instruction::SetLT: return *V1 < *V2; + case Instruction::SetGT: return *V1 > *V2; + } + return 0; +} + #endif diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index 3227e3995f6..4facdc38e1f 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -36,6 +36,7 @@ #define LLVM_OPT_CONSTANTHANDLING_H #include "llvm/ConstPoolVals.h" +#include "llvm/Instruction.h" #include "llvm/Type.h" //===----------------------------------------------------------------------===// @@ -142,4 +143,35 @@ inline ConstPoolBool *operator<=(const ConstPoolVal &V1, return Result; // !(V1 > V2) } + +//===----------------------------------------------------------------------===// +// Implement higher level instruction folding type instructions +//===----------------------------------------------------------------------===// + +inline ConstPoolVal *ConstantFoldUnaryInstruction(unsigned Opcode, + ConstPoolVal *V) { + switch (Opcode) { + case Instruction::Not: return !*V; + case Instruction::Neg: return -*V; + } + return 0; +} + +inline ConstPoolVal *ConstantFoldBinaryInstruction(unsigned Opcode, + ConstPoolVal *V1, + ConstPoolVal *V2) { + switch (Opcode) { + case Instruction::Add: return *V1 + *V2; + case Instruction::Sub: return *V1 - *V2; + + case Instruction::SetEQ: return *V1 == *V2; + case Instruction::SetNE: return *V1 != *V2; + case Instruction::SetLE: return *V1 <= *V2; + case Instruction::SetGE: return *V1 >= *V2; + case Instruction::SetLT: return *V1 < *V2; + case Instruction::SetGT: return *V1 > *V2; + } + return 0; +} + #endif diff --git a/lib/VMCore/ConstantFolding.h b/lib/VMCore/ConstantFolding.h index 3227e3995f6..4facdc38e1f 100644 --- a/lib/VMCore/ConstantFolding.h +++ b/lib/VMCore/ConstantFolding.h @@ -36,6 +36,7 @@ #define LLVM_OPT_CONSTANTHANDLING_H #include "llvm/ConstPoolVals.h" +#include "llvm/Instruction.h" #include "llvm/Type.h" //===----------------------------------------------------------------------===// @@ -142,4 +143,35 @@ inline ConstPoolBool *operator<=(const ConstPoolVal &V1, return Result; // !(V1 > V2) } + +//===----------------------------------------------------------------------===// +// Implement higher level instruction folding type instructions +//===----------------------------------------------------------------------===// + +inline ConstPoolVal *ConstantFoldUnaryInstruction(unsigned Opcode, + ConstPoolVal *V) { + switch (Opcode) { + case Instruction::Not: return !*V; + case Instruction::Neg: return -*V; + } + return 0; +} + +inline ConstPoolVal *ConstantFoldBinaryInstruction(unsigned Opcode, + ConstPoolVal *V1, + ConstPoolVal *V2) { + switch (Opcode) { + case Instruction::Add: return *V1 + *V2; + case Instruction::Sub: return *V1 - *V2; + + case Instruction::SetEQ: return *V1 == *V2; + case Instruction::SetNE: return *V1 != *V2; + case Instruction::SetLE: return *V1 <= *V2; + case Instruction::SetGE: return *V1 >= *V2; + case Instruction::SetLT: return *V1 < *V2; + case Instruction::SetGT: return *V1 > *V2; + } + return 0; +} + #endif -- 2.34.1