mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164696 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
565df79b74
commit
50b7d70707
@ -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<IntegerType>(V->getType()) && "Can only zero extend integers!");
|
||||
IntegerType *IntTy = cast<IntegerType>(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<IntegerType>(V->getType()) && "Can only sign extend integers!");
|
||||
IntegerType *IntTy = cast<IntegerType>(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);
|
||||
}
|
||||
|
@ -58,10 +58,10 @@ static cl::opt<bool>
|
||||
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<ConstantInt>(TableContents[I - 1])->getZExtValue();
|
||||
ConstantInt *Val = cast<ConstantInt>(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<IntegerType>(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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user