Skip to content
  • Chris Lattner's avatar
    fix a fairly serious oversight with switch formation from · d9bacc08
    Chris Lattner authored
    or'd conditions.  Previously we'd compile something like this:
    
    int crud (unsigned char c) {
       return c == 62 || c == 34 || c == 92;
    }
    
    into:
    
      switch i8 %c, label %lor.rhs [
        i8 62, label %lor.end
        i8 34, label %lor.end
      ]
    
    lor.rhs:                                          ; preds = %entry
      %cmp8 = icmp eq i8 %c, 92
      br label %lor.end
    
    lor.end:                                          ; preds = %entry, %entry, %lor.rhs
      %0 = phi i1 [ true, %entry ], [ %cmp8, %lor.rhs ], [ true, %entry ]
      %lor.ext = zext i1 %0 to i32
      ret i32 %lor.ext
    
    which failed to merge the compare-with-92 into the switch.  With this patch
    we simplify this all the way to:
    
      switch i8 %c, label %lor.rhs [
        i8 62, label %lor.end
        i8 34, label %lor.end
        i8 92, label %lor.end
      ]
    
    lor.rhs:                                          ; preds = %entry
      br label %lor.end
    
    lor.end:                                          ; preds = %entry, %entry, %entry, %lor.rhs
      %0 = phi i1 [ true, %entry ], [ false, %lor.rhs ], [ true, %entry ], [ true, %entry ]
      %lor.ext = zext i1 %0 to i32
      ret i32 %lor.ext
    
    which is much better for codegen's switch lowering stuff.  This kicks in 33 times
    on 176.gcc (for example) cutting 103 instructions off the generated code.
    
    llvm-svn: 121671
    d9bacc08
Loading