[llvm-commits] [llvm-gcc-4.0] r41980 - /llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp

Chris Lattner sabre at nondot.org
Fri Sep 14 22:47:05 PDT 2007


Author: lattner
Date: Sat Sep 15 00:47:04 2007
New Revision: 41980

URL: http://llvm.org/viewvc/llvm-project?rev=41980&view=rev
Log:
Fix PR1662 by handling pointer NEGATE_EXPR.

Modified:
    llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp?rev=41980&r1=41979&r2=41980&view=diff

==============================================================================
--- llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp Sat Sep 15 00:47:04 2007
@@ -3156,8 +3156,17 @@
 }
 
 Value *TreeToLLVM::EmitNEGATE_EXPR(tree exp, Value *DestLoc) {
-  if (!DestLoc)
-    return Builder.CreateNeg(Emit(TREE_OPERAND(exp, 0), 0), "tmp");
+  if (!DestLoc) {
+    Value *V = Emit(TREE_OPERAND(exp, 0), 0);
+    if (!isa<PointerType>(V->getType()))
+      return Builder.CreateNeg(V, "tmp");
+    
+    // GCC allows NEGATE_EXPR on pointers as well.  Cast to int, negate, cast
+    // back.
+    V = CastToAnyType(V, false, TD.getIntPtrType(), false);
+    V = Builder.CreateNeg(V, "tmp");
+    return CastToType(Instruction::IntToPtr, V, ConvertType(TREE_TYPE(exp)));
+  }
   
   // Emit the operand to a temporary.
   const Type *ComplexTy=cast<PointerType>(DestLoc->getType())->getElementType();





More information about the llvm-commits mailing list