[llvm-commits] [llvm] r86398 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/2008-01-21-MulTrunc.ll test/Transforms/InstCombine/apint-cast.ll test/Transforms/InstCombine/cast-mul-select.ll test/Transforms/InstCombine/cast-set.ll test/Transforms/InstCombine/udivrem-change-width.ll

Chris Lattner sabre at nondot.org
Sat Nov 7 11:11:46 PST 2009


Author: lattner
Date: Sat Nov  7 13:11:46 2009
New Revision: 86398

URL: http://llvm.org/viewvc/llvm-project?rev=86398&view=rev
Log:
make instcombine only rewrite a chain of computation 
(eliminating some extends) if the new type of the
computation is legal or if both the source and dest
are illegal.  This prevents instcombine from changing big
chains of computation into i64 on 32-bit targets for 
example.

Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
    llvm/trunk/test/Transforms/InstCombine/2008-01-21-MulTrunc.ll
    llvm/trunk/test/Transforms/InstCombine/apint-cast.ll
    llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll
    llvm/trunk/test/Transforms/InstCombine/cast-set.ll
    llvm/trunk/test/Transforms/InstCombine/udivrem-change-width.ll

Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=86398&r1=86397&r2=86398&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sat Nov  7 13:11:46 2009
@@ -8289,23 +8289,6 @@
   return commonCastTransforms(CI);
 }
 
-/// isSafeIntegerType - Return true if this is a basic integer type, not a crazy
-/// type like i42.  We don't want to introduce operations on random non-legal
-/// integer types where they don't already exist in the code.  In the future,
-/// we should consider making this based off target-data, so that 32-bit targets
-/// won't get i64 operations etc.
-static bool isSafeIntegerType(const Type *Ty) {
-  switch (Ty->getPrimitiveSizeInBits()) {
-  case 8:
-  case 16:
-  case 32:
-  case 64:
-    return true;
-  default: 
-    return false;
-  }
-}
-
 /// commonIntCastTransforms - This function implements the common transforms
 /// for trunc, zext, and sext.
 Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) {
@@ -8334,8 +8317,10 @@
   // Only do this if the dest type is a simple type, don't convert the
   // expression tree to something weird like i93 unless the source is also
   // strange.
-  if ((isSafeIntegerType(DestTy->getScalarType()) ||
-       !isSafeIntegerType(SrcI->getType()->getScalarType())) &&
+  if (TD &&
+      (TD->isLegalInteger(DestTy->getScalarType()->getPrimitiveSizeInBits()) ||
+       !TD->isLegalInteger((SrcI->getType()->getScalarType()
+                            ->getPrimitiveSizeInBits()))) &&
       CanEvaluateInDifferentType(SrcI, DestTy,
                                  CI.getOpcode(), NumCastsRemoved)) {
     // If this cast is a truncate, evaluting in a different type always
@@ -8356,6 +8341,7 @@
       break;
     case Instruction::ZExt: {
       DoXForm = NumCastsRemoved >= 1;
+      
       if (!DoXForm && 0) {
         // If it's unnecessary to issue an AND to clear the high bits, it's
         // always profitable to do this xform.

Modified: llvm/trunk/test/Transforms/InstCombine/2008-01-21-MulTrunc.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-01-21-MulTrunc.ll?rev=86398&r1=86397&r2=86398&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2008-01-21-MulTrunc.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/2008-01-21-MulTrunc.ll Sat Nov  7 13:11:46 2009
@@ -1,5 +1,7 @@
 ; RUN: opt < %s -instcombine -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"
+
 define i16 @test1(i16 %a) {
         %tmp = zext i16 %a to i32               ; <i32> [#uses=2]
         %tmp21 = lshr i32 %tmp, 8               ; <i32> [#uses=1]

Modified: llvm/trunk/test/Transforms/InstCombine/apint-cast.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/apint-cast.ll?rev=86398&r1=86397&r2=86398&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/apint-cast.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/apint-cast.ll Sat Nov  7 13:11:46 2009
@@ -1,6 +1,8 @@
 ; Tests to make sure elimination of casts is working correctly
 ; RUN: opt < %s -instcombine -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"
+
 define i17 @test1(i17 %a) {
         %tmp = zext i17 %a to i37               ; <i37> [#uses=2]
         %tmp21 = lshr i37 %tmp, 8               ; <i37> [#uses=1]

Modified: llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll?rev=86398&r1=86397&r2=86398&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll Sat Nov  7 13:11:46 2009
@@ -1,5 +1,7 @@
 ; RUN: opt < %s -instcombine -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"
+
 define i32 @mul(i32 %x, i32 %y) {
   %A = trunc i32 %x to i8
   %B = trunc i32 %y to i8

Modified: llvm/trunk/test/Transforms/InstCombine/cast-set.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/cast-set.ll?rev=86398&r1=86397&r2=86398&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/cast-set.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/cast-set.ll Sat Nov  7 13:11:46 2009
@@ -1,6 +1,8 @@
 ; This tests for various complex cast elimination cases instcombine should
 ; handle.
 
+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"
+
 ; RUN: opt < %s -instcombine -S | FileCheck %s
 
 define i1 @test1(i32 %X) {

Modified: llvm/trunk/test/Transforms/InstCombine/udivrem-change-width.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/udivrem-change-width.ll?rev=86398&r1=86397&r2=86398&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/udivrem-change-width.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/udivrem-change-width.ll Sat Nov  7 13:11:46 2009
@@ -1,6 +1,8 @@
 ; RUN: opt < %s -instcombine -S | not grep zext
 ; PR4548
 
+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"
+
 define i8 @udiv_i8(i8 %a, i8 %b) nounwind {
   %conv = zext i8 %a to i32       
   %conv2 = zext i8 %b to i32      





More information about the llvm-commits mailing list