Add the padding needed for variable-size alloca's, which should work now.
authorVikram S. Adve <vadve@cs.uiuc.edu>
Mon, 23 Jun 2003 02:13:57 +0000 (02:13 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Mon, 23 Jun 2003 02:13:57 +0000 (02:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6859 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9InstrSelection.cpp

index e5ea7e82b2ddc70646cce75df63454c70ee1944f..6576ef96cec4175b7026007b2eee504ee62717b3 100644 (file)
@@ -1051,19 +1051,27 @@ CreateCodeForVariableSizeAlloca(const TargetMachine& target,
     Value* tsizeVal = ConstantSInt::get(Type::IntTy, tsize);
 
     // Create temporary values to hold the result of MUL, SLL, SRL
-    // THIS CASE IS INCOMPLETE AND WILL BE FIXED SHORTLY.
+    // To pad `size' to next smallest multiple of 16:
+    //          size = (size + 15) & (-16 = 0xfffffffffffffff0)
+    // 
     TmpInstruction* tmpProd = new TmpInstruction(mcfi,numElementsVal, tsizeVal);
-    TmpInstruction* tmpSLL  = new TmpInstruction(mcfi,numElementsVal, tmpProd);
-    TmpInstruction* tmpSRL  = new TmpInstruction(mcfi,numElementsVal, tmpSLL);
+    TmpInstruction* tmpAdd15= new TmpInstruction(mcfi,numElementsVal, tmpProd);
+    TmpInstruction* tmpAndf0= new TmpInstruction(mcfi,numElementsVal, tmpAdd15);
 
     // Instruction 1: mul numElements, typeSize -> tmpProd
     // This will optimize the MUL as far as possible.
-    CreateMulInstruction(target, F, numElementsVal, tsizeVal, tmpProd,getMvec,
+    CreateMulInstruction(target, F, numElementsVal, tsizeVal, tmpProd, getMvec,
                          mcfi, INVALID_MACHINE_OPCODE);
 
-    assert(0 && "Need to insert padding instructions here!");
+    // Instruction 2: andn tmpProd, 0x0f -> tmpAndn
+    getMvec.push_back(BuildMI(V9::ADDi, 3).addReg(tmpProd).addSImm(15)
+                      .addReg(tmpAdd15, MOTy::Def));
+
+    // Instruction 3: add tmpAndn, 0x10 -> tmpAdd16
+    getMvec.push_back(BuildMI(V9::ANDi, 3).addReg(tmpAdd15).addSImm(-16)
+                      .addReg(tmpAndf0, MOTy::Def));
 
-    totalSizeVal = tmpProd;
+    totalSizeVal = tmpAndf0;
   }
 
   // Get the constant offset from SP for dynamically allocated storage