Index: test/Driver/B-opt.c
===================================================================
--- test/Driver/B-opt.c	(revision 0)
+++ test/Driver/B-opt.c	(revision 0)
@@ -0,0 +1,22 @@
+// Check -B driver option.
+//
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN:     -B %S/Inputs/B_opt_tree/dir1 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-B-OPT-TRIPLE %s
+// CHECK-B-OPT-TRIPLE: "{{.*}}/Inputs/B_opt_tree/dir1/i386-unknown-linux-ld"
+//
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN:     -B %S/Inputs/B_opt_tree/dir2 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-B-OPT-DIR %s
+// CHECK-B-OPT-DIR: "{{.*}}/Inputs/B_opt_tree/dir2/ld"
+//
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN:     -B %S/Inputs/B_opt_tree/dir3/prefix- 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-B-OPT-PREFIX %s
+// CHECK-B-OPT-PREFIX: "{{.*}}/Inputs/B_opt_tree/dir3/prefix-ld"
+//
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN:     -B %S/Inputs/B_opt_tree/dir3/prefix- \
+// RUN:     -B %S/Inputs/B_opt_tree/dir2 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-B-OPT-MULT %s
+// CHECK-B-OPT-MULT: "{{.*}}/Inputs/B_opt_tree/dir3/prefix-ld"
Index: test/Driver/Inputs/B_opt_tree/dir1/ld
===================================================================

Property changes on: test/Driver/Inputs/B_opt_tree/dir1/ld
___________________________________________________________________
Added: svn:executable
   + *

Index: test/Driver/Inputs/B_opt_tree/dir1/i386-unknown-linux-ld
===================================================================

Property changes on: test/Driver/Inputs/B_opt_tree/dir1/i386-unknown-linux-ld
___________________________________________________________________
Added: svn:executable
   + *

Index: test/Driver/Inputs/B_opt_tree/dir2/ld
===================================================================

Property changes on: test/Driver/Inputs/B_opt_tree/dir2/ld
___________________________________________________________________
Added: svn:executable
   + *

Index: test/Driver/Inputs/B_opt_tree/dir3/prefix-ld
===================================================================

Property changes on: test/Driver/Inputs/B_opt_tree/dir3/prefix-ld
___________________________________________________________________
Added: svn:executable
   + *

Index: lib/Driver/Driver.cpp
===================================================================
--- lib/Driver/Driver.cpp	(revision 166674)
+++ lib/Driver/Driver.cpp	(working copy)
@@ -1597,12 +1597,19 @@
   // attempting to use this prefix when looking for program paths.
   for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(),
        ie = PrefixDirs.end(); it != ie; ++it) {
-    llvm::sys::Path P(*it);
-    P.appendComponent(TargetSpecificExecutable);
-    if (P.canExecute()) return P.str();
-    P.eraseComponent();
-    P.appendComponent(Name);
-    if (P.canExecute()) return P.str();
+    bool IsDirectory;
+    if (!llvm::sys::fs::is_directory(*it, IsDirectory) && IsDirectory) {
+      llvm::sys::Path P(*it);
+      P.appendComponent(TargetSpecificExecutable);
+      if (P.canExecute()) return P.str();
+      P.eraseComponent();
+      P.appendComponent(Name);
+      if (P.canExecute()) return P.str();
+    }
+    else {
+      llvm::sys::Path P(*it + Name);
+      if (P.canExecute()) return P.str();
+    }
   }
 
   const ToolChain::path_list &List = TC.getProgramPaths();
