For PR1280:
authorReid Spencer <rspencer@reidspencer.com>
Wed, 28 Mar 2007 01:36:16 +0000 (01:36 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Wed, 28 Mar 2007 01:36:16 +0000 (01:36 +0000)
When converting an add/xor/and triplet into a trunc/sext, only do so if the
intermediate integer type is a bitwidth that the targets can handle.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 7a868d82a859e6f48d77091d380d3bbc8fee88a6..ce9dab9a51fae57602856884315265035fca4f78 100644 (file)
@@ -1940,11 +1940,21 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
         CFF80Val = APIntOps::ashr(CFF80Val, Size);
       } while (Size >= 1);
       
-      if (Size) {
-        const Type *MiddleType = IntegerType::get(Size);
+      // FIXME: This shouldn't be necessary. When the backends can handle types
+      // with funny bit widths then this whole cascade of if statements should
+      // be removed. It is just here to get the size of the "middle" type back
+      // up to something that the back ends can handle.
+      const Type *MiddleType = 0;
+      switch (Size) {
+        default: break;
+        case 32: MiddleType = Type::Int32Ty; break;
+        case 16: MiddleType = Type::Int16Ty; break;
+        case  8: MiddleType = Type::Int8Ty; break;
+      }
+      if (MiddleType) {
         Instruction *NewTrunc = new TruncInst(XorLHS, MiddleType, "sext");
         InsertNewInstBefore(NewTrunc, I);
-        return new SExtInst(NewTrunc, I.getType());
+        return new SExtInst(NewTrunc, I.getType(), I.getName());
       }
     }
   }