diff --git a/lib/Target/X86/InstSelectPattern.cpp b/lib/Target/X86/InstSelectPattern.cpp
index 680cc8f..74f540a 100644
--- a/lib/Target/X86/InstSelectPattern.cpp
+++ b/lib/Target/X86/InstSelectPattern.cpp
@@ -21,12 +21,6 @@
 // Include the generated instruction selector...
 #include "X86GenInstrSelector.inc"
 
-
-//===----------------------------------------------------------------------===//
-//  User code
-//
-
-
 namespace {
   struct ISel : public FunctionPass, SelectionDAGTargetBuilder {
     TargetMachine &TM;
@@ -49,12 +43,14 @@
   public:  // Implementation of the SelectionDAGTargetBuilder class...
     /// expandArguments - Add nodes to the DAG to indicate how to load arguments
     /// off of the X86 stack.
-    void expandArguments(SelectionDAG &SD, MachineFunction &MF);
+    void expandArguments(SelectionDAG &SD);
+    void expandCall(SelectionDAG &SD, CallInst &CI);
   };
 }
 
 
-void ISel::expandArguments(SelectionDAG &SD, MachineFunction &F) {
+void ISel::expandArguments(SelectionDAG &SD) {
+
   // Add DAG nodes to load the arguments...  On entry to a function on the X86,
   // the stack frame looks like this:
   //
@@ -63,10 +59,11 @@
   // [ESP + 8] -- second argument, if first argument is four bytes in size
   //    ... 
   //
-  unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
+  MachineFunction &F = SD.getMachineFunction();
   MachineFrameInfo *MFI = F.getFrameInfo();
   const Function &Fn = *F.getFunction();
   
+  unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
   for (Function::const_aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) {
     MVT::ValueType ObjectVT = SD.getValueType(I->getType());
     unsigned ArgIncrement = 4;
@@ -84,7 +81,6 @@
     int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
     
     // Create the SelectionDAG nodes corresponding to a load from this parameter
-    // FIXME:
     SelectionDAGNode *FIN = new SelectionDAGNode(ISD::FrameIndex, MVT::i32);
     FIN->addValue(new ReducedValue_FrameIndex_i32(FI));
 
@@ -107,6 +103,10 @@
     VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset);
 }
 
+void ISel::expandCall(SelectionDAG &SD, CallInst &CI) {
+  assert(0 && "ISel::expandCall not implemented!");
+}
+
 
 /// createX86PatternInstructionSelector - This pass converts an LLVM function
 /// into a machine code representation using pattern matching and a machine
diff --git a/lib/Target/X86/X86ISelPattern.cpp b/lib/Target/X86/X86ISelPattern.cpp
index 680cc8f..74f540a 100644
--- a/lib/Target/X86/X86ISelPattern.cpp
+++ b/lib/Target/X86/X86ISelPattern.cpp
@@ -21,12 +21,6 @@
 // Include the generated instruction selector...
 #include "X86GenInstrSelector.inc"
 
-
-//===----------------------------------------------------------------------===//
-//  User code
-//
-
-
 namespace {
   struct ISel : public FunctionPass, SelectionDAGTargetBuilder {
     TargetMachine &TM;
@@ -49,12 +43,14 @@
   public:  // Implementation of the SelectionDAGTargetBuilder class...
     /// expandArguments - Add nodes to the DAG to indicate how to load arguments
     /// off of the X86 stack.
-    void expandArguments(SelectionDAG &SD, MachineFunction &MF);
+    void expandArguments(SelectionDAG &SD);
+    void expandCall(SelectionDAG &SD, CallInst &CI);
   };
 }
 
 
-void ISel::expandArguments(SelectionDAG &SD, MachineFunction &F) {
+void ISel::expandArguments(SelectionDAG &SD) {
+
   // Add DAG nodes to load the arguments...  On entry to a function on the X86,
   // the stack frame looks like this:
   //
@@ -63,10 +59,11 @@
   // [ESP + 8] -- second argument, if first argument is four bytes in size
   //    ... 
   //
-  unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
+  MachineFunction &F = SD.getMachineFunction();
   MachineFrameInfo *MFI = F.getFrameInfo();
   const Function &Fn = *F.getFunction();
   
+  unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
   for (Function::const_aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) {
     MVT::ValueType ObjectVT = SD.getValueType(I->getType());
     unsigned ArgIncrement = 4;
@@ -84,7 +81,6 @@
     int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
     
     // Create the SelectionDAG nodes corresponding to a load from this parameter
-    // FIXME:
     SelectionDAGNode *FIN = new SelectionDAGNode(ISD::FrameIndex, MVT::i32);
     FIN->addValue(new ReducedValue_FrameIndex_i32(FI));
 
@@ -107,6 +103,10 @@
     VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset);
 }
 
+void ISel::expandCall(SelectionDAG &SD, CallInst &CI) {
+  assert(0 && "ISel::expandCall not implemented!");
+}
+
 
 /// createX86PatternInstructionSelector - This pass converts an LLVM function
 /// into a machine code representation using pattern matching and a machine
