diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-12-13 04:50:38 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-12-13 04:50:38 +0000 | 
| commit | a442f24a3695c0793e3ac787d62cde02ccdc2873 (patch) | |
| tree | 69c636df909c3dc67c9089213d52ffa2ec1f9870 /llvm/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp | |
| parent | a737721d1450ae2eb46cbe9fce07bcfdfea578ac (diff) | |
| download | bcm5719-llvm-a442f24a3695c0793e3ac787d62cde02ccdc2873.tar.gz bcm5719-llvm-a442f24a3695c0793e3ac787d62cde02ccdc2873.zip | |
enhance the "change or icmp's into switch" xform to handle one value in an 
'or sequence' that it doesn't understand.  This allows us to optimize
something insane like this:
int crud (unsigned char c, unsigned x)
 {
   if(((((((((( (int) c <= 32 ||
                    (int) c == 46) || (int) c == 44)
                  || (int) c == 58) || (int) c == 59) || (int) c == 60)
               || (int) c == 62) || (int) c == 34) || (int) c == 92)
            || (int) c == 39) != 0)
     foo();
 }
into:
define i32 @crud(i8 zeroext %c, i32 %x) nounwind ssp noredzone {
entry:
  %cmp = icmp ult i8 %c, 33
  br i1 %cmp, label %if.then, label %switch.early.test
switch.early.test:                                ; preds = %entry
  switch i8 %c, label %if.end [
    i8 39, label %if.then
    i8 44, label %if.then
    i8 58, label %if.then
    i8 59, label %if.then
    i8 60, label %if.then
    i8 62, label %if.then
    i8 46, label %if.then
    i8 92, label %if.then
    i8 34, label %if.then
  ]
by pulling the < comparison out ahead of the newly formed switch.
llvm-svn: 121680
Diffstat (limited to 'llvm/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp')
0 files changed, 0 insertions, 0 deletions

