Skip to content
  1. Sep 05, 2017
  2. Sep 04, 2017
  3. Sep 03, 2017
  4. Sep 02, 2017
    • Craig Topper's avatar
      [X86] Teach fastisel to handle zext/sext i8->i16 and sext i1->i8/i16/i32/i64 · 619b759a
      Craig Topper authored
      Summary:
      ZExt and SExt from i8 to i16 aren't implemented in the autogenerated fast isel table because normal isel does a zext/sext to 32-bits and a subreg extract to avoid a partial register write or false dependency on the upper bits of the destination. This means without handling in fast isel we end up triggering a fast isel abort.
      
      We had no custom sign extend handling at all so while I was there I went ahead and implemented sext i1->i8/i16/i32/i64 which was also missing. This generates an i1->i8 sign extend using a mask with 1, then an 8-bit negate, then continues with a sext from i8. A better sequence would be a wider and/negate, but would require more custom code.
      
      Fast isel tests are a mess and I couldn't find a good home for the tests so I created a new one.
      
      The test pr34381.ll had to have fast-isel removed because it was relying on a fast isel abort to hit the bug. The test case still seems valid with fast-isel disabled though some of the instructions changed.
      
      Reviewers: spatel, zvi, igorb, guyblank, RKSimon
      
      Reviewed By: guyblank
      
      Subscribers: llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D37320
      
      llvm-svn: 312422
      619b759a
Loading