From bdc75089ab4ae9f67d97fa1653a577cb2217036f Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Sat, 3 Mar 2007 16:33:33 +0000 Subject: [PATCH] Make sure that when we store a value it is masked to its correct bit 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index f7e25187dda..eeefaa27e99 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -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(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) { -- 2.34.1