make instcombine only rewrite a chain of computation
authorChris Lattner <sabre@nondot.org>
Sat, 7 Nov 2009 19:11:46 +0000 (19:11 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 7 Nov 2009 19:11:46 +0000 (19:11 +0000)
(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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86398 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 9d179aea67e458a815790c7db5c9972dd5747387..74d0971b422baf54834f4c2188f9fe95ce6d26db 100644 (file)
@@ -8289,23 +8289,6 @@ Instruction *InstCombiner::commonPointerCastTransforms(CastInst &CI) {
   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 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) {
   // 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 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) {
       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.
index a49829af2ee8d046bda65fcc6da1d15f672a83d5..87c2b75d2499a7f6413f818e52928f346872aaff 100644 (file)
@@ -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]
index 9bc539ed8b23a73b6ab05ff66c0e6cca1e7916d0..85e7a4fca93ebf30213ba8cdc1b06f0a9acce64e 100644 (file)
@@ -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]
index fcb7e2301d7f2253a2765c97480df75b5788b269..dac8c8b128d9a2a295c0dbcf969b8caa2cbd5789 100644 (file)
@@ -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
index 611ded473efea024cc2bc371a9091776e68fc09b..893440424c4c9a633385a85207e3b0183794616a 100644 (file)
@@ -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) {
index 56877e30f9cf3f56a751f3c4da34575423c71e34..9983944df8d722b8ddf04f988ce5ac99f544bb6d 100644 (file)
@@ -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