[llvm-commits] [llvm] r149151 - in /llvm/trunk: include/llvm/ADT/APInt.h lib/Analysis/ConstantFolding.cpp lib/Support/APInt.cpp test/CodeGen/X86/constant-pool-sharing.ll test/Transforms/ConstProp/basictest.ll test/Transforms/InstCombine/icmp.ll

Rafael Espindola rafael.espindola at gmail.com
Fri Jan 27 15:33:07 PST 2012


Author: rafael
Date: Fri Jan 27 17:33:07 2012
New Revision: 149151

URL: http://llvm.org/viewvc/llvm-project?rev=149151&view=rev
Log:
Add r149110 back with a fix for when the vector and the int have the same
width.

Modified:
    llvm/trunk/include/llvm/ADT/APInt.h
    llvm/trunk/lib/Analysis/ConstantFolding.cpp
    llvm/trunk/lib/Support/APInt.cpp
    llvm/trunk/test/CodeGen/X86/constant-pool-sharing.ll
    llvm/trunk/test/Transforms/ConstProp/basictest.ll
    llvm/trunk/test/Transforms/InstCombine/icmp.ll

Modified: llvm/trunk/include/llvm/ADT/APInt.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/APInt.h?rev=149151&r1=149150&r2=149151&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/APInt.h (original)
+++ llvm/trunk/include/llvm/ADT/APInt.h Fri Jan 27 17:33:07 2012
@@ -1056,6 +1056,16 @@
   /// @brief Zero extend or truncate to width
   APInt zextOrTrunc(unsigned width) const;
 
+  /// Make this APInt have the bit width given by \p width. The value is sign
+  /// extended, or left alone to make it that width.
+  /// @brief Sign extend or truncate to width
+  APInt sextOrSelf(unsigned width) const;
+
+  /// Make this APInt have the bit width given by \p width. The value is zero
+  /// extended, or left alone to make it that width.
+  /// @brief Zero extend or truncate to width
+  APInt zextOrSelf(unsigned width) const;
+
   /// @}
   /// @name Bit Manipulation Operators
   /// @{

Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=149151&r1=149150&r2=149151&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
+++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Fri Jan 27 17:33:07 2012
@@ -52,6 +52,44 @@
   if (C->isAllOnesValue() && !DestTy->isX86_MMXTy())
     return Constant::getAllOnesValue(DestTy);
 
+  // Handle a vector->integer cast.
+  if (IntegerType *IT = dyn_cast<IntegerType>(DestTy)) {
+    // FIXME: Remove ConstantVector support.
+    if ((!isa<ConstantDataVector>(C) && !isa<ConstantVector>(C)) ||
+        // TODO: Handle big endian someday.
+        !TD.isLittleEndian())
+      return ConstantExpr::getBitCast(C, DestTy);
+
+    unsigned NumSrcElts = C->getType()->getVectorNumElements();
+    
+    // If the vector is a vector of floating point, convert it to vector of int
+    // to simplify things.
+    if (C->getType()->getVectorElementType()->isFloatingPointTy()) {
+      unsigned FPWidth =
+        C->getType()->getVectorElementType()->getPrimitiveSizeInBits();
+      Type *SrcIVTy =
+        VectorType::get(IntegerType::get(C->getContext(), FPWidth), NumSrcElts);
+      // Ask VMCore to do the conversion now that #elts line up.
+      C = ConstantExpr::getBitCast(C, SrcIVTy);
+    }
+    
+    // Now that we know that the input value is a vector of integers, just shift
+    // and insert them into our result.
+    unsigned BitShift =
+      TD.getTypeAllocSizeInBits(C->getType()->getVectorElementType());
+    APInt Result(IT->getBitWidth(), 0);
+    for (unsigned i = 0; i != NumSrcElts; ++i) {
+      // FIXME: Rework when we have ConstantDataVector.
+      ConstantInt *Elt=dyn_cast_or_null<ConstantInt>(C->getAggregateElement(i));
+      if (Elt == 0)  // Elt must be a constant expr or something.
+        return ConstantExpr::getBitCast(C, DestTy);
+      
+      Result |= Elt->getValue().zextOrSelf(IT->getBitWidth()) << i*BitShift;
+    }
+   
+    return ConstantInt::get(IT, Result);
+  }
+  
   // The code below only handles casts to vectors currently.
   VectorType *DestVTy = dyn_cast<VectorType>(DestTy);
   if (DestVTy == 0)

Modified: llvm/trunk/lib/Support/APInt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APInt.cpp?rev=149151&r1=149150&r2=149151&view=diff
==============================================================================
--- llvm/trunk/lib/Support/APInt.cpp (original)
+++ llvm/trunk/lib/Support/APInt.cpp Fri Jan 27 17:33:07 2012
@@ -1123,6 +1123,18 @@
   return *this;
 }
 
+APInt APInt::zextOrSelf(unsigned width) const {
+  if (BitWidth < width)
+    return zext(width);
+  return *this;
+}
+
+APInt APInt::sextOrSelf(unsigned width) const {
+  if (BitWidth < width)
+    return sext(width);
+  return *this;
+}
+
 /// Arithmetic right-shift this APInt by shiftAmt.
 /// @brief Arithmetic right-shift function.
 APInt APInt::ashr(const APInt &shiftAmt) const {

Modified: llvm/trunk/test/CodeGen/X86/constant-pool-sharing.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/constant-pool-sharing.ll?rev=149151&r1=149150&r2=149151&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/constant-pool-sharing.ll (original)
+++ llvm/trunk/test/CodeGen/X86/constant-pool-sharing.ll Fri Jan 27 17:33:07 2012
@@ -1,6 +1,5 @@
-; RUN-disable: llc < %s -mtriple=x86_64-linux | FileCheck %s
-; RUN-disable: llc < %s -mtriple=x86_64-win32 | FileCheck %s
-; RUN: true
+; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s
 
 ; llc should share constant pool entries between this integer vector
 ; and this floating-point vector since they have the same encoding.

Modified: llvm/trunk/test/Transforms/ConstProp/basictest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ConstProp/basictest.ll?rev=149151&r1=149150&r2=149151&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ConstProp/basictest.ll (original)
+++ llvm/trunk/test/Transforms/ConstProp/basictest.ll Fri Jan 27 17:33:07 2012
@@ -1,5 +1,8 @@
 ; RUN: opt < %s -constprop -die -S | FileCheck %s
 
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.7.2"
+
 ; This is a basic sanity check for constant propagation.  The add instruction
 ; should be eliminated.
 define i32 @test1(i1 %B) {
@@ -40,3 +43,11 @@
   %C = or i1 %A, %B
   ret i1 %C
 }
+
+define i128 @vector_to_int_cast() {
+  %A = bitcast <4 x i32> <i32 1073741824, i32 1073741824, i32 1073741824, i32 1073741824> to i128
+  ret i128 %A
+; CHECK: @vector_to_int_cast
+; CHECK: ret i128 85070591750041656499021422275829170176
+}
+  
\ No newline at end of file

Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=149151&r1=149150&r2=149151&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Fri Jan 27 17:33:07 2012
@@ -121,8 +121,8 @@
   %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S
   ret i1 %B
 ; CHECK: @test12
-; CHECK-NEXT: %B = select i1
-; CHECK-NEXT: ret i1 %B
+; CHECK-NEXT: = xor i1 %A, true
+; CHECK-NEXT: ret i1
 }
 
 ; PR6481
@@ -581,12 +581,11 @@
   ret i1 %tobool
 }
 
-; test that we don't crash
 ; CHECK: @test58
+; CHECK-NEXT: call i32 @test58_d(i64 36029346783166592)
 define void @test58() nounwind {
-entry:
-  %0 = bitcast <1 x i64> <i64 36029346783166592> to i64
-  %call = call i32 @test58_d( i64 %0) nounwind
+  %cast = bitcast <1 x i64> <i64 36029346783166592> to i64
+  %call = call i32 @test58_d( i64 %cast) nounwind
   ret void
 }
 declare i32 @test58_d(i64)





More information about the llvm-commits mailing list