 |
|
 |
|
| Files: |
1 |
|
Branches Taken: |
75.0% |
21 / 28 |
| Generated: |
2009-05-17 22:47 |
|
Branches Executed: |
85.7% |
24 / 28 |
| |
|
Line Coverage: |
100.0% |
23 / 23 |
| |
 |
|
 |
1 : /* -*- mode: c++; c-basic-offset: 2; -*- */
2 :
3 : #include "Passes.h"
4 :
5 : #include "llvm/InlineAsm.h"
6 :
7 : using namespace llvm;
8 : using namespace klee;
9 :
10 : char RaiseAsmPass::ID = 0;
11 :
12 : Function *RaiseAsmPass::getIntrinsic(llvm::Module &M,
13 : unsigned IID,
14 : const Type **Tys,
15 1: unsigned NumTys) {
16 1: return Intrinsic::getDeclaration(&M, (llvm::Intrinsic::ID) IID, Tys, NumTys);
17 : }
18 :
19 : // FIXME: This should just be implemented as a patch to
20 : // X86TargetAsmInfo.cpp, then everyone will benefit.
21 97511: bool RaiseAsmPass::runOnInstruction(Module &M, Instruction *I) {
4031: branch 0 taken
93480: branch 1 taken
22 97511: if (CallInst *ci = dyn_cast<CallInst>(I)) {
1: branch 0 taken
4030: branch 1 taken
23 8062: if (InlineAsm *ia = dyn_cast<InlineAsm>(ci->getCalledValue())) {
24 1: const std::string &as = ia->getAsmString();
25 1: const std::string &cs = ia->getConstraintString();
26 2: const llvm::Type *T = ci->getType();
27 :
28 : // bswaps
1: branch 0 taken
0: branch 1 not taken
1: branch 3 taken
0: branch 4 not taken
0: branch 5 not taken
1: branch 6 taken
1: branch 7 taken
1: branch 8 taken
1: branch 9 taken
1: branch 10 taken
1: branch 11 taken
0: branch 12 not taken
1: branch 13 taken
0: branch 14 not taken
1: branch 15 taken
0: branch 16 not taken
1: branch 17 taken
0: branch 18 not taken
29 4: if (ci->getNumOperands() == 2 &&
30 : T == ci->getOperand(1)->getType() &&
31 : ((T == llvm::Type::Int16Ty &&
32 : as == "rorw $$8, ${0:w}" &&
33 : cs == "=r,0,~{dirflag},~{fpsr},~{flags},~{cc}") ||
34 : (T == llvm::Type::Int32Ty &&
35 : as == "rorw $$8, ${0:w};rorl $$16, $0;rorw $$8, ${0:w}" &&
36 : cs == "=r,0,~{dirflag},~{fpsr},~{flags},~{cc}"))) {
37 1: llvm::Value *Arg0 = ci->getOperand(1);
38 2: Function *F = getIntrinsic(M, Intrinsic::bswap, Arg0->getType());
39 1: ci->setOperand(0, F);
40 1: return true;
41 : }
42 : }
43 : }
44 :
45 97510: return false;
46 : }
47 :
48 103: bool RaiseAsmPass::runOnModule(Module &M) {
49 103: bool changed = false;
50 :
842: branch 1 taken
103: branch 2 taken
51 1787: for (Module::iterator fi = M.begin(), fe = M.end(); fi != fe; ++fi) {
10590: branch 1 taken
842: branch 2 taken
52 22864: for (Function::iterator bi = fi->begin(), be = fi->end(); bi != be; ++bi) {
97511: branch 0 taken
10590: branch 1 taken
53 118691: for (BasicBlock::iterator ii = bi->begin(), ie = bi->end(); ii != ie;) {
54 97511: Instruction *i = ii;
55 97511: ++ii;
56 97511: changed |= runOnInstruction(M, i);
57 : }
58 : }
59 : }
60 :
61 103: return changed;
62 : }
Generated: 2009-05-17 22:47 by zcov