[llvm-commits] Div->[USF]Div Patch, Attempt #2

Chris Lattner clattner at apple.com
Wed Oct 25 21:03:22 PDT 2006


On Oct 25, 2006, at 12:15 PM, Reid Spencer wrote:

> Attached are two patch files to replace the DIV instruction with 3
> instructions: SDiv, UDiv, FDiv. The first file patches llvm. The  
> second
> file patches llvm-gcc4.
>
> This is the 2nd attempt to provide the patch.  All comments are  
> welcome.

This patch is *far* improved over the last one.  Nit picky stuff  
below.  Please make these changes, but there is no need to repost  
these diffs for review.


llvm part, without instcombine:

+// This function is used to obtain the correct opcode for an  
instruction when
+// an obsolete opcode is encountered. The OI parameter (OpcodeInfo)  
has both
+// an opcode and an "obsolete" flag. These are generated by the  
lexer and
+// the "obsolete" member will be true when the lexer encounters the  
token for
+// an obsolete opcode. For example, "div" was replaced by [usf]div  
but we need
+// to maintain backwards compatibility for asm files that still have  
the "div"
+// instruction. This function handles converting div -> [usf]div  
appropriately.
+static void
+sanitizeOpCode(OpcodeInfo<Instruction::BinaryOps> &OI, const  
PATypeHolder& PATy)
+{

Please convert this to a doxygen comment.  Please change the second  
argument to "const Type *Ty".



Bytecode/Reader.cpp:

+  // If this is a bytecode format that did not include the unreachable
+  // instruction, bump up the opcode number to adjust it.
+  if (hasNoUnreachableInst) {
+    if (Opcode >= Instruction::Unreachable &&
+        Opcode < 62) { // 62
+      ++Opcode;
+    }
+  }

What is the "// 62" comment?



+    case 11: // Rem
+      // As with "Div", make the signed/unsigned Rem instruction  
choice based
+      // on the type of the instruction.
+      if (ArgVec[0]->getType()->isFloatingPoint())
+        Opcode = Instruction::Rem;
+      else if (ArgVec[0]->getType()->isSigned())
+        Opcode = Instruction::Rem;
+      else
+        Opcode = Instruction::Rem;

Heh, so forward looking :), no need to change it.


+  // In version 5 and prior, the integer types were distinguished by  
sign.
+  // That is we have UIntTy and IntTy as well as ConstantSInt and
+  // ConstantUInt. In version 6, the integer types became signless  
so we
+  // need to note that we have signed integer types in prior versions.
+  bool hasSignedIntegers;

This is set but never checked, please remove it.


diff -t -d -u -p -5 -r1.94 ConstantFolding.cpp
--- lib/VMCore/ConstantFolding.cpp	20 Oct 2006 07:07:24 -0000	1.94
+++ lib/VMCore/ConstantFolding.cpp	25 Oct 2006 18:51:19 -0000
@@ -38,11 +38,13 @@ namespace {

...

+  static Constant *UDiv(const ConstantInt *V1, const ConstantInt *V2) {
+    if (V2->isNullValue())
+      return 0;
      if (V2->isAllOnesValue() &&              // MIN_INT / -1
          (BuiltinType)V1->getZExtValue() == -(BuiltinType)V1- 
 >getZExtValue())
        return 0;
+    BuiltinType R = (BuiltinType)(V1->getZExtValue() / V2- 
 >getZExtValue());
+    return ConstantInt::get(*Ty, R);
+  }


This check:
      if (V2->isAllOnesValue() &&              // MIN_INT / -1
          (BuiltinType)V1->getZExtValue() == -(BuiltinType)V1- 
 >getZExtValue())
        return 0;

Is not needed in the udiv case, it is over-conservative (yes, the  
original code was over-conservative in the same way).


-Chris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20061025/7e1a4b99/attachment.html>


More information about the llvm-commits mailing list