For better or worse, load from i1 is assumed to be zero extended. Do not
authorChris Lattner <sabre@nondot.org>
Mon, 27 Nov 2006 04:40:53 +0000 (04:40 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 27 Nov 2006 04:40:53 +0000 (04:40 +0000)
form a load from i1 from larger loads that may not be zext'd.

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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index 44990690b5dc96d11a8575b4c2d125897ece9ae3..99de15c9363a7dcb7e05be0578fbae542088ae1e 100644 (file)
@@ -2192,7 +2192,12 @@ SDOperand DAGCombiner::visitTRUNCATE(SDNode *N) {
       return N0.getOperand(0);
   }
   // fold (truncate (load x)) -> (smaller load x)
-  if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse()) {
+  if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse() &&
+      // Do not allow folding to i1 here.  i1 is implicitly stored in memory in
+      // zero extended form: by shrinking the load, we lose track of the fact
+      // that it is already zero extended.
+      // FIXME: This should be reevaluated.
+      VT != MVT::i1) {
     assert(MVT::getSizeInBits(N0.getValueType()) > MVT::getSizeInBits(VT) &&
            "Cannot truncate to larger type!");
     LoadSDNode *LN0 = cast<LoadSDNode>(N0);