Skip to content
  • Michael Gottesman's avatar
    Teach simplify-cfg how to correctly create covered lookup tables for switches on iN with N >= 3. · c024f325
    Michael Gottesman authored
    One optimization simplify-cfg performs is the converting of switches to
    lookup tables if the switch has > 4 cases. This is done by:
    
    1. Finding the max/min case value and calculating the switch case range.
    2. Create a lookup table basic block.
    3. Perform a check in the switch's BB to see if the input value is in
    the switch's case range. If the input value satisfies said predicate
    branch to the lookup table BB, otherwise branch to the switch's default
    destination BB using the default value as the result.
    
    The conditional check consists of subtracting the min case value of the
    table from any input iN value and then ensuring that said value is
    unsigned less than the size of the lookup table represented as an iN
    value.
    
    If the lookup table is a covered lookup table, the size of the table will be N
    which is 0 as an iN value. Thus the comparison will be an `icmp ult` of an iN
    value against 0 which is always false yielding the incorrect result.
    
    This patch fixes this problem by recognizing if we have a covered lookup table
    and if we do, unconditionally jumps to the lookup table BB since the covering
    property of the lookup table implies no input values could not be handled by
    said BB.
    
    rdar://15268442
    
    llvm-svn: 193045
    c024f325
Loading