mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-06 03:47:44 +00:00
Treat Mul just like Add and Subtract
Like adds and subtracts, muls ripple only to the left so we can use the same logic. While we're here, add a print method to DemandedBits so it can be used with -analyze, which we'll use in the testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249686 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cbaa85372d
commit
6f819bd488
@ -41,7 +41,8 @@ struct DemandedBits : public FunctionPass {
|
||||
|
||||
bool runOnFunction(Function& F) override;
|
||||
void getAnalysisUsage(AnalysisUsage& AU) const override;
|
||||
|
||||
void print(raw_ostream &OS, const Module *M) const override;
|
||||
|
||||
/// Return the bits demanded from instruction I.
|
||||
APInt getDemandedBits(Instruction *I);
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "llvm/ADT/DepthFirstIterator.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Analysis/AssumptionCache.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
@ -131,6 +132,7 @@ void DemandedBits::determineLiveOperandBits(
|
||||
break;
|
||||
case Instruction::Add:
|
||||
case Instruction::Sub:
|
||||
case Instruction::Mul:
|
||||
// Find the highest live output bit. We don't need any more input
|
||||
// bits than that (adds, and thus subtracts, ripple only to the
|
||||
// left).
|
||||
@ -368,6 +370,16 @@ bool DemandedBits::isInstructionDead(Instruction *I) {
|
||||
!isAlwaysLive(I);
|
||||
}
|
||||
|
||||
void DemandedBits::print(raw_ostream &OS, const Module *M) const {
|
||||
// This is gross. But the alternative is making all the state mutable
|
||||
// just because of this one debugging method.
|
||||
const_cast<DemandedBits*>(this)->performAnalysis();
|
||||
for (auto &KV : AliveBits) {
|
||||
OS << "DemandedBits: 0x" << utohexstr(KV.second.getLimitedValue()) << " for "
|
||||
<< *KV.first << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
FunctionPass *llvm::createDemandedBitsPass() {
|
||||
return new DemandedBits();
|
||||
}
|
||||
|
12
test/Analysis/DemandedBits/basic.ll
Normal file
12
test/Analysis/DemandedBits/basic.ll
Normal file
@ -0,0 +1,12 @@
|
||||
; RUN: opt -S -demanded-bits -analyze < %s | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: 'test_mul'
|
||||
; CHECK-DAG: DemandedBits: 0xFF for %1 = add nsw i32 %a, 5
|
||||
; CHECK-DAG: DemandedBits: 0xFF for %3 = trunc i32 %2 to i8
|
||||
; CHECK-DAG: DemandedBits: 0xFF for %2 = mul nsw i32 %1, %b
|
||||
define i8 @test_mul(i32 %a, i32 %b) {
|
||||
%1 = add nsw i32 %a, 5
|
||||
%2 = mul nsw i32 %1, %b
|
||||
%3 = trunc i32 %2 to i8
|
||||
ret i8 %3
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user