implement constant expr. sub ptr ptr

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52049 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index be9eaad..58b1884 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -447,9 +447,19 @@
       // int - int
       return llvm::ConstantExpr::getSub(LHS, RHS);
     }
-    
-    assert(0 && "Unhandled bin sub case!");
-    return 0;
+
+    assert(isa<llvm::PointerType>(LHS->getType()));
+
+    const llvm::Type *ResultType = ConvertType(E->getType());
+    const QualType Type = E->getLHS()->getType();
+    const QualType ElementType = Type->getAsPointerType()->getPointeeType();
+
+    LHS = llvm::ConstantExpr::getPtrToInt(LHS, ResultType);
+    RHS = llvm::ConstantExpr::getPtrToInt(RHS, ResultType);
+
+    llvm::Constant *sub = llvm::ConstantExpr::getSub(LHS, RHS);
+    llvm::Constant *size = EmitSizeAlignOf(ElementType, E->getType(), true);
+    return llvm::ConstantExpr::getSDiv(sub, size);
   }
     
   llvm::Constant *VisitBinShl(const BinaryOperator *E) {