Make sure that when we store a value it is masked to its correct bit
authorReid Spencer <rspencer@reidspencer.com>
Sat, 3 Mar 2007 16:33:33 +0000 (16:33 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sat, 3 Mar 2007 16:33:33 +0000 (16:33 +0000)
width. This helps CBE work with non-standard integer bit widths.

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

lib/Target/CBackend/CBackend.cpp

index f7e25187dda25fc82bdb8b28829b091d1163cef0..eeefaa27e99f0495cc6b184a649172d94752acf9 100644 (file)
@@ -2815,7 +2815,21 @@ void CWriter::visitStoreInst(StoreInst &I) {
   writeOperand(I.getPointerOperand());
   if (I.isVolatile()) Out << ')';
   Out << " = ";
-  writeOperand(I.getOperand(0));
+  Value *Operand = I.getOperand(0);
+  Constant *BitMask = 0;
+  if (const IntegerType* ITy = dyn_cast<IntegerType>(Operand->getType()))
+    if (!ITy->isPowerOf2ByteWidth())
+      // We have a bit width that doesn't match an even power-of-2 byte
+      // size. Consequently we must & the value with the type's bit mask
+      BitMask = ConstantInt::get(ITy, ITy->getBitMask());
+  if (BitMask)
+    Out << "((";
+  writeOperand(Operand);
+  if (BitMask) {
+    Out << ") & ";
+    printConstant(BitMask);
+    Out << ")"; 
+  }
 }
 
 void CWriter::visitGetElementPtrInst(GetElementPtrInst &I) {