diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp
index 0f6c69c79b0..faa090718b9 100644
--- a/lib/Target/X86/X86Subtarget.cpp
+++ b/lib/Target/X86/X86Subtarget.cpp
@@ -22,11 +22,10 @@ static void GetCpuIDAndInfo(unsigned value, unsigned *EAX, unsigned *EBX,
 #if defined(__GNUC__)
   asm ("pushl\t%%ebx\n\t"
        "cpuid\n\t"
+       "movl\t%%ebx, %%esi\n\t"
        "popl\t%%ebx"
        : "=a" (*EAX),
-#if !defined(__DYNAMIC__)  // This works around a gcc -fPIC bug
-         "=b" (*EBX),
-#endif
+         "=S" (*EBX),
          "=c" (*ECX),
          "=d" (*EDX)
        :  "a" (value));
@@ -35,11 +34,11 @@ static void GetCpuIDAndInfo(unsigned value, unsigned *EAX, unsigned *EBX,
 }
 
 static const char *GetCurrentX86CPU() {
-  unsigned EAX = 0, DUMMY = 0, ECX = 0, EDX = 0;
-  GetCpuIDAndInfo(0x1, &EAX, &DUMMY, &ECX, &EDX);
+  unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
+  GetCpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
   unsigned Family  = (EAX & (0xffffffff >> (32 - 4)) << 8) >> 8; // Bits 8 - 11
   unsigned Model   = (EAX & (0xffffffff >> (32 - 4)) << 4) >> 4; // Bits 4 - 7
-  GetCpuIDAndInfo(0x80000001, &EAX, &DUMMY, &ECX, &EDX);
+  GetCpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
   bool Em64T = EDX & (1 << 29);
 
   switch (Family) {