[llvm-commits] [llvm-gcc-4.2] r41071 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Chris Lattner
sabre at nondot.org
Tue Aug 14 08:45:40 PDT 2007
Author: lattner
Date: Tue Aug 14 10:45:39 2007
New Revision: 41071
URL: http://llvm.org/viewvc/llvm-project?rev=41071&view=rev
Log:
When building casts, constant fold with ConstantFoldInstruction instead
of ConstantExpr::getCast. This allows target-data driven constant folding
to happen. In the testcase from PR1602, for example, this results in:
%tmp26 = sub i32 %tmp232425, 1
instead of:
%tmp26 = sub i32 %tmp232425, ptrtoint (i32 (...)** inttoptr (i64 1 to i32 (...)**) to i32)
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=41071&r1=41070&r2=41071&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Aug 14 10:45:39 2007
@@ -34,6 +34,7 @@
#include "llvm/InlineAsm.h"
#include "llvm/Instructions.h"
#include "llvm/Module.h"
+#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
@@ -1045,16 +1046,26 @@
if (V->getType() == Ty)
return V;
+ // If this is a simple constant operand, fold it now. If it is a constant
+ // expr operand, fold it below.
if (Constant *C = dyn_cast<Constant>(V))
- return ConstantExpr::getCast(Instruction::CastOps(opcode), C, Ty);
+ if (!isa<ConstantExpr>(C))
+ return ConstantExpr::getCast(Instruction::CastOps(opcode), C, Ty);
// Handle 'trunc (zext i1 X to T2) to i1' as X, because this occurs all over
// the place.
if (ZExtInst *CI = dyn_cast<ZExtInst>(V))
if (Ty == Type::Int1Ty && CI->getOperand(0)->getType() == Type::Int1Ty)
return CI->getOperand(0);
- return Builder.CreateCast(Instruction::CastOps(opcode), V, Ty,
- V->getName().c_str());
+ Value *Result = Builder.CreateCast(Instruction::CastOps(opcode), V, Ty,
+ V->getNameStart());
+
+ // If this is a constantexpr, fold the instruction with
+ // ConstantFoldInstruction to allow TargetData-driven folding to occur.
+ if (isa<ConstantExpr>(V))
+ Result = ConstantFoldInstruction(cast<Instruction>(Result), &TD);
+
+ return Result;
}
/// CastToAnyType - Cast the specified value to the specified type making no
More information about the llvm-commits
mailing list