From e1a73f6ca3facaae75b365fc4b8978ab0717cb2f Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Wed, 26 Sep 2012 14:01:53 +0000 Subject: [PATCH] Address Duncan's comments on r164684: - Put statistics in alphabetical order - Don't use getZextValue when building TableInt, just use APInts - Introduce Create{Z,S}ExtOrTrunc in IRBuilder. llvm-svn: 164696 --- include/llvm/IRBuilder.h | 24 +++++++++++++++++++ lib/Transforms/Utils/SimplifyCFG.cpp | 14 ++++------- .../SimplifyCFG/switch_to_lookup_table.ll | 4 ++-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/include/llvm/IRBuilder.h b/include/llvm/IRBuilder.h index ff64660a429..f9d219f3a05 100644 --- a/include/llvm/IRBuilder.h +++ b/include/llvm/IRBuilder.h @@ -995,6 +995,30 @@ public: Value *CreateSExt(Value *V, Type *DestTy, const Twine &Name = "") { return CreateCast(Instruction::SExt, V, DestTy, Name); } + /// CreateZExtOrTrunc - Create a ZExt or Trunc from the integer value V to + /// DestTy. Return the value untouched if the type of V is already DestTy. + Value *CreateZExtOrTrunc(Value *V, IntegerType *DestTy, + const Twine &Name = "") { + assert(isa(V->getType()) && "Can only zero extend integers!"); + IntegerType *IntTy = cast(V->getType()); + if (IntTy->getBitWidth() < DestTy->getBitWidth()) + return CreateZExt(V, DestTy, Name); + if (IntTy->getBitWidth() > DestTy->getBitWidth()) + return CreateTrunc(V, DestTy, Name); + return V; + } + /// CreateSExtOrTrunc - Create a SExt or Trunc from the integer value V to + /// DestTy. Return the value untouched if the type of V is already DestTy. + Value *CreateSExtOrTrunc(Value *V, IntegerType *DestTy, + const Twine &Name = "") { + assert(isa(V->getType()) && "Can only sign extend integers!"); + IntegerType *IntTy = cast(V->getType()); + if (IntTy->getBitWidth() < DestTy->getBitWidth()) + return CreateSExt(V, DestTy, Name); + if (IntTy->getBitWidth() > DestTy->getBitWidth()) + return CreateTrunc(V, DestTy, Name); + return V; + } Value *CreateFPToUI(Value *V, Type *DestTy, const Twine &Name = ""){ return CreateCast(Instruction::FPToUI, V, DestTy, Name); } diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index d7468a18908..299c0596da3 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -58,10 +58,10 @@ static cl::opt SinkCommon("simplifycfg-sink-common", cl::Hidden, cl::init(true), cl::desc("Sink common instructions down to the end block")); -STATISTIC(NumSpeculations, "Number of speculative executed instructions"); -STATISTIC(NumLookupTables, "Number of switch instructions turned into lookup tables"); STATISTIC(NumBitMaps, "Number of switch instructions turned into bitmaps"); +STATISTIC(NumLookupTables, "Number of switch instructions turned into lookup tables"); STATISTIC(NumSinkCommons, "Number of common instructions sunk down to the end block"); +STATISTIC(NumSpeculations, "Number of speculative executed instructions"); namespace { /// ValueEqualityComparisonCase - Represents a case of a switch. @@ -3347,7 +3347,8 @@ SwitchLookupTable::SwitchLookupTable(Module &M, APInt TableInt(TableSize * IT->getBitWidth(), 0); for (uint64_t I = TableSize; I > 0; --I) { TableInt <<= IT->getBitWidth(); - TableInt |= cast(TableContents[I - 1])->getZExtValue(); + ConstantInt *Val = cast(TableContents[I - 1]); + TableInt |= Val->getValue().zext(TableInt.getBitWidth()); } BitMap = ConstantInt::get(M.getContext(), TableInt); BitMapElementTy = IT; @@ -3379,12 +3380,7 @@ Value *SwitchLookupTable::BuildLookup(Value *Index, IRBuilder<> &Builder) { // Cast Index to the same type as the bitmap. // Note: The Index is <= the number of elements in the table, so // truncating it to the width of the bitmask is safe. - Value *ShiftAmt = Index; - IntegerType *IndexTy = cast(Index->getType()); - if (IndexTy->getBitWidth() < MapTy->getBitWidth()) - ShiftAmt = Builder.CreateZExt(ShiftAmt, MapTy, "switch.zext"); - else if (IndexTy->getBitWidth() > MapTy->getBitWidth()) - ShiftAmt = Builder.CreateTrunc(ShiftAmt, MapTy, "switch.trunc"); + Value *ShiftAmt = Builder.CreateZExtOrTrunc(Index, MapTy, "switch.cast"); // Multiply the shift amount by the element width. ShiftAmt = Builder.CreateMul(ShiftAmt, diff --git a/test/Transforms/SimplifyCFG/switch_to_lookup_table.ll b/test/Transforms/SimplifyCFG/switch_to_lookup_table.ll index 97c80b9d48a..ef9d51669d3 100644 --- a/test/Transforms/SimplifyCFG/switch_to_lookup_table.ll +++ b/test/Transforms/SimplifyCFG/switch_to_lookup_table.ll @@ -221,8 +221,8 @@ lor.end: ; CHECK-NEXT: %0 = icmp ult i8 %switch.tableidx, 59 ; CHECK-NEXT: br i1 %0, label %switch.lookup, label %lor.end ; CHECK: switch.lookup: -; CHECK-NEXT: %switch.zext = zext i8 %switch.tableidx to i59 -; CHECK-NEXT: %switch.shiftamt = mul i59 %switch.zext, 1 +; CHECK-NEXT: %switch.cast = zext i8 %switch.tableidx to i59 +; CHECK-NEXT: %switch.shiftamt = mul i59 %switch.cast, 1 ; CHECK-NEXT: %switch.downshift = lshr i59 -288230375765830623, %switch.shiftamt ; CHECK-NEXT: %switch.masked = trunc i59 %switch.downshift to i1 ; CHECK-NEXT: br label %lor.end