-
-
Save manasij7479/2ad0f7f058503ae60de30e4bfb30c917 to your computer and use it in GitHub Desktop.
matcher passing spec
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Value *f(llvm::Instruction *I, IRBuilder *B) { | |
| /* Opt : 3157 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %newvar0:i4 = var ; newvar0 | |
| %2:i4 = width %newvar0 | |
| %3:i8 = zext %2 | |
| %4:i8 = shl 1:i8, %3 | |
| %5:i8 = sub %4, 1:i8 | |
| %6:i1 = ule %symconst_1, %5 | |
| pc %6 1:i1 | |
| %7:i8 = zext %newvar0 | |
| %8:i1 = eq %symconst_1, %7 | |
| infer %8 | |
| %9:i4 = trunc %symconst_1 | |
| %10:i1 = eq %newvar0, %9 | |
| result %10 | |
| C1 <=u ((1 << zext(width(newvar0))) - 1) | |
| |= | |
| C1 == zext(newvar0) | |
| => | |
| newvar0 == trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3157) && match(I, m_c_ICmp(P0, m_Constant(&x3), m_ZExt(m_Value(x2))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x2) && (ule(util::V(x3), sub(shl(llvm::APInt(8, 1), util::W(x2).zext(64)), llvm::APInt(8, 1))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3157, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3197 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %2:i1 = ne %symconst_1, %symconst_2 | |
| pc %2 1:i1 | |
| %newvar1:i1 = var ; newvar1 | |
| %4:i32 = select %newvar1, %symconst_2, %symconst_1 | |
| %5:i1 = ne %symconst_1, %4 | |
| infer %5 | |
| result %newvar1 | |
| C2 != C1 | |
| |= | |
| C1 != (select newvar1 C2 C1) | |
| => | |
| newvar1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3197) && match(I, m_c_ICmp(P0, m_Constant(&x2), m_Select(m_Value(x3), m_Constant(&x1), m_Deferred(x2))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x3,1) && (ne(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = x3; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3197, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1677 | |
| %newvar3:i1 = var ; newvar3 | |
| %1:i16 = select %newvar3, 1:i16, 0:i16 | |
| infer %1 | |
| %2:i16 = zext %newvar3 | |
| result %2 | |
| select newvar3 1 0 | |
| => | |
| zext(newvar3) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| if (util::filter(F, 1677) && match(I, m_Select(m_Value(x0), m_ExtInt("1", 16), m_Zero()))) { | |
| if (util::check_width(x0,1) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateZExt(x0, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1677, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2426 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %2:i1 = ne %symconst_1, %symconst_2 | |
| pc %2 1:i1 | |
| %newvar1:i1 = var ; newvar1 | |
| %4:i32 = select %newvar1, %symconst_2, %symconst_1 | |
| %5:i1 = ne %symconst_1, %4 | |
| %6:i8 = zext %5 | |
| infer %6 | |
| %7:i8 = zext %newvar1 | |
| result %7 | |
| C2 != C1 | |
| |= | |
| zext((C1 != (select newvar1 C2 C1))) | |
| => | |
| zext(newvar1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2426) && match(I, m_ZExt(m_c_ICmp(P0, m_Constant(&x2), m_Select(m_Value(x4), m_Constant(&x1), m_Deferred(x2)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x4,1) && util::dc(DT, I, x4) && (ne(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateZExt(x4, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2426, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2743 | |
| %newvar0:i16 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %2:i16 = trunc %1 | |
| infer %2 | |
| result %newvar0 | |
| trunc(zext(newvar0)) | |
| => | |
| newvar0 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2743) && match(I, m_Trunc(m_ZExt(m_Value(x2))))) { | |
| auto ret = x2; | |
| if (util::check_width(ret, I)) { | |
| St.hit(2743, 2); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 1534 | |
| %symconst_9:i32 = var ; symconst_9 | |
| %symconst_8:i32 = var ; symconst_8 | |
| %2:i1 = ult %symconst_9, %symconst_8 | |
| pc %2 1:i1 | |
| %newvar1:i1 = var ; newvar1 | |
| %4:i32 = select %newvar1, %symconst_8, %symconst_9 | |
| %5:i1 = ne %symconst_9, %4 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %symconst_7:i8 = var ; symconst_7 | |
| %8:i8 = select %5, %symconst_3, %symconst_7 | |
| infer %8 | |
| %9:i8 = select %newvar1, %symconst_3, %symconst_7 | |
| result %9 | |
| C9 <u C8 | |
| |= | |
| select (C9 != (select newvar1 C8 C9)) C3 C7 | |
| => | |
| select newvar1 C3 C7 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1534) && match(I, m_Select(m_c_ICmp(P0, m_Constant(&x2), m_Select(m_Value(x5), m_Constant(&x1), m_Deferred(x2))), m_Constant(&x4), m_Constant(&x3)))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x5,1) && util::dc(DT, I, x5) && util::dc(DT, I, x4) && util::dc(DT, I, x3) && (ult(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateSelect(x5, x4, x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1534, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3174 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %2:i1 = ne 0:i32, %1 | |
| infer %2 | |
| result %newvar0 | |
| zext(newvar0) != 0 | |
| => | |
| newvar0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3174) && match(I, m_c_ICmp(P0, m_Zero(), m_ZExt(m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x1,1)) { | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3174, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 37 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = add 0:i32, %v0 | |
| infer %1 | |
| result %v0 | |
| v0 + 0 | |
| => | |
| v0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| if (util::filter(F, 37) && match(I, m_c_Add(m_Zero(), m_Value(x0)))) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(37, 1); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 2789 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %newvar2:i8 = var ; newvar2 | |
| %2:i32 = zext %newvar2 | |
| %3:i32 = or %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = or %newvar2, %5 | |
| result %6 | |
| trunc((C1 | zext(newvar2))) | |
| => | |
| newvar2 | trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2789) && match(I, m_Trunc(m_c_Or(m_Constant(&x3), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateOr(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2789, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3296 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = and 1:i32, %v0 | |
| %2:i1 = ne 0:i32, %1 | |
| infer %2 | |
| %3:i1 = trunc %v0 | |
| result %3 | |
| (v0 & 1) != 0 | |
| => | |
| trunc(v0) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3296) && match(I, m_c_ICmp(P0, m_Zero(), m_c_And(m_ExtInt("1", 32), m_Value(x0))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateTrunc(x0, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3296, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2712 | |
| %newvar0:i32 = var ; newvar0 | |
| %1:i32 = add 0:i32, %newvar0 | |
| %2:i64 = sext %1 | |
| infer %2 | |
| %3:i64 = sext %newvar0 | |
| result %3 | |
| sext((newvar0 + 0)) | |
| => | |
| sext(newvar0) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2712) && match(I, m_SExt(m_c_Add(m_Zero(), m_Value(x1))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateSExt(x1, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2712, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 392 | |
| %newvar2:i32 = var ; newvar2 | |
| %1:i32 = mul 1:i32, %newvar2 | |
| infer %1 | |
| result %newvar2 | |
| newvar2 * 1 | |
| => | |
| newvar2 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| if (util::filter(F, 392) && match(I, m_c_Mul(m_ExtInt("1", 32), m_Value(x0)))) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(392, 1); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 2931 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %1:i1 = ult 0:i32, %symconst_1 | |
| %v1:i8 = var ; v1 | |
| %3:i8 = width %v1 | |
| %4:i32 = zext %3 | |
| %5:i1 = ule %symconst_1, %4 | |
| %6:i1 = and %1, %5 | |
| pc %6 1:i1 | |
| %7:i32 = zext %v1 | |
| %8:i1 = eq %symconst_1, %7 | |
| infer %8 | |
| %9:i8 = trunc %symconst_1 | |
| %10:i1 = eq %v1, %9 | |
| result %10 | |
| (0 <u C1) & (C1 <=u zext(width(v1))) | |
| |= | |
| C1 == zext(v1) | |
| => | |
| v1 == trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2931) && match(I, m_c_ICmp(P0, m_Constant(&x4), m_ZExt(m_Value(x3))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x3) && ((ult(llvm::APInt(32, 0), util::V(x4)) & ule(util::V(x4), util::W(x3).zext(64))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x3, B->CreateTrunc(x4, T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2931, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 503 | |
| %v0:i16 = var ; v0 | |
| %symconst_1:i16 = var (powerOfTwo) ; symconst_1 | |
| %2:i16 = udiv %v0, %symconst_1 | |
| infer %2 | |
| %3:i16 = logb %symconst_1 | |
| %4:i16 = lshr %v0, %3 | |
| result %4 | |
| v0 /u C1 (powerOfTwo) | |
| => | |
| v0 >>l logb(C1) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 503) && match(I, m_UDiv(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::pow2(x0) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateLShr(x1, B->CreateLogB(x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(503, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3940 | |
| %symconst_2:i64 = var ; symconst_2 | |
| %symDF_DB:i64 = var ; symDF_DB | |
| %2:i1 = knownones %symconst_2, %symDF_DB | |
| pc %2 1:i1 | |
| %v0:i64 = var ; v0 | |
| %4:i64 = and %symconst_2, %v0 | |
| %5:i64 = demandedmask %4, %symDF_DB | |
| infer %5 | |
| %6:i64 = demandedmask %v0, %symDF_DB | |
| result %6 | |
| C2 <<=1 @db | |
| |= | |
| v0 & C2 | |
| => | |
| v0 | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| if (util::filter(F, 3940) && match(I, m_c_And(m_Constant(&x3), m_Value(x4)))) { | |
| if (util::symdb(DB, I, x2, B) && util::dc(DT, I, x4) && util::dc(DT, I, x2) && util::symk1test(x3, x2)) { | |
| auto ret = x4; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3940, 1); | |
| return ret; | |
| } | |
| } | |
| }}*/ | |
| /* Opt : 4023 | |
| %symconst_1:i64 = var ; symconst_1 | |
| %symDF_K0:i64 = var ; symDF_K0 | |
| %2:i1 = knownzeros %symconst_1, %symDF_K0 | |
| pc %2 1:i1 | |
| %symDF_DB:i64 = var ; symDF_DB | |
| %4:i1 = knownones %symDF_K0, %symDF_DB | |
| pc %4 1:i1 | |
| %newvar1:i64 = var ; newvar1 | |
| %newvar3:i64 = var ; newvar3 | |
| %7:i64 = and %symconst_1, %newvar3 | |
| %8:i64 = or %newvar1, %7 | |
| %9:i64 = demandedmask %8, %symDF_DB | |
| infer %9 | |
| %10:i64 = demandedmask %newvar1, %symDF_DB | |
| result %10 | |
| symconst_1.k0 <<=1 @db | |
| |= | |
| let var1 = (C1 & newvar3); | |
| let var0 = newvar1 | var1; | |
| var0 | |
| => | |
| newvar1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr, *x7 = nullptr, *x6 = nullptr; | |
| if (util::filter(F, 4023) && match(I, m_c_Or(m_Value(x7), m_c_And(m_Constant(&x5), m_Value(x6))))) { | |
| if (util::symk0bind(x5, x3, B) && util::symdb(DB, I, x2, B) && util::dc(DT, I, x7) && util::dc(DT, I, x2) && util::symk1test(x3, x2)) { | |
| auto ret = x7; | |
| if (util::check_width(ret, I)) { | |
| St.hit(4023, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 36 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = add %symconst_1, %v0 | |
| %3:i8 = add %symconst_1, %2 | |
| infer %3 | |
| %4:i8 = add %symconst_1, %symconst_1 | |
| %5:i8 = add %v0, %4 | |
| result %5 | |
| C1 + (v0 + C1) | |
| => | |
| v0 + (C1 + C1) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 36) && match(I, m_c_Add(m_Constant(&x1), m_c_Add(m_Deferred(x1), m_Value(x0))))) { | |
| if (util::dc(DT, I, x0)) { | |
| auto ret = B->CreateAdd(x0, B->CreateAdd(x1, x1)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(36, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2761 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = zext %v0 | |
| %3:i32 = and %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = and %v0, %5 | |
| result %6 | |
| trunc((C1 & zext(v0))) | |
| => | |
| v0 & trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2761) && match(I, m_Trunc(m_c_And(m_Constant(&x3), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAnd(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2761, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1250 | |
| %newvar0:i8 = var ; newvar0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i1 = ne %newvar0, %symconst_1 | |
| %3:i1 = xor 1:i1, %2 | |
| infer %3 | |
| %4:i1 = eq %newvar0, %symconst_1 | |
| result %4 | |
| ~(C1 != newvar0) | |
| => | |
| C1 == newvar0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1250) && match(I, m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Value(x2), m_Constant(&x1))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x2, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1250, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3523 | |
| %symconst_1:i64 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = width %v0 | |
| %3:i64 = zext %2 | |
| %4:i64 = shl 1:i64, %3 | |
| %5:i64 = sub %4, 1:i64 | |
| %6:i1 = ule %symconst_1, %5 | |
| pc %6 1:i1 | |
| %7:i64 = zext %v0 | |
| %8:i1 = ult %7, %symconst_1 | |
| infer %8 | |
| %9:i8 = trunc %symconst_1 | |
| %10:i1 = ult %v0, %9 | |
| result %10 | |
| C1 <=u ((1 << zext(width(v0))) - 1) | |
| |= | |
| zext(v0) <u C1 | |
| => | |
| v0 <u trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3523) && match(I, m_ICmp(P0, m_ZExt(m_Value(x2)), m_Constant(&x3)))) { | |
| if (P0 == ICmpInst::ICMP_ULT && util::dc(DT, I, x2) && (ule(util::V(x3), sub(shl(llvm::APInt(64, 1), util::W(x2).zext(64)), llvm::APInt(64, 1))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULT, x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3523, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3414 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = select %newvar0, 1:i32, 0:i32 | |
| %newvar5:i1 = var ; newvar5 | |
| %3:i32 = zext %newvar5 | |
| %4:i32 = xor %1, %3 | |
| %5:i1 = ne 0:i32, %4 | |
| infer %5 | |
| %6:i1 = xor %newvar0, %newvar5 | |
| result %6 | |
| ((select newvar0 1 0) ^ zext(newvar5)) != 0 | |
| => | |
| newvar5 ^ newvar0 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3414) && match(I, m_c_ICmp(P0, m_Zero(), m_c_Xor(m_Select(m_Value(x2), m_ExtInt("1", 32), m_Zero()), m_ZExt(m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x2,1) && util::check_width(x1,1) && util::dc(DT, I, x2) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateXor(x2, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3414, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1635 | |
| %symconst_6:i32 = var ; symconst_6 | |
| %symconst_7:i32 = var ; symconst_7 | |
| %2:i32 = sub %symconst_6, %symconst_7 | |
| %3:i1 = eq 1:i32, %2 | |
| pc %3 1:i1 | |
| %v0:i32 = var ; v0 | |
| %5:i32 = and 1:i32, %v0 | |
| %6:i1 = ne 0:i32, %5 | |
| %7:i32 = select %6, %symconst_6, %symconst_7 | |
| infer %7 | |
| %8:i32 = add %symconst_7, %5 | |
| result %8 | |
| (C6 - C7) == 1 | |
| |= | |
| let var0 = (v0 & 1); | |
| select (var0 != 0) C6 C7 | |
| => | |
| C7 + var0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr, *x4 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1635) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), &x4 <<= m_c_And(&x5 <<= m_ExtInt("1", 32), m_Value(x3))), m_Constant(&x2), m_Constant(&x1)))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x1) && util::dc(DT, I, x4) && util::dc(DT, I, x3) && (eq(llvm::APInt(32, 1), sub(util::V(x2), util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateAdd(x1, x4); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1635, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 625 | |
| %newvar0:i16 = var ; newvar0 | |
| %1:i16 = and 65535:i16, %newvar0 | |
| infer %1 | |
| result %newvar0 | |
| newvar0 & 0xFFFF | |
| => | |
| newvar0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| if (util::filter(F, 625) && match(I, m_c_And(m_AllOnes(), m_Value(x0)))) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(625, 1); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 3948 | |
| %v0:i64 = var ; v0 | |
| %symDF_K0:i64 = var ; symDF_K0 | |
| %2:i1 = knownzeros %v0, %symDF_K0 | |
| pc %2 1:i1 | |
| %symconst_2:i64 = var ; symconst_2 | |
| %4:i64 = or %symDF_K0, %symconst_2 | |
| %symDF_DB:i64 = var ; symDF_DB | |
| %6:i64 = xor 18446744073709551615:i64, %symDF_DB | |
| %7:i64 = or %4, %6 | |
| %8:i1 = eq 18446744073709551615:i64, %7 | |
| pc %8 1:i1 | |
| %9:i64 = and %v0, %symconst_2 | |
| %10:i64 = demandedmask %9, %symDF_DB | |
| infer %10 | |
| %11:i64 = demandedmask %v0, %symDF_DB | |
| result %11 | |
| ((C2 | v0.k0) | ~@db) == 0xFFFFFFFFFFFFFFFF | |
| |= | |
| let var0 = v0 & C2; | |
| var0 | |
| => | |
| v0 | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 3948) && match(I, m_c_And(m_Value(x5), m_Constant(&x2)))) { | |
| if (util::symk0bind(x5, x3, B) && util::symdb(DB, I, x1, B) && | |
| util::dc(DT, I, x5) && util::dc(DT, I, x1) && | |
| (or_(or_(util::V(x3), util::V(x2)), | |
| flip(util::V(x1)))).isAllOnesValue()) { | |
| auto ret = x5; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3948, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| */ | |
| /* Opt : 2448 | |
| %v2:i2 = var ; v2 | |
| %symconst_1:i2 = var (nonNegative) ; symconst_1 | |
| %2:i2 = and %v2, %symconst_1 | |
| %3:i4 = zext %2 | |
| %4:i8 = zext %3 | |
| infer %4 | |
| %5:i8 = sext %2 | |
| result %5 | |
| zext(zext((v2 & C1 (nonNegative)))) | |
| => | |
| sext((v2 & C1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x4 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2448) && match(I, m_ZExt(m_ZExt(&x4 <<= m_c_And(m_Value(x3), m_Constant(&x2)))))) { | |
| if (util::nn(x2) && util::dc(DT, I, x4) && util::dc(DT, I, x3) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSExt(x4, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2448, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2989 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = sext %v0 (hasExternalUses) | |
| %v2:i8 = var ; v2 | |
| %3:i32 = sext %v2 | |
| %4:i1 = eq %1, %3 | |
| infer %4 | |
| %5:i1 = eq %v0, %v2 | |
| result %5 | |
| sext(v0) == sext(v2) | |
| => | |
| v2 == v0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2989) && match(I, m_c_ICmp(P0, m_SExt(m_Value(x3)), m_SExt(m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x3) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x3, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2989, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3328 | |
| %newvar0:i64 = var ; newvar0 | |
| %1:i64 = srem %newvar0, 2:i64 | |
| %2:i1 = ne 0:i64, %1 | |
| infer %2 | |
| %3:i1 = trunc %newvar0 | |
| result %3 | |
| (newvar0 %s 2) != 0 | |
| => | |
| trunc(newvar0) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3328) && match(I, m_c_ICmp(P0, m_Zero(), m_SRem(m_Value(x0), m_ExtInt("2", 64))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateTrunc(x0, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3328, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3487 | |
| %newvar0:i16 = var ; newvar0 | |
| %1:i16 = and 1:i16, %newvar0 | |
| %2:i32 = zext %1 | |
| %3:i1 = ne 0:i32, %2 | |
| infer %3 | |
| %4:i1 = trunc %newvar0 | |
| result %4 | |
| zext((newvar0 & 1)) != 0 | |
| => | |
| trunc(newvar0) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3487) && match(I, m_c_ICmp(P0, m_Zero(), m_ZExt(m_c_And(m_ExtInt("1", 16), m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateTrunc(x1, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3487, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 583 | |
| %newvar0:i8 = var ; newvar0 | |
| %symconst_1:i8 = var (powerOfTwo) ; symconst_1 | |
| %2:i8 = urem %newvar0, %symconst_1 | |
| infer %2 | |
| %3:i8 = sub %symconst_1, 1:i8 | |
| %4:i8 = and %newvar0, %3 | |
| result %4 | |
| newvar0 %u C1 (powerOfTwo) | |
| => | |
| newvar0 & (C1 - 1) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 583) && match(I, m_URem(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::pow2(x0) && util::dc(DT, I, x1)) { | |
| auto C0 = C(8, 1, B); | |
| auto ret = B->CreateAnd(x1, B->CreateSub(x0, C0(x0))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(583, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3189 | |
| %symconst_6:i32 = var ; symconst_6 | |
| %symconst_5:i32 = var ; symconst_5 | |
| %2:i1 = ult %symconst_6, %symconst_5 | |
| pc %2 1:i1 | |
| %newvar0:i64 = var ; newvar0 | |
| %4:i64 = and 1:i64, %newvar0 | |
| %5:i1 = ne 0:i64, %4 | |
| %6:i32 = select %5, %symconst_5, %symconst_6 | |
| %7:i1 = ne %symconst_6, %6 | |
| infer %7 | |
| %8:i1 = trunc %newvar0 | |
| result %8 | |
| C6 <u C5 | |
| |= | |
| C6 != (select ((newvar0 & 1) != 0) C5 C6) | |
| => | |
| trunc(newvar0) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P1, P0; | |
| if (util::filter(F, 3189) && match(I, m_c_ICmp(P0, m_Constant(&x2), m_Select(m_c_ICmp(P1, m_Zero(), m_c_And(m_ExtInt("1", 64), m_Value(x3))), m_Constant(&x1), m_Deferred(x2))))) { | |
| if (P0 == ICmpInst::ICMP_NE && P1 == ICmpInst::ICMP_NE && util::dc(DT, I, x3) && (ult(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateTrunc(x3, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3189, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1099 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %newvar5:i1 = var ; newvar5 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %3:i8 = select %newvar5, %symconst_1, 0:i8 | |
| %4:i8 = or %symconst_3, %3 | |
| infer %4 | |
| %5:i8 = or %symconst_3, %symconst_1 | |
| %6:i8 = select %newvar5, %5, %symconst_3 | |
| result %6 | |
| C3 | (select newvar5 C1 0) | |
| => | |
| select newvar5 (C3 | C1) C3 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1099) && match(I, m_c_Or(m_Constant(&x2), m_Select(m_Value(x1), m_Constant(&x0), m_Zero())))) { | |
| if (util::check_width(x1,1) && util::dc(DT, I, x1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSelect(x1, B->CreateOr(x2, x0), x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1099, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2748 | |
| %newvar1:i1 = var ; newvar1 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %3:i32 = select %newvar1, %symconst_1, %symconst_2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = trunc %symconst_2 | |
| %7:i8 = select %newvar1, %5, %6 | |
| result %7 | |
| trunc((select newvar1 C1 C2)) | |
| => | |
| select newvar1 trunc(C1) trunc(C2) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2748) && match(I, m_Trunc(m_Select(m_Value(x3), m_Constant(&x2), m_Constant(&x1))))) { | |
| if (util::check_width(x3,1) && util::dc(DT, I, x3)) { | |
| auto ret = B->CreateSelect(x3, B->CreateTrunc(x2, T(8, B)), B->CreateTrunc(x1, T(8, B))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2748, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1669 | |
| %v0:i32 = var ; v0 | |
| %newvar0:i32 = var ; newvar0 | |
| %2:i32 = shl 1:i32, %newvar0 | |
| %3:i32 = and %v0, %2 | |
| %4:i1 = ne 0:i32, %3 | |
| %5:i32 = select %4, 1:i32, 0:i32 | |
| infer %5 | |
| %6:i32 = lshr %3, %newvar0 | |
| result %6 | |
| select ((v0 & (1 << newvar0)) != 0) 1 0 | |
| => | |
| (v0 & (1 << newvar0)) >>l newvar0 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x1 = nullptr, *x0 = nullptr, *x3 = nullptr, *x2 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1669) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), &x2 <<= m_c_And(m_Value(x1), &x3 <<= m_Shl(&x4 <<= m_ExtInt("1", 32), m_Value(x0)))), &x4 <<= m_ExtInt("1", 32), m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x1) && util::dc(DT, I, x3) && util::dc(DT, I, x0)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateLShr(x2, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1669, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1097 | |
| %newvar0:i8 = var ; newvar0 | |
| %1:i8 = or 0:i8, %newvar0 | |
| infer %1 | |
| result %newvar0 | |
| newvar0 | 0 | |
| => | |
| newvar0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| if (util::filter(F, 1097) && match(I, m_c_Or(m_Zero(), m_Value(x0)))) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(1097, 1); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 2696 | |
| %newvar1:i1 = var ; newvar1 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %3:i32 = select %newvar1, %symconst_1, %symconst_2 | |
| %4:i64 = sext %3 | |
| infer %4 | |
| %5:i64 = sext %symconst_1 | |
| %6:i64 = sext %symconst_2 | |
| %7:i64 = select %newvar1, %5, %6 | |
| result %7 | |
| sext((select newvar1 C1 C2)) | |
| => | |
| select newvar1 sext(C1) sext(C2) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2696) && match(I, m_SExt(m_Select(m_Value(x3), m_Constant(&x2), m_Constant(&x1))))) { | |
| if (util::check_width(x3,1) && util::dc(DT, I, x3)) { | |
| auto ret = B->CreateSelect(x3, B->CreateSExt(x2, T(64, B)), B->CreateSExt(x1, T(64, B))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2696, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2626 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %2:i64 = zext %1 | |
| infer %2 | |
| %3:i64 = zext %v0 | |
| result %3 | |
| zext(zext(v0)) | |
| => | |
| zext(v0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2626) && match(I, m_ZExt(m_ZExt(m_Value(x2))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateZExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2626, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3244 | |
| %v0:i1 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %newvar52:i1 = var ; newvar52 | |
| %3:i32 = zext %newvar52 | |
| %4:i32 = xor %1, %3 | |
| %5:i1 = ne 0:i32, %4 | |
| infer %5 | |
| %6:i1 = xor %v0, %newvar52 | |
| result %6 | |
| (zext(v0) ^ zext(newvar52)) != 0 | |
| => | |
| v0 ^ newvar52 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3244) && match(I, m_c_ICmp(P0, m_Zero(), m_c_Xor(m_ZExt(m_Value(x3)), m_ZExt(m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x3,1) && util::check_width(x1,1) && util::dc(DT, I, x3) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateXor(x3, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3244, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 263 | |
| %v0:i8 = var ; v0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = add %v0, %symconst_1 | |
| %3:i8 = sub %2, %symconst_1 | |
| infer %3 | |
| result %v0 | |
| (v0 + C1) - C1 | |
| => | |
| v0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 263) && match(I, m_Sub(m_c_Add(m_Value(x1), m_Constant(&x0)), m_Deferred(x0)))) { | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(263, 2); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 1247 | |
| %newvar4:i1 = var ; newvar4 | |
| %1:i1 = xor 1:i1, %newvar4 | |
| %2:i1 = xor 1:i1, %1 | |
| infer %2 | |
| result %newvar4 | |
| ~~newvar4 | |
| => | |
| newvar4 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1247) && match(I, m_c_Xor(m_AllOnes(), m_c_Xor(m_AllOnes(), m_Value(x2))))) { | |
| if (util::check_width(x2,1)) { | |
| auto ret = x2; | |
| if (util::check_width(ret, I)) { | |
| St.hit(1247, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2746 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = sext %v0 | |
| %2:i8 = trunc %1 | |
| infer %2 | |
| result %v0 | |
| trunc(sext(v0)) | |
| => | |
| v0 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2746) && match(I, m_Trunc(m_SExt(m_Value(x2))))) { | |
| auto ret = x2; | |
| if (util::check_width(ret, I)) { | |
| St.hit(2746, 2); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 2482 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = and 1:i32, %v0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i32 = select %2, 1:i32, 0:i32 | |
| %4:i1 = ne 0:i32, %3 | |
| %5:i1 = xor 1:i1, %4 | |
| %6:i32 = zext %5 | |
| infer %6 | |
| %7:i32 = sub 1:i32, %1 | |
| result %7 | |
| zext(~((select ((v0 & 1) != 0) 1 0) != 0)) | |
| => | |
| 1 - (v0 & 1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x5 = nullptr, *x2 = nullptr, *x4 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P1, P0; | |
| if (util::filter(F, 2482) && match(I, m_ZExt(m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Zero(), m_Select(m_c_ICmp(P1, m_Zero(), &x4 <<= m_c_And(&x5 <<= m_ExtInt("1", 32), m_Value(x2))), &x5 <<= m_ExtInt("1", 32), m_Zero())))))) { | |
| if (P0 == ICmpInst::ICMP_NE && P1 == ICmpInst::ICMP_NE && util::dc(DT, I, x4) && util::dc(DT, I, x2)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateSub(C0(x4), x4); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2482, 6); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2097 | |
| %newvar0:i8 = var ; newvar0 | |
| %1:i8 = and 1:i8, %newvar0 | |
| %2:i1 = ne 0:i8, %1 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %4:i8 = select %2, %symconst_3, 0:i8 | |
| infer %4 | |
| %5:i8 = mul %symconst_3, %1 | |
| result %5 | |
| select ((newvar0 & 1) != 0) C3 0 | |
| => | |
| C3 * (newvar0 & 1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x1 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2097) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), &x2 <<= m_c_And(&x3 <<= m_ExtInt("1", 8), m_Value(x1))), m_Constant(&x0), m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto C0 = C(8, 1, B); | |
| auto ret = B->CreateMul(x2, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2097, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2840 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %newvar1:i8 = var ; newvar1 | |
| %2:i32 = zext %newvar1 | |
| %3:i32 = add %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = add %newvar1, %5 | |
| result %6 | |
| trunc((C1 + zext(newvar1))) | |
| => | |
| newvar1 + trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2840) && match(I, m_Trunc(m_c_Add(m_Constant(&x3), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAdd(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2840, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2862 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = sext %v0 | |
| %3:i32 = add %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = add %v0, %5 | |
| result %6 | |
| trunc((C1 + sext(v0))) | |
| => | |
| v0 + trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2862) && match(I, m_Trunc(m_c_Add(m_Constant(&x3), m_SExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAdd(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2862, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2438 | |
| %symconst_1:i4 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i4 = trunc %v0 | |
| %3:i4 = and %symconst_1, %2 | |
| %4:i8 = zext %3 | |
| infer %4 | |
| %5:i8 = zext %symconst_1 | |
| %6:i8 = and %v0, %5 | |
| result %6 | |
| zext((C1 & trunc(v0))) | |
| => | |
| v0 & zext(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2438) && match(I, m_ZExt(m_c_And(m_Constant(&x3), m_Trunc(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAnd(x2, B->CreateZExt(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2438, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 878 | |
| %symconst_2:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11111) ; symconst_2 | |
| %1:i32 = width %symconst_2 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %symconst_1:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11) ; symconst_1 | |
| %4:i32 = width %symconst_1 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %newvar2:i8 = var ; newvar2 | |
| %7:i8 = width %newvar2 | |
| %8:i1 = eq 8:i8, %7 | |
| pc %8 1:i1 | |
| %9:i32 = zext %newvar2 | |
| %10:i32 = width %9 | |
| %11:i1 = eq 32:i32, %10 | |
| pc %11 1:i1 | |
| %12:i32 = ashr %9, %symconst_1 | |
| %13:i32 = and %symconst_2, %12 | |
| infer %13 | |
| result %12 | |
| width(C2 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11111)) == 32 && | |
| width(C1 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11)) == 32 && | |
| width(newvar2) == 8 && | |
| let var0 = zext(newvar2); | |
| width(var0) == 32 | |
| |= | |
| let var1 = (var0 >>a C1); | |
| C2 & var1 | |
| => | |
| var1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr; | |
| if (util::filter(F, 878) && match(I, m_c_And(m_Constant(&x4), &x5 <<= m_AShr(&x1 <<= m_ZExt(m_Value(x2)), m_Constant(&x3))))) { | |
| if (util::dc(DT, I, x1) && util::dc(DT, I, x2) && util::dc(DT, I, x3) && util::k1(x4, "11111", 32) && util::k1(x3, "11", 32) && util::check_width(x4,32) && util::check_width(x3,32) && util::check_width(x2,8) && util::check_width(x1,32)) { | |
| auto ret = x5; | |
| if (util::check_width(ret, I)) { | |
| St.hit(878, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1212 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i1 = ne %symconst_1, %symconst_2 | |
| pc %2 1:i1 | |
| %newvar0:i8 = var ; newvar0 | |
| %4:i1 = ne %symconst_1, %newvar0 | |
| %5:i8 = select %4, %symconst_2, %symconst_1 | |
| %6:i1 = ne %symconst_1, %5 | |
| %7:i1 = xor 1:i1, %6 | |
| infer %7 | |
| %8:i1 = eq %symconst_1, %newvar0 | |
| result %8 | |
| C2 != C1 | |
| |= | |
| ~(C1 != (select (C1 != newvar0) C2 C1)) | |
| => | |
| C1 == newvar0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P1, P0; | |
| if (util::filter(F, 1212) && match(I, m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Constant(&x2), m_Select(m_c_ICmp(P1, m_Deferred(x2), m_Value(x4)), m_Constant(&x1), m_Deferred(x2)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && P1 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x4) && (ne(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x2, x4); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1212, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2750 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %newvar1:i8 = var ; newvar1 | |
| %3:i32 = zext %newvar1 | |
| %4:i32 = or %1, %3 | |
| %5:i8 = trunc %4 | |
| infer %5 | |
| %6:i8 = or %v0, %newvar1 | |
| result %6 | |
| trunc((zext(v0) | zext(newvar1))) | |
| => | |
| v0 | newvar1 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2750) && match(I, m_Trunc(m_c_Or(m_ZExt(m_Value(x4)), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x4) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateOr(x4, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2750, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2720 | |
| %symconst_1:i4 = var ; symconst_1 | |
| %newvar0:i4 = var ; newvar0 | |
| %2:i4 = add %symconst_1, %newvar0 | |
| %3:i4 = subnsw %2, %symconst_1 | |
| %4:i8 = sext %3 | |
| infer %4 | |
| %5:i8 = sext %newvar0 | |
| result %5 | |
| sext(((C1 + newvar0) -nsw C1)) | |
| => | |
| sext(newvar0) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2720) && match(I, m_SExt(m_NSWSub(m_c_Add(m_Constant(&x1), m_Value(x2)), m_Deferred(x1))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2720, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2365 | |
| %newvar3:i1 = var ; newvar3 | |
| %1:i32 = zext %newvar3 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i32 = zext %2 | |
| infer %3 | |
| result %1 | |
| zext((zext(newvar3) != 0)) | |
| => | |
| zext(newvar3) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2365) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), &x1 <<= m_ZExt(m_Value(x2)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x2,1) && util::dc(DT, I, x2)) { | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(2365, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 612 | |
| %symconst_3:i32 = var ; symconst_3 | |
| %symDF_K1:i32 = var ; symDF_K1 | |
| %2:i1 = knownones %symconst_3, %symDF_K1 | |
| pc %2 1:i1 | |
| %symconst_5:i32 = var ; symconst_5 | |
| %4:i1 = knownones %symDF_K1, %symconst_5 | |
| pc %4 1:i1 | |
| %newvar0:i32 = var ; newvar0 | |
| %6:i32 = and %symconst_3, %newvar0 | |
| %7:i32 = and %symconst_5, %6 | |
| infer %7 | |
| %8:i32 = and %symconst_5, %newvar0 | |
| result %8 | |
| symconst_3.k1 <<=1 C5 | |
| |= | |
| let var0 = (C3 & newvar0); | |
| C5 & var0 | |
| => | |
| C5 & newvar0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr, *x6 = nullptr; | |
| if (util::filter(F, 612) && match(I, m_c_And(m_Constant(&x2), m_c_And(m_Constant(&x5), m_Value(x6))))) { | |
| if (util::symk1bind(x5, x3, B) && util::dc(DT, I, x2) && util::dc(DT, I, x6) && util::symk1test(x3, x2)) { | |
| auto ret = B->CreateAnd(x2, x6); | |
| if (util::check_width(ret, I)) { | |
| St.hit(612, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2318 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = and 1:i32, %v0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i32 = select %2, 1:i32, 0:i32 | |
| %4:i1 = ne 0:i32, %3 | |
| %5:i8 = zext %4 | |
| infer %5 | |
| %6:i8 = trunc %1 | |
| result %6 | |
| zext(((select ((v0 & 1) != 0) 1 0) != 0)) | |
| => | |
| trunc((v0 & 1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x1 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P1, P0; | |
| if (util::filter(F, 2318) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), m_Select(m_c_ICmp(P1, m_Zero(), &x2 <<= m_c_And(&x3 <<= m_ExtInt("1", 32), m_Value(x1))), &x3 <<= m_ExtInt("1", 32), m_Zero()))))) { | |
| if (P0 == ICmpInst::ICMP_NE && P1 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x1)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateTrunc(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2318, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1122 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = xor 255:i8, %symconst_1 | |
| %3:i1 = eq %symconst_2, %2 | |
| pc %3 1:i1 | |
| %v0:i8 = var ; v0 | |
| %5:i8 = and %symconst_2, %v0 | |
| %6:i8 = or %symconst_1, %5 | |
| infer %6 | |
| %7:i8 = or %symconst_1, %v0 | |
| result %7 | |
| C2 == ~C1 | |
| |= | |
| C1 | (v0 & C2) | |
| => | |
| v0 | C1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| if (util::filter(F, 1122) && match(I, m_c_Or(m_Constant(&x1), m_c_And(m_Constant(&x2), m_Value(x3))))) { | |
| if (util::dc(DT, I, x1) && util::dc(DT, I, x3) && (eq(util::V(x2), flip(util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateOr(x1, x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1122, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1237 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = and %symconst_1, %v0 | |
| %3:i1 = eq %symconst_1, %2 | |
| %4:i1 = xor 1:i1, %3 | |
| infer %4 | |
| %5:i1 = ult %2, %symconst_1 | |
| result %5 | |
| ~(C1 == (v0 & C1)) | |
| => | |
| (v0 & C1) <u C1 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1237) && match(I, m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Constant(&x2), &x4 <<= m_c_And(m_Deferred(x2), m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x4) && util::dc(DT, I, x2) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULT, x4, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1237, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3968 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symDF_K1:i32 = var ; symDF_K1 | |
| %2:i1 = knownones %symconst_1, %symDF_K1 | |
| pc %2 1:i1 | |
| %symDF_DB:i32 = var ; symDF_DB | |
| %4:i1 = knownones %symDF_K1, %symDF_DB | |
| pc %4 1:i1 | |
| %v0:i32 = var ; v0 | |
| %newvar0:i32 = var ; newvar0 | |
| %7:i32 = and %symconst_1, %newvar0 | |
| %8:i32 = or %v0, %7 | |
| %9:i32 = demandedmask %8, %symDF_DB | |
| infer %9 | |
| %10:i32 = or %v0, %newvar0 | |
| %11:i32 = demandedmask %10, %symDF_DB | |
| result %11 | |
| symconst_1.k1 <<=1 @db | |
| |= | |
| let var1 = (C1 & newvar0); | |
| let var0 = v0 | var1; | |
| var0 | |
| => | |
| let var2 = v0 | newvar0; | |
| var2 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr, *x7 = nullptr, *x6 = nullptr; | |
| if (util::filter(F, 3968) && match(I, m_c_Or(m_Value(x7), m_c_And(m_Constant(&x5), m_Value(x6))))) { | |
| if (util::symk1bind(x5, x3, B) && util::symdb(DB, I, x2, B) && util::dc(DT, I, x2) && util::symk1test(x3, x2)) { | |
| auto ret = B->CreateOr(x7, x6); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3968, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3156 | |
| %symconst_5:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11010) ; symconst_5 | |
| %1:i32 = width %symconst_5 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %v0:i32 = var ; v0 | |
| %4:i32 = width %v0 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %6:i32 = and 469762048:i32, %v0 | |
| %7:i32 = lshr %6, %symconst_5 | |
| %8:i1 = eq 7:i32, %7 | |
| infer %8 | |
| %9:i1 = eq 469762048:i32, %6 | |
| result %9 | |
| width(C5 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11010)) == 32 && | |
| width(v0) == 32 | |
| |= | |
| let var1 = (v0 & 0x1C000000); | |
| let var0 = (var1 >>l C5); | |
| var0 == 7 | |
| => | |
| var1 == 0x1C000000 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3156) && match(I, m_c_ICmp(P0, m_ExtInt("7", 32), m_LShr(&x3 <<= m_c_And(m_Value(x1), &x4 <<= m_ExtInt("469762048", 32)), m_Constant(&x2))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x3) && util::dc(DT, I, x1) && util::k1(x2, "11010", 32) && util::k0(x2, "101", 32) && util::check_width(x2,32) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 469762048, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, C0(x3), x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3156, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 19 | |
| %v0:i64 = var (range=[0,1)) ; v0 | |
| %symconst_1:i64 = var ; symconst_1 | |
| %2:i64 = add %v0, %symconst_1 | |
| infer %2 | |
| result %symconst_1 | |
| v0 (range=[0,1)) + C1 | |
| => | |
| C1 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 19) && match(I, m_c_Add(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::cr(x1, "0", "1")) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(19, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1978 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = and 536870912:i32, %v0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i32 = select %2, 536870912:i32, 0:i32 | |
| infer %3 | |
| result %1 | |
| select ((v0 & 0x20000000) != 0) 0x20000000 0 | |
| => | |
| v0 & 0x20000000 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x0 = nullptr, *x1 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1978) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), &x1 <<= m_c_And(&x2 <<= m_ExtInt("536870912", 32), m_Value(x0))), &x2 <<= m_ExtInt("536870912", 32), m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x0)) { | |
| auto C0 = C(32, 536870912, B); | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(1978, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2793 | |
| %v0:i16 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %v3:i16 = var ; v3 | |
| %3:i32 = zext %v3 | |
| %4:i32 = add %1, %3 | |
| %5:i16 = trunc %4 | |
| infer %5 | |
| %6:i16 = add %v0, %v3 | |
| result %6 | |
| trunc((zext(v0) + zext(v3))) | |
| => | |
| v3 + v0 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2793) && match(I, m_Trunc(m_c_Add(m_ZExt(m_Value(x4)), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x4) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAdd(x4, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2793, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 884 | |
| %v0:i8 = var ; v0 | |
| %symDF_K0:i8 = var ; symDF_K0 | |
| %2:i1 = knownzeros %v0, %symDF_K0 | |
| pc %2 1:i1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %4:i8 = xor 255:i8, %symDF_K0 | |
| %5:i1 = eq %symconst_2, %4 | |
| pc %5 1:i1 | |
| %6:i8 = and %v0, %symconst_2 | |
| infer %6 | |
| result %v0 | |
| C2 == ~v0.k0 | |
| |= | |
| v0 & C2 | |
| => | |
| v0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x4 = nullptr, *x1 = nullptr, *x3 = nullptr, *x2 = nullptr; | |
| if (util::filter(F, 884) && match(I, m_c_And(m_Value(x4), m_Constant(&x2)))) { | |
| if (util::symk0bind(x4, x1, B) && (eq(util::V(x2), flip(util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto ret = x4; | |
| if (util::check_width(ret, I)) { | |
| St.hit(884, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3356 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %newvar1:i1 = var ; newvar1 | |
| %3:i32 = zext %newvar1 | |
| %4:i1 = ne %1, %3 | |
| infer %4 | |
| %5:i1 = xor %newvar0, %newvar1 | |
| result %5 | |
| zext(newvar0) != zext(newvar1) | |
| => | |
| newvar1 ^ newvar0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3356) && match(I, m_c_ICmp(P0, m_ZExt(m_Value(x3)), m_ZExt(m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x3,1) && util::check_width(x1,1) && util::dc(DT, I, x3) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateXor(x3, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3356, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 251 | |
| %v0:i64 = var ; v0 | |
| %v1:i64 = var ; v1 | |
| %2:i64 = sub %v0, %v1 | |
| %3:i64 = sub 0:i64, %2 | |
| infer %3 | |
| %4:i64 = sub %v1, %v0 | |
| result %4 | |
| 0 - (v0 - v1) | |
| => | |
| v1 - v0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 251) && match(I, m_Sub(m_Zero(), m_Sub(m_Value(x1), m_Value(x0))))) { | |
| if (util::dc(DT, I, x0) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateSub(x0, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(251, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 471 | |
| %newvar0:i32 = var ; newvar0 | |
| %1:i32 = width %newvar0 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %symconst_5:i32 = var (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) ; symconst_5 | |
| %4:i32 = width %symconst_5 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %6:i32 = and %newvar0, %symconst_5 | |
| %7:i32 = mul 2:i32, %6 | |
| %8:i32 = add 1:i32, %7 | |
| %9:i32 = udiv %8, 8:i32 | |
| infer %9 | |
| %10:i32 = ashr %6, 2:i32 | |
| result %10 | |
| width(newvar0) == 32 && | |
| width(C5 (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)) == 32 | |
| |= | |
| let var2 = (C5 & newvar0); | |
| let var1 = (var2 * 2); | |
| let var0 = (var1 + 1); | |
| var0 /u 8 | |
| => | |
| var2 >>a 2 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| if (util::filter(F, 471) && match(I, m_UDiv(m_c_Add(m_ExtInt("1", 32), m_c_Mul(&x3 <<= m_ExtInt("2", 32), &x4 <<= m_c_And(m_Value(x2), m_Constant(&x1)))), m_ExtInt("8", 32)))) { | |
| if (util::dc(DT, I, x4) && util::dc(DT, I, x2) && util::dc(DT, I, x1) && util::k0(x1, "10000000000000000000000000000000", 32) && util::check_width(x2,32) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 2, B); | |
| auto ret = B->CreateAShr(x4, C0(x4)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(471, 6); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2903 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %1:i1 = ult 0:i32, %symconst_1 | |
| %v0:i8 = var ; v0 | |
| %3:i8 = width %v0 | |
| %4:i32 = zext %3 | |
| %5:i1 = ult %symconst_1, %4 | |
| %6:i1 = and %1, %5 | |
| pc %6 1:i1 | |
| %7:i32 = zext %v0 | |
| %8:i32 = ashr %7, %symconst_1 | |
| %9:i8 = trunc %8 | |
| infer %9 | |
| %10:i8 = trunc %symconst_1 | |
| %11:i8 = lshr %v0, %10 | |
| result %11 | |
| (0 <u C1) & (C1 <u zext(width(v0))) | |
| |= | |
| trunc((zext(v0) >>a C1)) | |
| => | |
| v0 >>l trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x6 = nullptr, *x5 = nullptr; | |
| if (util::filter(F, 2903) && match(I, m_Trunc(m_AShr(m_ZExt(m_Value(x3)), m_Constant(&x4))))) { | |
| if (util::dc(DT, I, x3) && ((ult(llvm::APInt(32, 0), util::V(x4)) & ult(util::V(x4), util::W(x3).zext(64))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateLShr(x3, B->CreateTrunc(x4, T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2903, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 293 | |
| %v0:i8 = var ; v0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = add %v0, %symconst_1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %4:i8 = sub %2, %symconst_2 | |
| infer %4 | |
| %5:i8 = sub %symconst_1, %symconst_2 | |
| %6:i8 = add %v0, %5 | |
| result %6 | |
| (v0 + C1) - C2 | |
| => | |
| v0 + (C1 - C2) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 293) && match(I, m_Sub(m_c_Add(m_Value(x2), m_Constant(&x1)), m_Constant(&x0)))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAdd(x2, B->CreateSub(x1, x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(293, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3182 | |
| %newvar0:i32 = var ; newvar0 | |
| %symDF_K0:i32 = var ; symDF_K0 | |
| %2:i1 = knownzeros %newvar0, %symDF_K0 | |
| pc %2 1:i1 | |
| %symconst_4:i32 = var ; symconst_4 | |
| %4:i1 = knownones %symDF_K0, %symconst_4 | |
| pc %4 1:i1 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %6:i32 = and %newvar0, %symconst_4 | |
| %7:i1 = ne %symconst_1, %6 | |
| infer %7 | |
| %8:i32 = sub %symconst_1, 1:i32 | |
| %9:i1 = ult %8, %symconst_1 | |
| result %9 | |
| newvar0.k0 <<=1 C4 | |
| |= | |
| let var0 = (C4 & newvar0); | |
| C1 != var0 | |
| => | |
| let var1 = (C1 - 1); | |
| var1 <u C1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr, *x6 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3182) && match(I, m_c_ICmp(P0, m_Constant(&x6), m_c_And(m_Value(x5), m_Constant(&x2))))) { | |
| if (util::symk0bind(x5, x3, B) && P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x6) && util::symk1test(x3, x2)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULT, B->CreateSub(x6, C0(x6)), x6); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3182, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2895 | |
| %newvar0:i64 = var ; newvar0 | |
| %1:i32 = trunc %newvar0 | |
| %2:i16 = trunc %1 | |
| infer %2 | |
| %3:i16 = trunc %newvar0 | |
| result %3 | |
| trunc(trunc(newvar0)) | |
| => | |
| trunc(newvar0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2895) && match(I, m_Trunc(m_Trunc(m_Value(x2))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateTrunc(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2895, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2817 | |
| %newvar0:i8 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %3:i32 = sub %1, %symconst_1 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i32 = sub 0:i32, %symconst_1 | |
| %6:i8 = trunc %5 | |
| %7:i8 = add %newvar0, %6 | |
| result %7 | |
| trunc((zext(newvar0) - C1)) | |
| => | |
| newvar0 + trunc((0 - C1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2817) && match(I, m_Trunc(m_Sub(m_ZExt(m_Value(x3)), m_Constant(&x1))))) { | |
| if (util::dc(DT, I, x3)) { | |
| auto C0 = C(32, 0, B); | |
| auto ret = B->CreateAdd(x3, B->CreateTrunc(B->CreateSub(C0(x1), x1), T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2817, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2731 | |
| %v0:i16 = var ; v0 | |
| %1:i32 = zext %v0 (hasExternalUses) | |
| %v2:i16 = var ; v2 | |
| %3:i32 = zext %v2 | |
| %4:i32 = and %1, %3 | |
| %5:i16 = trunc %4 | |
| infer %5 | |
| %6:i16 = and %v0, %v2 | |
| result %6 | |
| trunc((zext(v0) & zext(v2))) | |
| => | |
| v2 & v0 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2731) && match(I, m_Trunc(m_c_And(m_ZExt(m_Value(x4)), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x4) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAnd(x4, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2731, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1502 | |
| %newvar0:i1 = var ; newvar0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = select %newvar0, %symconst_1, %symconst_1 | |
| infer %2 | |
| result %symconst_1 | |
| select newvar0 C1 C1 | |
| => | |
| C1 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1502) && match(I, m_Select(m_Value(x1), m_Constant(&x0), m_Deferred(x0)))) { | |
| if (util::check_width(x1,1)) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(1502, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3604 | |
| %v5:i16 = var ; v5 | |
| %1:i32 = zext %v5 | |
| %v0:i16 = var ; v0 | |
| %3:i32 = zext %v0 (hasExternalUses) | |
| %4:i1 = slt %1, %3 | |
| infer %4 | |
| %5:i1 = ult %v5, %v0 | |
| result %5 | |
| zext(v5) <s zext(v0) | |
| => | |
| v5 <u v0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3604) && match(I, m_ICmp(P0, m_ZExt(m_Value(x3)), m_ZExt(m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_SLT && util::dc(DT, I, x3) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULT, x3, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3604, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2791 | |
| %symconst_3:i32 = var ; symconst_3 | |
| %newvar0:i1 = var ; newvar0 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %4:i32 = select %newvar0, %symconst_1, %symconst_2 | |
| %5:i32 = or %symconst_3, %4 | |
| %6:i8 = trunc %5 | |
| infer %6 | |
| %7:i32 = select 1:i1, %symconst_1, %symconst_2 | |
| %8:i32 = or %symconst_3, %7 | |
| %9:i8 = trunc %8 | |
| %10:i32 = select 0:i1, %symconst_1, %symconst_2 | |
| %11:i32 = or %symconst_3, %10 | |
| %12:i8 = trunc %11 | |
| %13:i8 = select %newvar0, %9, %12 | |
| result %13 | |
| trunc((C3 | (select newvar0 C1 C2))) | |
| => | |
| select newvar0 trunc((C3 | (select 1 C1 C2))) trunc((C3 | (select 0 C1 C2))) | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2791) && match(I, m_Trunc(m_c_Or(m_Constant(&x4), m_Select(m_Value(x3), m_Constant(&x2), m_Constant(&x1)))))) { | |
| if (util::check_width(x3,1) && util::dc(DT, I, x3)) { | |
| auto C0 = C(1, -1, B); | |
| auto C1 = C(1, 0, B); | |
| auto ret = B->CreateSelect(x3, B->CreateTrunc(B->CreateOr(x4, B->CreateSelect(C0(), x2, x1)), T(8, B)), B->CreateTrunc(B->CreateOr(x4, B->CreateSelect(C1(), x2, x1)), T(8, B))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2791, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2542 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i8 = zext %2 | |
| infer %3 | |
| %4:i8 = zext %newvar0 | |
| result %4 | |
| zext((zext(newvar0) != 0)) | |
| => | |
| zext(newvar0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2542) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), m_ZExt(m_Value(x2)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x2,1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateZExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2542, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1451 | |
| %v0:i32 = var ; v0 | |
| %symconst_3:i32 = var (knownBits=11111111xxxxxxxxxxxxxxxxxxxxxxxx) ; symconst_3 | |
| %2:i32 = and %v0, %symconst_3 | |
| %symconst_4:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11xxx) ; symconst_4 | |
| %4:i32 = lshr %2, %symconst_4 | |
| infer %4 | |
| %5:i32 = lshr %v0, %symconst_4 | |
| result %5 | |
| (v0 & C3 (knownBits=11111111xxxxxxxxxxxxxxxxxxxxxxxx)) >>l C4 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11xxx) | |
| => | |
| v0 >>l C4 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1451) && match(I, m_LShr(m_c_And(m_Value(x2), m_Constant(&x1)), m_Constant(&x0)))) { | |
| if (util::dc(DT, I, x2) && util::dc(DT, I, x0) && util::k1(x1, "11111111000000000000000000000000", 32) && util::k1(x0, "11000", 32)) { | |
| auto ret = B->CreateLShr(x2, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1451, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3165 | |
| %newvar0:i64 = var ; newvar0 | |
| %newvar5:i64 = var ; newvar5 | |
| %2:i64 = sub %newvar0, %newvar5 | |
| %3:i1 = eq 0:i64, %2 | |
| infer %3 | |
| %4:i1 = eq %newvar0, %newvar5 | |
| result %4 | |
| (newvar0 - newvar5) == 0 | |
| => | |
| newvar5 == newvar0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3165) && match(I, m_c_ICmp(P0, m_Zero(), m_Sub(m_Value(x1), m_Value(x0))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x1, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3165, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3991 | |
| %symDF_DB:i32 = var ; symDF_DB | |
| %symconst_3:i32 = var ; symconst_3 | |
| %2:i1 = knownzeros %symDF_DB, %symconst_3 | |
| pc %2 1:i1 | |
| %v0:i32 = var ; v0 | |
| %4:i32 = and %symconst_3, %v0 | |
| %5:i32 = demandedmask %4, %symDF_DB | |
| infer %5 | |
| %6:i32 = demandedmask 0:i32, %symDF_DB | |
| result %6 | |
| @db <<=0 C3 | |
| |= | |
| v0 & C3 | |
| => | |
| 0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| if (util::filter(F, 3991) && match(I, m_c_And(m_Constant(&x2), m_Value(x4)))) { | |
| if (util::symdb(DB, I, x3, B) && util::dc(DT, I, x3) && util::symk0test(x3, x2)) { | |
| auto C0 = C(32, 0, B); | |
| auto ret = C0(I); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3991, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1295 | |
| %newvar2:i64 = var ; newvar2 | |
| %1:i64 = and 18446744073709551615:i64, %newvar2 | |
| %2:i64 = xor 18446744073709551615:i64, %1 | |
| infer %2 | |
| %3:i64 = sub 18446744073709551615:i64, %newvar2 | |
| result %3 | |
| ~(newvar2 & 0xFFFFFFFFFFFFFFFF) | |
| => | |
| 0xFFFFFFFFFFFFFFFF - newvar2 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1295) && match(I, m_c_Xor(&x1 <<= m_AllOnes(), m_c_And(&x1 <<= m_AllOnes(), m_Value(x0))))) { | |
| if (util::dc(DT, I, x0)) { | |
| auto C0 = C(64, -1, B); | |
| auto ret = B->CreateSub(C0(x0), x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1295, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1271 | |
| %v0:i32 = var (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) ; v0 | |
| %1:i1 = eq 0:i32, %v0 | |
| %2:i1 = xor 1:i1, %1 | |
| infer %2 | |
| %3:i1 = slt 0:i32, %v0 | |
| result %3 | |
| ~(v0 (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) == 0) | |
| => | |
| 0 <s v0 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x3 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1271) && match(I, m_c_Xor(m_AllOnes(), m_c_ICmp(P0, &x3 <<= m_Zero(), m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x1) && util::k0(x1, "10000000000000000000000000000000", 32)) { | |
| auto C0 = C(32, 0, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_SLT, C0(x1), x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1271, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 772 | |
| %newvar0:i32 = var ; newvar0 | |
| %symDF_K0:i32 = var ; symDF_K0 | |
| %2:i1 = knownzeros %newvar0, %symDF_K0 | |
| pc %2 1:i1 | |
| %symconst_3:i32 = var ; symconst_3 | |
| %4:i1 = knownones %symDF_K0, %symconst_3 | |
| pc %4 1:i1 | |
| %5:i32 = and %newvar0, %symconst_3 | |
| infer %5 | |
| result 0:i32 | |
| newvar0.k0 <<=1 C3 | |
| |= | |
| C3 & newvar0 | |
| => | |
| 0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 772) && match(I, m_c_And(m_Value(x5), m_Constant(&x2)))) { | |
| if (util::symk0bind(x5, x3, B) && util::symk1test(x3, x2)) { | |
| auto C0 = C(32, 0, B); | |
| auto ret = C0(I); | |
| if (util::check_width(ret, I)) { | |
| St.hit(772, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3368 | |
| %newvar0:i8 = var ; newvar0 | |
| %1:i1 = ne %newvar0, %newvar0 | |
| infer %1 | |
| %2:i1 = ne 0:i8, 0:i8 | |
| result %2 | |
| newvar0 != newvar0 | |
| => | |
| 0 != 0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3368) && match(I, m_c_ICmp(P0, m_Value(x0), m_Deferred(x0)))) { | |
| if (P0 == ICmpInst::ICMP_NE) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_NE, C0(), C0()); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3368, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2695 | |
| %v0:i16 = var ; v0 | |
| %1:i32 = sext %v0 | |
| %2:i64 = sext %1 | |
| infer %2 | |
| %3:i64 = sext %v0 | |
| result %3 | |
| sext(sext(v0)) | |
| => | |
| sext(v0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2695) && match(I, m_SExt(m_SExt(m_Value(x2))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2695, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1723 | |
| %symconst_7:i32 = var ; symconst_7 | |
| %symconst_8:i32 = var ; symconst_8 | |
| %2:i32 = mul 2:i32, %symconst_8 | |
| %3:i1 = eq %symconst_7, %2 | |
| pc %3 1:i1 | |
| %4:i32 = width %symconst_7 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %6:i32 = width %symconst_8 | |
| %7:i1 = eq 32:i32, %6 | |
| pc %7 1:i1 | |
| %newvar0:i32 = var ; newvar0 | |
| %9:i32 = width %newvar0 | |
| %10:i1 = eq 32:i32, %9 | |
| pc %10 1:i1 | |
| %11:i32 = and 1:i32, %newvar0 | |
| %12:i1 = ne 0:i32, %11 | |
| %13:i32 = select %12, %symconst_7, %symconst_8 | |
| infer %13 | |
| %14:i32 = shl %symconst_8, %11 | |
| result %14 | |
| C7 == (C8 * 2) && | |
| width(C7) == 32 && | |
| width(C8) == 32 && | |
| width(newvar0) == 32 | |
| |= | |
| let var1 = (newvar0 & 1); | |
| let var0 = (var1 != 0); | |
| select var0 C7 C8 | |
| => | |
| C8 << var1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1723) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), &x4 <<= m_c_And(&x5 <<= m_ExtInt("1", 32), m_Value(x1))), m_Constant(&x3), m_Constant(&x2)))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x4) && util::dc(DT, I, x1) && (eq(util::V(x3), mul(llvm::APInt(32, 2), util::V(x2))) == llvm::APInt(1, 1)) && util::check_width(x3,32) && util::check_width(x2,32) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateShl(x2, x4); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1723, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 70 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i8 = mul 255:i8, %symconst_2 | |
| %3:i1 = eq %symconst_1, %2 | |
| pc %3 1:i1 | |
| %v1:i8 = var ; v1 | |
| %5:i8 = add %symconst_1, %v1 | |
| %6:i8 = add %symconst_2, %5 | |
| infer %6 | |
| result %v1 | |
| C1 == (C2 * 0xFF) | |
| |= | |
| C2 + (v1 + C1) | |
| => | |
| v1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| if (util::filter(F, 70) && match(I, m_c_Add(m_Constant(&x1), m_c_Add(m_Constant(&x2), m_Value(x3))))) { | |
| if ((eq(util::V(x2), mul(llvm::APInt(8, 255), util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto ret = x3; | |
| if (util::check_width(ret, I)) { | |
| St.hit(70, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2986 | |
| %v1:i8 = var ; v1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i8 = add %v1, %symconst_2 | |
| %3:i1 = eq 0:i8, %2 | |
| infer %3 | |
| %4:i8 = sub 0:i8, %symconst_2 | |
| %5:i1 = eq %v1, %4 | |
| result %5 | |
| (v1 + C2) == 0 | |
| => | |
| v1 == (0 - C2) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2986) && match(I, m_c_ICmp(P0, &x2 <<= m_Zero(), m_c_Add(m_Value(x1), m_Constant(&x0))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x1)) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x1, B->CreateSub(C0(x0), x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2986, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3315 | |
| %v0:i1 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %newvar5:i1 = var ; newvar5 | |
| %3:i32 = zext %newvar5 | |
| %4:i8 = trunc %3 | |
| %5:i32 = zext %4 | |
| %6:i1 = ne %1, %5 | |
| infer %6 | |
| %7:i1 = xor %v0, %newvar5 | |
| result %7 | |
| zext(v0) != zext(trunc(zext(newvar5))) | |
| => | |
| v0 ^ newvar5 | |
| */ | |
| { | |
| llvm::Value *x5 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3315) && match(I, m_c_ICmp(P0, m_ZExt(m_Value(x5)), m_ZExt(m_Trunc(m_ZExt(m_Value(x3))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x5,1) && util::check_width(x3,1) && util::dc(DT, I, x5) && util::dc(DT, I, x3)) { | |
| auto ret = B->CreateXor(x5, x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3315, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3272 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %2:i8 = trunc %1 | |
| %3:i1 = ne 0:i8, %2 | |
| infer %3 | |
| result %newvar0 | |
| trunc(zext(newvar0)) != 0 | |
| => | |
| newvar0 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3272) && match(I, m_c_ICmp(P0, m_Zero(), m_Trunc(m_ZExt(m_Value(x2)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x2,1)) { | |
| auto ret = x2; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3272, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 288 | |
| %newvar1:i32 = var ; newvar1 | |
| %1:i32 = sub %newvar1, 0:i32 | |
| infer %1 | |
| result %newvar1 | |
| newvar1 - 0 | |
| => | |
| newvar1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| if (util::filter(F, 288) && match(I, m_Sub(m_Value(x0), m_Zero()))) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(288, 1); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 2873 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = zext %v0 | |
| %3:i32 = xor %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = xor %v0, %5 | |
| result %6 | |
| trunc((C1 ^ zext(v0))) | |
| => | |
| v0 ^ trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2873) && match(I, m_Trunc(m_c_Xor(m_Constant(&x3), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateXor(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2873, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2424 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = width %v0 | |
| %3:i1 = ult %symconst_2, %2 | |
| pc %3 1:i1 | |
| %4:i8 = and %symconst_2, %v0 | |
| %5:i1 = ne 0:i8, %4 | |
| %6:i1 = xor 1:i1, %5 | |
| %7:i8 = zext %6 | |
| infer %7 | |
| %8:i8 = sub 1:i8, %symconst_2 | |
| %9:i8 = add %symconst_2, %8 | |
| %10:i8 = ashr %9, %4 | |
| result %10 | |
| C2 <u width(v0) | |
| |= | |
| let var0 = (v0 & C2); | |
| zext(~(var0 != 0)) | |
| => | |
| (C2 + (1 - C2)) >>a var0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2424) && match(I, m_ZExt(m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Zero(), &x5 <<= m_c_And(m_Constant(&x2), m_Value(x1))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x5) && util::dc(DT, I, x2) && util::dc(DT, I, x1) && (ult(util::V(x2), util::W(x1)) == llvm::APInt(1, 1))) { | |
| auto C0 = C(8, 1, B); | |
| auto ret = B->CreateAShr(B->CreateAdd(x2, B->CreateSub(C0(x2), x2)), x5); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2424, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1120 | |
| %symconst_4:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11000) ; symconst_4 | |
| %1:i32 = width %symconst_4 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %v0:i32 = var ; v0 | |
| %4:i32 = width %v0 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %symconst_6:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxx11111111) ; symconst_6 | |
| %7:i32 = width %symconst_6 | |
| %8:i1 = eq 32:i32, %7 | |
| pc %8 1:i1 | |
| %symconst_2:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx01000) ; symconst_2 | |
| %10:i32 = width %symconst_2 | |
| %11:i1 = eq 32:i32, %10 | |
| pc %11 1:i1 | |
| %symconst_3:i32 = var (knownBits=11111111xxxxxxxxxxxxxxxxxxxxxxxx) ; symconst_3 | |
| %13:i32 = width %symconst_3 | |
| %14:i1 = eq 32:i32, %13 | |
| pc %14 1:i1 | |
| %15:i32 = and 16711680:i32, %v0 | |
| %16:i32 = lshr %15, %symconst_2 | |
| %17:i32 = and %v0, %symconst_3 | |
| %18:i32 = lshr %17, %symconst_4 | |
| %19:i32 = or %16, %18 | |
| %20:i32 = and 65280:i32, %v0 | |
| %21:i32 = shl %20, %symconst_2 | |
| %22:i32 = or %19, %21 | |
| %23:i32 = and %v0, %symconst_6 | |
| %24:i32 = shl %23, %symconst_4 | |
| %25:i32 = or %22, %24 | |
| infer %25 | |
| %26:i32 = bswap %v0 | |
| result %26 | |
| width(C4 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx11000)) == 32 && | |
| width(v0) == 32 && | |
| width(C6 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxx11111111)) == 32 && | |
| width(C2 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxx01000)) == 32 && | |
| width(C3 (knownBits=11111111xxxxxxxxxxxxxxxxxxxxxxxx)) == 32 | |
| |= | |
| let var3 = (v0 & 0xFF0000); | |
| let var2 = (var3 >>l C2); | |
| let var5 = (v0 & C3); | |
| let var4 = (var5 >>l C4); | |
| let var1 = (var2 | var4); | |
| let var7 = (v0 & 0xFF00); | |
| let var6 = (var7 << C2); | |
| let var0 = (var1 | var6); | |
| let var9 = (v0 & C6); | |
| let var8 = (var9 << C4); | |
| var0 | var8 | |
| => | |
| bswap(v0) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 1120) && match(I, m_c_Or(m_c_Or(m_c_Or(m_LShr(m_c_And(m_Value(x4), m_ExtInt("16711680", 32)), m_Constant(&x2)), m_LShr(m_c_And(m_Deferred(x4), m_Constant(&x1)), m_Constant(&x5))), m_Shl(m_c_And(m_ExtInt("65280", 32), m_Deferred(x4)), m_Deferred(x2))), m_Shl(m_c_And(m_Deferred(x4), m_Constant(&x3)), m_Deferred(x5))))) { | |
| if (util::dc(DT, I, x4) && util::k1(x5, "11000", 32) && util::k0(x5, "111", 32) && util::k1(x3, "11111111", 32) && util::k1(x2, "1000", 32) && util::k0(x2, "10111", 32) && util::k1(x1, "11111111000000000000000000000000", 32) && util::check_width(x5,32) && util::check_width(x4,32) && util::check_width(x3,32) && util::check_width(x2,32) && util::check_width(x1,32)) { | |
| auto ret = B->CreateBSwap(x4); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1120, 6); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1116 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %v0:i8 = var ; v0 | |
| %3:i8 = or %symconst_2, %v0 | |
| %4:i8 = or %symconst_1, %3 | |
| infer %4 | |
| %5:i8 = or %symconst_1, %symconst_2 | |
| %6:i8 = or %v0, %5 | |
| result %6 | |
| C1 | (v0 | C2) | |
| => | |
| v0 | (C2 | C1) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1116) && match(I, m_c_Or(m_Constant(&x2), m_c_Or(m_Constant(&x1), m_Value(x0))))) { | |
| if (util::dc(DT, I, x0)) { | |
| auto ret = B->CreateOr(x0, B->CreateOr(x2, x1)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1116, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3607 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = width %v0 | |
| %3:i32 = zext %2 | |
| %4:i32 = shl 1:i32, %3 | |
| %5:i32 = sub %4, 1:i32 | |
| %6:i1 = ule %symconst_1, %5 | |
| pc %6 1:i1 | |
| %7:i32 = zext %v0 | |
| %8:i1 = slt %7, %symconst_1 | |
| infer %8 | |
| %9:i8 = trunc %symconst_1 | |
| %10:i1 = ult %v0, %9 | |
| result %10 | |
| C1 <=u ((1 << zext(width(v0))) - 1) | |
| |= | |
| zext(v0) <s C1 | |
| => | |
| v0 <u trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3607) && match(I, m_ICmp(P0, m_ZExt(m_Value(x2)), m_Constant(&x3)))) { | |
| if (P0 == ICmpInst::ICMP_SLT && util::dc(DT, I, x2) && (ule(util::V(x3), sub(shl(llvm::APInt(32, 1), util::W(x2).zext(64)), llvm::APInt(32, 1))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULT, x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3607, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2483 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = and 1:i32, %v0 | |
| %2:i1 = eq 0:i32, %1 | |
| %3:i32 = zext %2 | |
| infer %3 | |
| %4:i32 = sub 1:i32, %1 | |
| result %4 | |
| zext(((v0 & 1) == 0)) | |
| => | |
| 1 - (v0 & 1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x1 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2483) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), &x2 <<= m_c_And(&x3 <<= m_ExtInt("1", 32), m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x2) && util::dc(DT, I, x1)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateSub(C0(x2), x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2483, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 67 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = sdiv %v0, 1:i8 | |
| %3:i8 = add %symconst_2, %2 | |
| infer %3 | |
| %4:i8 = add %symconst_2, %v0 | |
| result %4 | |
| C2 + (v0 /s 1) | |
| => | |
| v0 + C2 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 67) && match(I, m_c_Add(m_Constant(&x1), m_SDiv(m_Value(x0), m_ExtInt("1", 8))))) { | |
| if (util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateAdd(x1, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(67, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 54 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %v0:i8 = var ; v0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %4:i8 = add %v0, %symconst_1 | |
| %5:i8 = add %symconst_3, %4 | |
| %6:i8 = add %symconst_2, %5 | |
| infer %6 | |
| %7:i8 = add %symconst_2, %symconst_1 | |
| %8:i8 = add %symconst_3, %7 | |
| %9:i8 = add %v0, %8 | |
| result %9 | |
| C2 + (C3 + (v0 + C1)) | |
| => | |
| v0 + (C3 + (C2 + C1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 54) && match(I, m_c_Add(m_Constant(&x3), m_c_Add(m_Constant(&x2), m_c_Add(m_Value(x1), m_Constant(&x0)))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateAdd(x1, B->CreateAdd(x2, B->CreateAdd(x3, x0))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(54, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 547 | |
| %v0:i64 = var ; v0 | |
| %1:i64 = sdiv %v0, 1:i64 | |
| infer %1 | |
| result %v0 | |
| v0 /s 1 | |
| => | |
| v0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| if (util::filter(F, 547) && match(I, m_SDiv(m_Value(x0), m_ExtInt("1", 64)))) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(547, 5); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 3965 | |
| %symconst_7:i32 = var ; symconst_7 | |
| %symDF_DB:i32 = var ; symDF_DB | |
| %symconst_8:i32 = var ; symconst_8 | |
| %3:i32 = lshr %symDF_DB, %symconst_8 | |
| %4:i1 = eq %symconst_7, %3 | |
| pc %4 1:i1 | |
| %newvar0:i32 = var ; newvar0 | |
| %6:i32 = and %symconst_7, %newvar0 | |
| %7:i32 = shl %6, %symconst_8 | |
| %8:i32 = demandedmask %7, %symDF_DB | |
| infer %8 | |
| %9:i32 = shl 1:i32, %symconst_8 | |
| %10:i32 = mul %newvar0, %9 | |
| %11:i32 = demandedmask %10, %symDF_DB | |
| result %11 | |
| C7 == (@db >>l C8) | |
| |= | |
| (C7 & newvar0) << C8 | |
| => | |
| newvar0 * (1 << C8) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| if (util::filter(F, 3965) && match(I, m_Shl(m_c_And(m_Constant(&x3), m_Value(x4)), m_Constant(&x1)))) { | |
| if (util::symdb(DB, I, x2, B) && util::dc(DT, I, x2) && (eq(util::V(x3), util::V(x2).lshr(util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateMul(x4, B->CreateShl(C0(x1), x1)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3965, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2889 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %3:i32 = shl %1, %symconst_1 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i32 = shl 1:i32, %symconst_1 | |
| %6:i8 = trunc %5 | |
| %7:i8 = mul %v0, %6 | |
| result %7 | |
| trunc((zext(v0) << C1)) | |
| => | |
| v0 * trunc((1 << C1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2889) && match(I, m_Trunc(m_Shl(m_ZExt(m_Value(x3)), m_Constant(&x1))))) { | |
| if (util::dc(DT, I, x3)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateMul(x3, B->CreateTrunc(B->CreateShl(C0(x1), x1), T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2889, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2778 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = sext %v0 | |
| %3:i32 = or %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = or %v0, %5 | |
| result %6 | |
| trunc((C1 | sext(v0))) | |
| => | |
| v0 | trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2778) && match(I, m_Trunc(m_c_Or(m_Constant(&x3), m_SExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateOr(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2778, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2744 | |
| %newvar1:i1 = var ; newvar1 | |
| %1:i32 = zext %newvar1 | |
| %2:i8 = trunc %1 | |
| infer %2 | |
| %3:i8 = zext %newvar1 | |
| result %3 | |
| trunc(zext(newvar1)) | |
| => | |
| zext(newvar1) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2744) && match(I, m_Trunc(m_ZExt(m_Value(x2))))) { | |
| if (util::check_width(x2,1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateZExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2744, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3998 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symDF_K1:i8 = var ; symDF_K1 | |
| %2:i1 = knownones %symconst_1, %symDF_K1 | |
| pc %2 1:i1 | |
| %symDF_DB:i32 = var ; symDF_DB | |
| %4:i32 = zext %symDF_K1 | |
| %5:i1 = eq %symDF_DB, %4 | |
| pc %5 1:i1 | |
| %newvar0:i8 = var ; newvar0 | |
| %7:i8 = and %symconst_1, %newvar0 | |
| %8:i32 = zext %7 | |
| %9:i8 = trunc %8 | |
| %10:i32 = zext %9 | |
| %11:i32 = demandedmask %10, %symDF_DB | |
| infer %11 | |
| %12:i32 = sext %newvar0 | |
| %13:i32 = demandedmask %12, %symDF_DB | |
| result %13 | |
| @db == zext(symconst_1.k1) | |
| |= | |
| let var3 = (C1 & newvar0); | |
| let var2 = zext(var3); | |
| let var1 = trunc(var2); | |
| let var0 = zext(var1); | |
| var0 | |
| => | |
| let var4 = sext(newvar0); | |
| var4 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x2 = nullptr, *x4 = nullptr, *x3 = nullptr, *x1 = nullptr, *x9 = nullptr, *x8 = nullptr, *x7 = nullptr, *x6 = nullptr; | |
| if (util::filter(F, 3998) && match(I, m_ZExt(m_Trunc(m_ZExt(m_c_And(m_Constant(&x5), m_Value(x9))))))) { | |
| if (util::symk1bind(x5, x2, B) && util::symdb(DB, I, x3, B) && util::dc(DT, I, x3) && (eq(util::V(x3), util::V(x2).zext(64)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateSExt(x9, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3998, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3449 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %newvar24:i1 = var ; newvar24 | |
| %3:i32 = zext %newvar24 | |
| %4:i32 = or %1, %3 | |
| %5:i1 = ne 0:i32, %4 | |
| infer %5 | |
| %6:i1 = or %newvar0, %newvar24 | |
| result %6 | |
| (zext(newvar0) | zext(newvar24)) != 0 | |
| => | |
| newvar24 | newvar0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3449) && match(I, m_c_ICmp(P0, m_Zero(), m_c_Or(m_ZExt(m_Value(x3)), m_ZExt(m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x3,1) && util::check_width(x1,1) && util::dc(DT, I, x3) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateOr(x3, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3449, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3385 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i1 = ne %symconst_1, %symconst_2 | |
| pc %2 1:i1 | |
| %v0:i1 = var ; v0 | |
| %4:i8 = select %v0, %symconst_1, %symconst_2 | |
| %5:i1 = ne %symconst_1, %4 | |
| infer %5 | |
| %6:i1 = xor 1:i1, %v0 | |
| result %6 | |
| C2 != C1 | |
| |= | |
| C1 != (select v0 C1 C2) | |
| => | |
| ~v0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3385) && match(I, m_c_ICmp(P0, m_Constant(&x2), m_Select(m_Value(x3), m_Deferred(x2), m_Constant(&x1))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x3,1) && util::dc(DT, I, x3) && (ne(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto C0 = C(1, -1, B); | |
| auto ret = B->CreateXor(C0(x3), x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3385, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2824 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %2:i16 = trunc %1 | |
| infer %2 | |
| %3:i16 = zext %v0 | |
| result %3 | |
| trunc(zext(v0)) | |
| => | |
| zext(v0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2824) && match(I, m_Trunc(m_ZExt(m_Value(x2))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateZExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2824, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 561 | |
| %newvar0:i32 = var (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) ; newvar0 | |
| %symconst_1:i32 = var (powerOfTwo) ; symconst_1 | |
| %2:i32 = sdiv %newvar0, %symconst_1 | |
| infer %2 | |
| %3:i32 = logb %symconst_1 | |
| %4:i32 = ashr %newvar0, %3 | |
| result %4 | |
| newvar0 (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) /s C1 (powerOfTwo) | |
| => | |
| newvar0 >>a logb(C1) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 561) && match(I, m_SDiv(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::pow2(x0) && util::dc(DT, I, x1) && util::k0(x1, "10000000000000000000000000000000", 32)) { | |
| auto ret = B->CreateAShr(x1, B->CreateLogB(x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(561, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 540 | |
| %symconst_1:i32 = var (powerOfTwo) ; symconst_1 | |
| %1:i32 = width %symconst_1 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %v0:i8 = var ; v0 | |
| %4:i8 = width %v0 | |
| %5:i1 = eq 8:i8, %4 | |
| pc %5 1:i1 | |
| %6:i32 = zext %v0 | |
| %7:i32 = width %6 | |
| %8:i1 = eq 32:i32, %7 | |
| pc %8 1:i1 | |
| %9:i32 = sdiv %6, %symconst_1 | |
| infer %9 | |
| %10:i32 = logb %symconst_1 | |
| %11:i32 = ashr %6, %10 | |
| result %11 | |
| width(C1 (powerOfTwo)) == 32 && | |
| width(v0) == 8 && | |
| let var0 = zext(v0); | |
| width(var0) == 32 | |
| |= | |
| var0 /s C1 | |
| => | |
| let var1 = logb(C1); | |
| var0 >>a var1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 540) && match(I, m_SDiv(&x1 <<= m_ZExt(m_Value(x2)), m_Constant(&x3)))) { | |
| if (util::pow2(x3) && util::dc(DT, I, x1) && util::dc(DT, I, x2) && util::check_width(x3,32) && util::check_width(x2,8) && util::check_width(x1,32)) { | |
| auto ret = B->CreateAShr(x1, B->CreateLogB(x3)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(540, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3957 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symDF_K1:i32 = var ; symDF_K1 | |
| %2:i1 = knownones %symconst_1, %symDF_K1 | |
| pc %2 1:i1 | |
| %symDF_DB:i64 = var ; symDF_DB | |
| %4:i64 = zext %symDF_K1 | |
| %5:i1 = eq %symDF_DB, %4 | |
| pc %5 1:i1 | |
| %newvar0:i32 = var ; newvar0 | |
| %7:i32 = and %symconst_1, %newvar0 | |
| %8:i64 = zext %7 | |
| %9:i64 = demandedmask %8, %symDF_DB | |
| infer %9 | |
| %10:i64 = sext %newvar0 | |
| %11:i64 = demandedmask %10, %symDF_DB | |
| result %11 | |
| @db == zext(symconst_1.k1) | |
| |= | |
| let var1 = (C1 & newvar0); | |
| let var0 = zext(var1); | |
| var0 | |
| => | |
| let var2 = sext(newvar0); | |
| var2 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x2 = nullptr, *x4 = nullptr, *x3 = nullptr, *x1 = nullptr, *x7 = nullptr, *x6 = nullptr; | |
| if (util::filter(F, 3957) && match(I, m_ZExt(m_c_And(m_Constant(&x5), m_Value(x7))))) { | |
| if (util::symk1bind(x5, x2, B) && util::symdb(DB, I, x3, B) && util::dc(DT, I, x3) && (eq(util::V(x3), util::V(x2).zext(64)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateSExt(x7, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3957, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3697 | |
| %v0:i32 = var ; v0 | |
| %v1:i32 = var ; v1 | |
| %2:i32 = subnsw %v0, %v1 | |
| %3:i1 = slt %2, 0:i32 | |
| infer %3 | |
| %4:i1 = slt %v0, %v1 | |
| result %4 | |
| (v0 -nsw v1) <s 0 | |
| => | |
| v0 <s v1 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3697) && match(I, m_ICmp(P0, m_NSWSub(m_Value(x1), m_Value(x0)), m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_SLT && util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_SLT, x1, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3697, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3275 | |
| %newvar2:i1 = var ; newvar2 | |
| %1:i32 = zext %newvar2 | |
| %newvar1:i1 = var ; newvar1 | |
| %3:i1 = xor 1:i1, %newvar1 | |
| %4:i32 = zext %3 | |
| %5:i32 = or %1, %4 | |
| %6:i1 = ne 0:i32, %5 | |
| infer %6 | |
| %7:i1 = ule %newvar1, %newvar2 | |
| result %7 | |
| (zext(newvar2) | zext(~newvar1)) != 0 | |
| => | |
| newvar1 <=u newvar2 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x5 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3275) && match(I, m_c_ICmp(P0, m_Zero(), m_c_Or(m_ZExt(m_Value(x5)), m_ZExt(m_c_Xor(m_AllOnes(), m_Value(x2))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x5,1) && util::check_width(x2,1) && util::dc(DT, I, x2) && util::dc(DT, I, x5)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULE, x2, x5); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3275, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2801 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = sext %v0 | |
| %3:i32 = and %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = and %v0, %5 | |
| result %6 | |
| trunc((C1 & sext(v0))) | |
| => | |
| v0 & trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2801) && match(I, m_Trunc(m_c_And(m_Constant(&x3), m_SExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAnd(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2801, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2721 | |
| %v0:i4 = var ; v0 | |
| %symconst_1:i4 = var ; symconst_1 | |
| %2:i4 = add %v0, %symconst_1 | |
| %3:i4 = subnsw %2, %symconst_1 | |
| %4:i8 = sext %3 | |
| infer %4 | |
| %5:i8 = sext %v0 | |
| result %5 | |
| sext(((v0 + C1) -nsw C1)) | |
| => | |
| sext(v0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2721) && match(I, m_SExt(m_NSWSub(m_c_Add(m_Value(x2), m_Constant(&x1)), m_Deferred(x1))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2721, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2703 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %2:i32 = sub 0:i32, %1 | |
| %3:i64 = sext %2 | |
| infer %3 | |
| %4:i64 = sext %newvar0 | |
| result %4 | |
| sext((0 - zext(newvar0))) | |
| => | |
| sext(newvar0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2703) && match(I, m_SExt(m_Sub(m_Zero(), m_ZExt(m_Value(x2)))))) { | |
| if (util::check_width(x2,1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSExt(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2703, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 250 | |
| %v0:i8 = var ; v0 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i8 = sub %v0, %symconst_2 | |
| %3:i8 = sub 0:i8, %2 | |
| infer %3 | |
| %4:i8 = sub %symconst_2, %v0 | |
| result %4 | |
| 0 - (v0 - C2) | |
| => | |
| C2 - v0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 250) && match(I, m_Sub(m_Zero(), m_Sub(m_Value(x1), m_Constant(&x0))))) { | |
| if (util::dc(DT, I, x0) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateSub(x0, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(250, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1204 | |
| %newvar0:i64 = var ; newvar0 | |
| %v4:i64 = var ; v4 | |
| %2:i1 = ult %newvar0, %v4 | |
| %3:i1 = xor 1:i1, %2 | |
| infer %3 | |
| %4:i1 = ule %v4, %newvar0 | |
| result %4 | |
| ~(newvar0 <u v4) | |
| => | |
| v4 <=u newvar0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1204) && match(I, m_c_Xor(m_AllOnes(), m_ICmp(P0, m_Value(x2), m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_ULT && util::dc(DT, I, x1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULE, x1, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1204, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 389 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %newvar1:i8 = var ; newvar1 | |
| %2:i8 = sdivexact %newvar1, %symconst_1 | |
| %3:i8 = mul %symconst_1, %2 | |
| infer %3 | |
| %4:i8 = freeze %newvar1 | |
| result %4 | |
| C1 * (newvar1 sdivexact C1) | |
| => | |
| freeze(newvar1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 389) && match(I, m_c_Mul(m_Constant(&x0), m_SDivExact(m_Value(x1), m_Deferred(x0))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateFreeze(x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(389, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3503 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %1:i1 = ult 0:i32, %symconst_1 | |
| %v0:i8 = var ; v0 | |
| %3:i8 = width %v0 | |
| %4:i32 = zext %3 | |
| %5:i1 = ule %symconst_1, %4 | |
| %6:i1 = and %1, %5 | |
| pc %6 1:i1 | |
| %7:i32 = zext %v0 | |
| %8:i1 = ult %7, %symconst_1 | |
| infer %8 | |
| %9:i8 = trunc %symconst_1 | |
| %10:i1 = ult %v0, %9 | |
| result %10 | |
| (0 <u C1) & (C1 <=u zext(width(v0))) | |
| |= | |
| zext(v0) <u C1 | |
| => | |
| v0 <u trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3503) && match(I, m_ICmp(P0, m_ZExt(m_Value(x3)), m_Constant(&x4)))) { | |
| if (P0 == ICmpInst::ICMP_ULT && util::dc(DT, I, x3) && ((ult(llvm::APInt(32, 0), util::V(x4)) & ule(util::V(x4), util::W(x3).zext(64))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULT, x3, B->CreateTrunc(x4, T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3503, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2456 | |
| %v0:i1 = var ; v0 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %3:i32 = select %v0, %symconst_1, %symconst_2 | |
| %4:i64 = zext %3 | |
| infer %4 | |
| %5:i64 = zext %symconst_1 | |
| %6:i64 = zext %symconst_2 | |
| %7:i64 = select %v0, %5, %6 | |
| result %7 | |
| zext((select v0 C1 C2)) | |
| => | |
| select v0 zext(C1) zext(C2) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2456) && match(I, m_ZExt(m_Select(m_Value(x3), m_Constant(&x2), m_Constant(&x1))))) { | |
| if (util::check_width(x3,1) && util::dc(DT, I, x3)) { | |
| auto ret = B->CreateSelect(x3, B->CreateZExt(x2, T(64, B)), B->CreateZExt(x1, T(64, B))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2456, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1150 | |
| %symconst_3:i32 = var ; symconst_3 | |
| %newvar1:i1 = var ; newvar1 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %4:i32 = select %newvar1, %symconst_1, %symconst_2 | |
| %5:i32 = or %symconst_3, %4 | |
| infer %5 | |
| %6:i32 = or %symconst_3, %symconst_1 | |
| %7:i32 = or %symconst_3, %symconst_2 | |
| %8:i32 = select %newvar1, %6, %7 | |
| result %8 | |
| C3 | (select newvar1 C1 C2) | |
| => | |
| select newvar1 (C3 | C1) (C3 | C2) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1150) && match(I, m_c_Or(m_Constant(&x3), m_Select(m_Value(x2), m_Constant(&x1), m_Constant(&x0))))) { | |
| if (util::check_width(x2,1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSelect(x2, B->CreateOr(x3, x1), B->CreateOr(x3, x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1150, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 862 | |
| %symconst_3:i16 = var ; symconst_3 | |
| %newvar0:i1 = var ; newvar0 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %4:i32 = select %newvar0, %symconst_1, %symconst_2 | |
| %5:i16 = trunc %4 | |
| %6:i16 = and %symconst_3, %5 | |
| infer %6 | |
| %7:i32 = select 1:i1, %symconst_1, %symconst_2 | |
| %8:i16 = trunc %7 | |
| %9:i16 = and %symconst_3, %8 | |
| %10:i32 = select 0:i1, %symconst_1, %symconst_2 | |
| %11:i16 = trunc %10 | |
| %12:i16 = and %symconst_3, %11 | |
| %13:i16 = select %newvar0, %9, %12 | |
| result %13 | |
| C3 & trunc((select newvar0 C1 C2)) | |
| => | |
| select newvar0 (C3 & trunc((select 1 C1 C2))) (C3 & trunc((select 0 C1 C2))) | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 862) && match(I, m_c_And(m_Constant(&x4), m_Trunc(m_Select(m_Value(x3), m_Constant(&x2), m_Constant(&x1)))))) { | |
| if (util::check_width(x3,1) && util::dc(DT, I, x3)) { | |
| auto C0 = C(1, -1, B); | |
| auto C1 = C(1, 0, B); | |
| auto ret = B->CreateSelect(x3, B->CreateAnd(x4, B->CreateTrunc(B->CreateSelect(C0(), x2, x1), T(x4))), B->CreateAnd(x4, B->CreateTrunc(B->CreateSelect(C1(), x2, x1), T(x4)))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(862, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 57 | |
| %newvar0:i32 = var ; newvar0 | |
| %v10:i32 = var ; v10 | |
| %2:i32 = sub %v10, %newvar0 | |
| %3:i32 = add %newvar0, %2 | |
| infer %3 | |
| result %v10 | |
| newvar0 + (v10 - newvar0) | |
| => | |
| v10 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 57) && match(I, m_c_Add(m_Value(x0), m_Sub(m_Value(x1), m_Deferred(x0))))) { | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(57, 2); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 3936 | |
| %newvar0:i32 = var ; newvar0 | |
| %symDF_K0:i32 = var ; symDF_K0 | |
| %2:i1 = knownzeros %newvar0, %symDF_K0 | |
| pc %2 1:i1 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symDF_K1:i32 = var ; symDF_K1 | |
| %5:i1 = knownones %symconst_1, %symDF_K1 | |
| pc %5 1:i1 | |
| %6:i32 = or %symDF_K0, %symDF_K1 | |
| %symDF_DB:i32 = var ; symDF_DB | |
| %8:i32 = xor 4294967295:i32, %symDF_DB | |
| %9:i32 = or %6, %8 | |
| %10:i1 = eq 4294967295:i32, %9 | |
| pc %10 1:i1 | |
| %11:i32 = or %newvar0, %symconst_1 | |
| %12:i32 = demandedmask %11, %symDF_DB | |
| infer %12 | |
| %13:i32 = demandedmask %symconst_1, %symDF_DB | |
| result %13 | |
| ((symconst_1.k1 | newvar0.k0) | ~@db) == 0xFFFFFFFF | |
| |= | |
| let var0 = C1 | newvar0; | |
| var0 | |
| => | |
| C1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x7 = nullptr, *x3 = nullptr, *x6 = nullptr, *x5 = nullptr, *x2 = nullptr, *x4 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 3936) && match(I, m_c_Or(m_Value(x7), m_Constant(&x5)))) { | |
| if (util::symk1bind(x5, x2, B) && util::symk0bind(x7, x3, B) && util::symdb(DB, I, x1, B) && util::dc(DT, I, x5) && util::dc(DT, I, x1) && (eq(llvm::APInt(32, 4294967295), or_(or_(util::V(x3), util::V(x2)), flip(util::V(x1)))) == llvm::APInt(1, 1))) { | |
| auto ret = x5; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3936, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3891 | |
| %v3:i16 = var ; v3 | |
| %1:i32 = zext %v3 (hasExternalUses) | |
| %v6:i16 = var ; v6 | |
| %3:i32 = zext %v6 | |
| %4:i1 = sle %1, %3 | |
| infer %4 | |
| %5:i1 = ule %v3, %v6 | |
| result %5 | |
| zext(v3) <=s zext(v6) | |
| => | |
| v3 <=u v6 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3891) && match(I, m_ICmp(P0, m_ZExt(m_Value(x3)), m_ZExt(m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_SLE && util::dc(DT, I, x3) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULE, x3, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3891, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3407 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %2:i1 = ult %symconst_2, %symconst_1 | |
| pc %2 1:i1 | |
| %newvar1:i1 = var ; newvar1 | |
| %4:i32 = select %newvar1, %symconst_1, %symconst_2 | |
| %newvar4:i1 = var ; newvar4 | |
| %6:i32 = select %newvar4, %symconst_1, %symconst_2 | |
| %7:i1 = ne %4, %6 | |
| infer %7 | |
| %8:i1 = xor %newvar1, %newvar4 | |
| result %8 | |
| C2 <u C1 | |
| |= | |
| (select newvar1 C1 C2) != (select newvar4 C1 C2) | |
| => | |
| newvar4 ^ newvar1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3407) && match(I, m_c_ICmp(P0, m_Select(m_Value(x4), m_Constant(&x1), m_Constant(&x2)), m_Select(m_Value(x3), m_Deferred(x1), m_Deferred(x2))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x4,1) && util::check_width(x3,1) && util::dc(DT, I, x4) && util::dc(DT, I, x3) && (ult(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateXor(x4, x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3407, 6); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3045 | |
| %newvar1:i1 = var ; newvar1 | |
| %1:i32 = zext %newvar1 | |
| %newvar0:i1 = var ; newvar0 | |
| %3:i1 = xor 1:i1, %newvar0 | |
| %4:i32 = zext %3 | |
| %5:i1 = eq %1, %4 | |
| infer %5 | |
| %6:i1 = xor %newvar1, %newvar0 | |
| result %6 | |
| zext(newvar1) == zext(~newvar0) | |
| => | |
| newvar1 ^ newvar0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x5 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3045) && match(I, m_c_ICmp(P0, m_ZExt(m_Value(x5)), m_ZExt(m_c_Xor(m_AllOnes(), m_Value(x2)))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::check_width(x5,1) && util::check_width(x2,1) && util::dc(DT, I, x5) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateXor(x5, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3045, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2846 | |
| %symconst_3:i32 = var ; symconst_3 | |
| %newvar1:i1 = var ; newvar1 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %4:i32 = select %newvar1, %symconst_1, %symconst_2 | |
| %5:i32 = xor %symconst_3, %4 | |
| %6:i8 = trunc %5 | |
| infer %6 | |
| %7:i32 = xor %symconst_3, %symconst_1 | |
| %8:i8 = trunc %7 | |
| %9:i32 = xor %symconst_3, %symconst_2 | |
| %10:i8 = trunc %9 | |
| %11:i8 = select %newvar1, %8, %10 | |
| result %11 | |
| trunc((C3 ^ (select newvar1 C1 C2))) | |
| => | |
| select newvar1 trunc((C3 ^ C1)) trunc((C3 ^ C2)) | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2846) && match(I, m_Trunc(m_c_Xor(m_Constant(&x4), m_Select(m_Value(x3), m_Constant(&x2), m_Constant(&x1)))))) { | |
| if (util::check_width(x3,1) && util::dc(DT, I, x3)) { | |
| auto ret = B->CreateSelect(x3, B->CreateTrunc(B->CreateXor(x4, x2), T(8, B)), B->CreateTrunc(B->CreateXor(x4, x1), T(8, B))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2846, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2593 | |
| %newvar6:i32 = var ; newvar6 | |
| %1:i32 = and 1:i32, %newvar6 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i32 = select %2, 1:i32, 0:i32 | |
| %4:i8 = trunc %3 | |
| %5:i32 = zext %4 | |
| infer %5 | |
| result %1 | |
| zext(trunc((select ((newvar6 & 1) != 0) 1 0))) | |
| => | |
| newvar6 & 1 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x2 = nullptr, *x3 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2593) && match(I, m_ZExt(m_Trunc(m_Select(m_c_ICmp(P0, m_Zero(), &x3 <<= m_c_And(&x4 <<= m_ExtInt("1", 32), m_Value(x2))), &x4 <<= m_ExtInt("1", 32), m_Zero()))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = x3; | |
| if (util::check_width(ret, I)) { | |
| St.hit(2593, 6); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 252 | |
| %newvar1:i8 = var ; newvar1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i8 = add %newvar1, %symconst_2 | |
| %3:i8 = sub 0:i8, %2 | |
| infer %3 | |
| %4:i8 = sub 0:i8, %symconst_2 | |
| %5:i8 = sub %4, %newvar1 | |
| result %5 | |
| 0 - (C2 + newvar1) | |
| => | |
| (0 - C2) - newvar1 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 252) && match(I, m_Sub(&x2 <<= m_Zero(), m_c_Add(m_Value(x1), m_Constant(&x0))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateSub(B->CreateSub(C0(x0), x0), x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(252, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1818 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i8 = zext %newvar0 | |
| %2:i1 = ne 0:i8, %1 | |
| %newvar5:i8 = var ; newvar5 | |
| %4:i8 = select %2, %newvar5, 0:i8 | |
| infer %4 | |
| %5:i8 = select %newvar0, %newvar5, 0:i8 | |
| result %5 | |
| select (zext(newvar0) != 0) newvar5 0 | |
| => | |
| select newvar0 newvar5 0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1818) && match(I, m_Select(m_c_ICmp(P0, &x3 <<= m_Zero(), m_ZExt(m_Value(x2))), m_Value(x0), &x3 <<= m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x2,1) && util::dc(DT, I, x2) && util::dc(DT, I, x0)) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateSelect(x2, x0, C0(x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1818, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1304 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %v0:i8 = var ; v0 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %4:i8 = lshr %v0, %symconst_2 | |
| %5:i8 = and %symconst_3, %4 | |
| %6:i8 = and %symconst_1, %5 | |
| %7:i8 = shl %6, %symconst_2 | |
| infer %7 | |
| %8:i8 = and %symconst_1, %symconst_3 | |
| %9:i8 = shl %8, %symconst_2 | |
| %10:i8 = and %v0, %9 | |
| result %10 | |
| (C1 & (C3 & (v0 >>l C2))) << C2 | |
| => | |
| v0 & ((C3 & C1) << C2) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1304) && match(I, m_Shl(m_c_And(m_Constant(&x3), m_c_And(m_Constant(&x2), m_LShr(m_Value(x1), m_Constant(&x0)))), m_Deferred(x0)))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateAnd(x1, B->CreateShl(B->CreateAnd(x3, x2), x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1304, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1248 | |
| %v0:i64 = var ; v0 | |
| %1:i64 = sub %v0, 1:i64 (hasExternalUses) | |
| %2:i64 = and 1:i64, %1 | |
| %3:i1 = ne 0:i64, %2 | |
| %4:i1 = xor 1:i1, %3 | |
| infer %4 | |
| %5:i1 = trunc %v0 | |
| result %5 | |
| ~(((v0 - 1) & 1) != 0) | |
| => | |
| trunc(v0) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1248) && match(I, m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Zero(), m_c_And(m_ExtInt("1", 64), m_Sub(m_Value(x1), m_ExtInt("1", 64))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateTrunc(x1, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1248, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1230 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %newvar1:i4 = var ; newvar1 | |
| %2:i4 = width %newvar1 | |
| %3:i8 = zext %2 | |
| %4:i8 = shl 1:i8, %3 | |
| %5:i8 = sub %4, 1:i8 | |
| %6:i1 = ule %symconst_1, %5 | |
| pc %6 1:i1 | |
| %7:i8 = zext %newvar1 | |
| %8:i1 = ne %symconst_1, %7 | |
| %9:i1 = xor 1:i1, %8 | |
| infer %9 | |
| %10:i4 = trunc %symconst_1 | |
| %11:i1 = eq %newvar1, %10 | |
| result %11 | |
| C1 <=u ((1 << zext(width(newvar1))) - 1) | |
| |= | |
| ~(C1 != zext(newvar1)) | |
| => | |
| newvar1 == trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr, *x4 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1230) && match(I, m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Constant(&x3), m_ZExt(m_Value(x2)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && (ule(util::V(x3), sub(shl(llvm::APInt(8, 1), util::W(x2).zext(64)), llvm::APInt(8, 1))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1230, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1160 | |
| %v1:i8 = var ; v1 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %2:i8 = and %v1, %symconst_3 | |
| %symconst_2:i8 = var (powerOfTwo) ; symconst_2 | |
| %4:i8 = and %v1, %symconst_2 | |
| %5:i1 = ne 0:i8, %4 | |
| %6:i8 = select %5, %symconst_2, 0:i8 | |
| %7:i8 = or %2, %6 | |
| infer %7 | |
| %8:i8 = or %symconst_3, %symconst_2 | |
| %9:i8 = and %v1, %8 | |
| result %9 | |
| (v1 & C3) | (select ((v1 & C2 (powerOfTwo)) != 0) C2 0) | |
| => | |
| v1 & (C3 | C2) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1160) && match(I, m_c_Or(m_c_And(m_Value(x1), m_Constant(&x2)), m_Select(m_c_ICmp(P0, m_Zero(), m_c_And(m_Deferred(x1), m_Constant(&x0))), m_Deferred(x0), m_Zero())))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::pow2(x0) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateAnd(x1, B->CreateOr(x2, x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1160, 6); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3212 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = urem %v0, 2:i32 | |
| %2:i1 = ne 0:i32, %1 | |
| infer %2 | |
| %3:i1 = trunc %v0 | |
| result %3 | |
| (v0 %u 2) != 0 | |
| => | |
| trunc(v0) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3212) && match(I, m_c_ICmp(P0, m_Zero(), m_URem(m_Value(x0), m_ExtInt("2", 32))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateTrunc(x0, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3212, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2414 | |
| %newvar2:i1 = var ; newvar2 | |
| %1:i32 = zext %newvar2 | |
| %newvar7:i1 = var ; newvar7 | |
| %3:i32 = zext %newvar7 | |
| %4:i32 = or %1, %3 | |
| %5:i1 = ne 0:i32, %4 | |
| %6:i8 = zext %5 | |
| infer %6 | |
| %7:i8 = trunc %4 | |
| result %7 | |
| zext(((zext(newvar2) | zext(newvar7)) != 0)) | |
| => | |
| trunc((zext(newvar2) | zext(newvar7))) | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2414) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), &x5 <<= m_c_Or(&x3 <<= m_ZExt(m_Value(x4)), &x1 <<= m_ZExt(m_Value(x2))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x4,1) && util::check_width(x2,1) && util::dc(DT, I, x5) && util::dc(DT, I, x3) && util::dc(DT, I, x4) && util::dc(DT, I, x1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateTrunc(x5, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2414, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1243 | |
| %symconst_1:i16 = var ; symconst_1 | |
| %symconst_2:i16 = var ; symconst_2 | |
| %2:i1 = ne %symconst_1, %symconst_2 | |
| pc %2 1:i1 | |
| %newvar0:i1 = var ; newvar0 | |
| %4:i16 = select %newvar0, %symconst_1, %symconst_2 | |
| %5:i1 = ne %symconst_1, %4 | |
| %6:i1 = xor 1:i1, %5 | |
| infer %6 | |
| result %newvar0 | |
| C2 != C1 | |
| |= | |
| ~(C1 != (select newvar0 C1 C2)) | |
| => | |
| newvar0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1243) && match(I, m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Constant(&x2), m_Select(m_Value(x4), m_Deferred(x2), m_Constant(&x1)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x4,1) && (ne(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = x4; | |
| if (util::check_width(ret, I)) { | |
| St.hit(1243, 5); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 843 | |
| %symconst_4:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx111111) ; symconst_4 | |
| %1:i32 = width %symconst_4 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %newvar4:i32 = var ; newvar4 | |
| %4:i32 = width %newvar4 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %symconst_2:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxx1111) ; symconst_2 | |
| %7:i32 = width %symconst_2 | |
| %8:i1 = eq 32:i32, %7 | |
| pc %8 1:i1 | |
| %symconst_1:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx1xx) ; symconst_1 | |
| %10:i32 = width %symconst_1 | |
| %11:i1 = eq 32:i32, %10 | |
| pc %11 1:i1 | |
| %v0:i8 = var ; v0 | |
| %13:i8 = width %v0 | |
| %14:i1 = eq 8:i8, %13 | |
| pc %14 1:i1 | |
| %15:i32 = zext %v0 | |
| %16:i32 = width %15 | |
| %17:i1 = eq 32:i32, %16 | |
| pc %17 1:i1 | |
| %18:i32 = and 48:i32, %newvar4 | |
| %19:i32 = ashr %15, %symconst_1 | |
| %20:i32 = and %symconst_2, %19 | |
| %21:i32 = or %18, %20 | |
| %22:i32 = and %symconst_4, %21 | |
| infer %22 | |
| %23:i32 = add %18, %19 | |
| result %23 | |
| width(C4 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx111111)) == 32 && | |
| width(newvar4) == 32 && | |
| width(C2 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxx1111)) == 32 && | |
| width(C1 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx1xx)) == 32 && | |
| width(v0) == 8 && | |
| let var0 = zext(v0); | |
| width(var0) == 32 | |
| |= | |
| let var2 = (newvar4 & 48); | |
| let var4 = (var0 >>a C1); | |
| let var3 = (C2 & var4); | |
| let var1 = (var2 | var3); | |
| C4 & var1 | |
| => | |
| var2 + var4 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x9 = nullptr, *x6 = nullptr, *x5 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x8 = nullptr, *x7 = nullptr; | |
| if (util::filter(F, 843) && match(I, m_c_And(m_Constant(&x6), m_c_Or(&x8 <<= m_c_And(&x9 <<= m_ExtInt("48", 32), m_Value(x5)), m_c_And(m_Constant(&x4), &x7 <<= m_AShr(&x1 <<= m_ZExt(m_Value(x2)), m_Constant(&x3))))))) { | |
| if (util::dc(DT, I, x8) && util::dc(DT, I, x5) && util::dc(DT, I, x7) && util::dc(DT, I, x1) && util::dc(DT, I, x2) && util::dc(DT, I, x3) && util::k1(x6, "111111", 32) && util::k1(x4, "1111", 32) && util::k1(x3, "100", 32) && util::check_width(x6,32) && util::check_width(x5,32) && util::check_width(x4,32) && util::check_width(x3,32) && util::check_width(x2,8) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 48, B); | |
| auto ret = B->CreateAdd(x8, x7); | |
| if (util::check_width(ret, I)) { | |
| St.hit(843, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 765 | |
| %symconst_5:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx000000) ; symconst_5 | |
| %1:i32 = width %symconst_5 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %newvar0:i32 = var ; newvar0 | |
| %4:i32 = width %newvar0 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %symconst_4:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx11xxxx) ; symconst_4 | |
| %7:i32 = width %symconst_4 | |
| %8:i1 = eq 32:i32, %7 | |
| pc %8 1:i1 | |
| %9:i32 = and %newvar0, %symconst_4 | |
| %10:i32 = add %symconst_5, %9 | |
| %11:i32 = and 48:i32, %10 | |
| infer %11 | |
| %12:i32 = and 48:i32, %newvar0 | |
| result %12 | |
| width(C5 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx000000)) == 32 && | |
| width(newvar0) == 32 && | |
| width(C4 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx11xxxx)) == 32 | |
| |= | |
| let var1 = (C4 & newvar0); | |
| let var0 = (C5 + var1); | |
| var0 & 48 | |
| => | |
| newvar0 & 48 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr; | |
| if (util::filter(F, 765) && match(I, m_c_And(m_c_Add(m_Constant(&x3), m_c_And(m_Value(x2), m_Constant(&x1))), &x4 <<= m_ExtInt("48", 32)))) { | |
| if (util::dc(DT, I, x2) && util::k0(x3, "111111", 32) && util::k1(x1, "110000", 32) && util::check_width(x3,32) && util::check_width(x2,32) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 48, B); | |
| auto ret = B->CreateAnd(x2, C0(x2)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(765, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 724 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %newvar0:i8 = var ; newvar0 | |
| %2:i8 = or %symconst_1, %newvar0 | |
| %3:i8 = and %symconst_1, %2 | |
| infer %3 | |
| result %symconst_1 | |
| C1 & (C1 | newvar0) | |
| => | |
| C1 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 724) && match(I, m_c_And(m_Constant(&x1), m_c_Or(m_Deferred(x1), m_Value(x0))))) { | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(724, 2); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 629 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = xor 255:i8, %symconst_1 | |
| %3:i1 = eq %symconst_2, %2 | |
| pc %3 1:i1 | |
| %v0:i8 = var ; v0 | |
| %5:i8 = and %symconst_1, %v0 | |
| %6:i8 = and %symconst_2, %5 | |
| infer %6 | |
| result 0:i8 | |
| C2 == ~C1 | |
| |= | |
| C2 & (v0 & C1) | |
| => | |
| 0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| if (util::filter(F, 629) && match(I, m_c_And(m_Constant(&x2), m_c_And(m_Constant(&x1), m_Value(x3))))) { | |
| if ((eq(util::V(x2), flip(util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = C0(I); | |
| if (util::check_width(ret, I)) { | |
| St.hit(629, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 594 | |
| %v0:i32 = var (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) ; v0 | |
| %symconst_1:i32 = var (powerOfTwo) ; symconst_1 | |
| %2:i32 = srem %v0, %symconst_1 | |
| infer %2 | |
| %3:i32 = sub %symconst_1, 1:i32 | |
| %4:i32 = and %v0, %3 | |
| result %4 | |
| v0 (knownBits=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) %s C1 (powerOfTwo) | |
| => | |
| v0 & (C1 - 1) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 594) && match(I, m_SRem(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::pow2(x0) && util::dc(DT, I, x1) && util::k0(x1, "10000000000000000000000000000000", 32)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateAnd(x1, B->CreateSub(x0, C0(x0))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(594, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 56 | |
| %v0:i64 = var (range=[1,2)) ; v0 | |
| %symconst_1:i64 = var ; symconst_1 | |
| %2:i64 = add %v0, %symconst_1 | |
| infer %2 | |
| %3:i64 = add 1:i64, %symconst_1 | |
| result %3 | |
| v0 (range=[1,2)) + C1 | |
| => | |
| C1 + 1 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 56) && match(I, m_c_Add(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::dc(DT, I, x0) && util::cr(x1, "1", "2")) { | |
| auto C0 = C(64, 1, B); | |
| auto ret = B->CreateAdd(C0(x0), x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(56, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 408 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %newvar0:i8 = var ; newvar0 | |
| %2:i8 = and 1:i8, %newvar0 | |
| %3:i1 = ne 0:i8, %2 | |
| %4:i1 = xor 1:i1, %3 | |
| %5:i1 = xor 1:i1, %4 | |
| %6:i8 = zext %5 | |
| %7:i8 = mul %symconst_3, %6 | |
| infer %7 | |
| %8:i8 = mul %symconst_3, %2 | |
| result %8 | |
| C3 * zext(~~((newvar0 & 1) != 0)) | |
| => | |
| C3 * (newvar0 & 1) | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x7 = nullptr, *x5 = nullptr, *x3 = nullptr, *x6 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 408) && match(I, m_c_Mul(m_Constant(&x5), m_ZExt(m_c_Xor(m_AllOnes(), m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Zero(), &x6 <<= m_c_And(&x7 <<= m_ExtInt("1", 8), m_Value(x3))))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x5) && util::dc(DT, I, x6) && util::dc(DT, I, x3)) { | |
| auto C0 = C(8, 1, B); | |
| auto ret = B->CreateMul(x5, x6); | |
| if (util::check_width(ret, I)) { | |
| St.hit(408, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3747 | |
| %v0:i8 = var ; v0 | |
| %1:i64 = zext %v0 (hasExternalUses) | |
| %v2:i8 = var ; v2 | |
| %3:i64 = zext %v2 | |
| %4:i1 = ule %1, %3 | |
| infer %4 | |
| %5:i1 = ule %v0, %v2 | |
| result %5 | |
| zext(v0) <=u zext(v2) | |
| => | |
| v0 <=u v2 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3747) && match(I, m_ICmp(P0, m_ZExt(m_Value(x3)), m_ZExt(m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_ULE && util::dc(DT, I, x3) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULE, x3, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3747, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3206 | |
| %symconst_4:i32 = var ; symconst_4 | |
| %1:i32 = width %symconst_4 | |
| %2:i32 = sub %1, 1:i32 | |
| %3:i1 = eq %symconst_4, %2 | |
| pc %3 1:i1 | |
| %v0:i32 = var ; v0 | |
| %5:i32 = width %v0 | |
| %6:i1 = eq 32:i32, %5 | |
| pc %6 1:i1 | |
| %7:i1 = eq 32:i32, %1 | |
| pc %7 1:i1 | |
| %8:i32 = lshr %v0, %symconst_4 | |
| %9:i1 = ne 0:i32, %8 | |
| infer %9 | |
| %10:i32 = add 2147483616:i32, %symconst_4 | |
| %11:i1 = ult %10, %v0 | |
| result %11 | |
| let var0 = width(C4); | |
| C4 == (var0 - 1) && | |
| width(v0) == 32 && | |
| var0 == 32 | |
| |= | |
| let var1 = (v0 >>l C4); | |
| var1 != 0 | |
| => | |
| let var2 = (C4 + 0x7FFFFFE0); | |
| var2 <u v0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x1 = nullptr, *x2 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3206) && match(I, m_c_ICmp(P0, m_Zero(), m_LShr(m_Value(x2), m_Constant(&x1))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && (eq(util::V(x1), sub(util::W(x1), llvm::APInt(32, 1))) == llvm::APInt(1, 1)) && util::check_width(x2,32) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 2147483616, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_ULT, B->CreateAdd(x1, C0(x1)), x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3206, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 310 | |
| %newvar0:i1 = var ; newvar0 | |
| %1:i32 = zext %newvar0 | |
| %2:i32 = sub 0:i32, %1 | |
| infer %2 | |
| %3:i32 = sext %newvar0 | |
| result %3 | |
| 0 - zext(newvar0) | |
| => | |
| sext(newvar0) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 310) && match(I, m_Sub(m_Zero(), m_ZExt(m_Value(x1))))) { | |
| if (util::check_width(x1,1) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateSExt(x1, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(310, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3040 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %2:i1 = ne %symconst_1, %symconst_2 | |
| pc %2 1:i1 | |
| %newvar0:i1 = var ; newvar0 | |
| %4:i32 = select %newvar0, %symconst_1, %symconst_2 | |
| %5:i1 = eq %symconst_1, %4 | |
| infer %5 | |
| result %newvar0 | |
| C2 != C1 | |
| |= | |
| C1 == (select newvar0 C1 C2) | |
| => | |
| newvar0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3040) && match(I, m_c_ICmp(P0, m_Constant(&x2), m_Select(m_Value(x3), m_Deferred(x2), m_Constant(&x1))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::check_width(x3,1) && (ne(util::V(x2), util::V(x1)) == llvm::APInt(1, 1))) { | |
| auto ret = x3; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3040, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2852 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = zext %v0 | |
| %3:i32 = sub %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = sub %5, %v0 | |
| result %6 | |
| trunc((C1 - zext(v0))) | |
| => | |
| trunc(C1) - v0 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2852) && match(I, m_Trunc(m_Sub(m_Constant(&x3), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSub(B->CreateTrunc(x3, T(x2)), x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2852, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2851 | |
| %symconst_1:i64 = var ; symconst_1 | |
| %1:i1 = ult 0:i64, %symconst_1 | |
| %v0:i8 = var ; v0 | |
| %3:i8 = width %v0 | |
| %4:i64 = zext %3 | |
| %5:i1 = ult %symconst_1, %4 | |
| %6:i1 = and %1, %5 | |
| pc %6 1:i1 | |
| %7:i64 = zext %v0 | |
| %8:i64 = lshr %7, %symconst_1 | |
| %9:i8 = trunc %8 | |
| infer %9 | |
| %10:i8 = trunc %symconst_1 | |
| %11:i8 = lshr %v0, %10 | |
| result %11 | |
| (0 <u C1) & (C1 <u zext(width(v0))) | |
| |= | |
| trunc((zext(v0) >>l C1)) | |
| => | |
| v0 >>l trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x6 = nullptr, *x5 = nullptr; | |
| if (util::filter(F, 2851) && match(I, m_Trunc(m_LShr(m_ZExt(m_Value(x3)), m_Constant(&x4))))) { | |
| if (util::dc(DT, I, x3) && ((ult(llvm::APInt(64, 0), util::V(x4)) & ult(util::V(x4), util::W(x3).zext(64))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateLShr(x3, B->CreateTrunc(x4, T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2851, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2825 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = sext %v0 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %3:i32 = sub %1, %symconst_1 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i32 = sub 0:i32, %symconst_1 | |
| %6:i8 = trunc %5 | |
| %7:i8 = add %v0, %6 | |
| result %7 | |
| trunc((sext(v0) - C1)) | |
| => | |
| v0 + trunc((0 - C1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2825) && match(I, m_Trunc(m_Sub(m_SExt(m_Value(x3)), m_Constant(&x1))))) { | |
| if (util::dc(DT, I, x3)) { | |
| auto C0 = C(32, 0, B); | |
| auto ret = B->CreateAdd(x3, B->CreateTrunc(B->CreateSub(C0(x1), x1), T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2825, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2806 | |
| %newvar2:i1 = var ; newvar2 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %3:i32 = select %newvar2, %symconst_1, %symconst_2 | |
| %4:i16 = trunc %3 | |
| infer %4 | |
| %5:i16 = trunc %symconst_1 | |
| %6:i16 = trunc %symconst_2 | |
| %7:i16 = select %newvar2, %5, %6 | |
| result %7 | |
| trunc((select newvar2 C1 C2)) | |
| => | |
| select newvar2 trunc(C1) trunc(C2) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2806) && match(I, m_Trunc(m_Select(m_Value(x3), m_Constant(&x2), m_Constant(&x1))))) { | |
| if (util::check_width(x3,1) && util::dc(DT, I, x3)) { | |
| auto ret = B->CreateSelect(x3, B->CreateTrunc(x2, T(16, B)), B->CreateTrunc(x1, T(16, B))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2806, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 278 | |
| %v0:i64 = var (range=[1,2)) ; v0 | |
| %symconst_1:i64 = var ; symconst_1 | |
| %2:i64 = sub %v0, %symconst_1 | |
| infer %2 | |
| %3:i64 = sub 1:i64, %symconst_1 | |
| result %3 | |
| v0 (range=[1,2)) - C1 | |
| => | |
| 1 - C1 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 278) && match(I, m_Sub(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::dc(DT, I, x0) && util::cr(x1, "1", "2")) { | |
| auto C0 = C(64, 1, B); | |
| auto ret = B->CreateSub(C0(x0), x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(278, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2784 | |
| %v3:i64 = var ; v3 | |
| %1:i64 = and 4294967295:i64, %v3 | |
| %2:i32 = trunc %1 | |
| infer %2 | |
| %3:i32 = trunc %v3 | |
| result %3 | |
| trunc((v3 & 0xFFFFFFFF)) | |
| => | |
| trunc(v3) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2784) && match(I, m_Trunc(m_c_And(m_ExtInt("4294967295", 64), m_Value(x1))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateTrunc(x1, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2784, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2763 | |
| %v0:i64 = var ; v0 | |
| %1:i64 = add 0:i64, %v0 | |
| %2:i32 = trunc %1 | |
| infer %2 | |
| %3:i32 = trunc %v0 | |
| result %3 | |
| trunc((v0 + 0)) | |
| => | |
| trunc(v0) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2763) && match(I, m_Trunc(m_c_Add(m_Zero(), m_Value(x1))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateTrunc(x1, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2763, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2687 | |
| %newvar0:i32 = var ; newvar0 | |
| %1:i32 = and 1:i32, %newvar0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i1 = xor 1:i1, %2 | |
| %4:i1 = xor 1:i1, %3 | |
| %5:i32 = zext %4 | |
| infer %5 | |
| result %1 | |
| zext(~~((newvar0 & 1) != 0)) | |
| => | |
| newvar0 & 1 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x6 = nullptr, *x3 = nullptr, *x5 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2687) && match(I, m_ZExt(m_c_Xor(m_AllOnes(), m_c_Xor(m_AllOnes(), m_c_ICmp(P0, m_Zero(), &x5 <<= m_c_And(&x6 <<= m_ExtInt("1", 32), m_Value(x3)))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x3)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = x5; | |
| if (util::check_width(ret, I)) { | |
| St.hit(2687, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 259 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = sub %symconst_2, %symconst_1 | |
| %3:i1 = eq 1:i8, %2 | |
| pc %3 1:i1 | |
| %v1:i8 = var ; v1 | |
| %5:i8 = add %symconst_1, %v1 | |
| %6:i8 = sub %5, %symconst_2 | |
| infer %6 | |
| %7:i8 = add 255:i8, %v1 | |
| result %7 | |
| (C2 - C1) == 1 | |
| |= | |
| (v1 + C1) - C2 | |
| => | |
| v1 + 0xFF | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| if (util::filter(F, 259) && match(I, m_Sub(m_c_Add(m_Constant(&x1), m_Value(x3)), m_Constant(&x2)))) { | |
| if (util::dc(DT, I, x3) && (eq(llvm::APInt(8, 1), sub(util::V(x2), util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto C0 = C(8, -1, B); | |
| auto ret = B->CreateAdd(C0(x3), x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(259, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 256 | |
| %v1:i64 = var ; v1 | |
| %v0:i64 = var ; v0 | |
| %2:i64 = sub %v1, %v0 | |
| %3:i64 = sub %v1, %2 | |
| infer %3 | |
| result %v0 | |
| v1 - (v1 - v0) | |
| => | |
| v0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 256) && match(I, m_Sub(m_Value(x1), m_Sub(m_Deferred(x1), m_Value(x0))))) { | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(256, 2); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 2496 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = width %v0 | |
| %3:i1 = ult %symconst_2, %2 | |
| pc %3 1:i1 | |
| %4:i8 = and %symconst_2, %v0 | |
| %5:i1 = eq 0:i8, %4 | |
| %6:i8 = zext %5 | |
| infer %6 | |
| %7:i8 = sub 1:i8, %symconst_2 | |
| %8:i8 = add %symconst_2, %7 | |
| %9:i8 = ashr %8, %4 | |
| result %9 | |
| C2 <u width(v0) | |
| |= | |
| let var0 = (v0 & C2); | |
| zext((var0 == 0)) | |
| => | |
| (C2 + (1 - C2)) >>a var0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x4 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2496) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), &x4 <<= m_c_And(m_Constant(&x2), m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x4) && util::dc(DT, I, x2) && util::dc(DT, I, x1) && (ult(util::V(x2), util::W(x1)) == llvm::APInt(1, 1))) { | |
| auto C0 = C(8, 1, B); | |
| auto ret = B->CreateAShr(B->CreateAdd(x2, B->CreateSub(C0(x2), x2)), x4); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2496, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2450 | |
| %v0:i1 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i1 = xor 1:i1, %2 | |
| %4:i32 = zext %3 | |
| infer %4 | |
| %5:i32 = zext 1:i1 | |
| %6:i32 = sub %5, %1 | |
| result %6 | |
| zext(~(zext(v0) != 0)) | |
| => | |
| zext(1) - zext(v0) | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2450) && match(I, m_ZExt(m_c_Xor(&x4 <<= m_AllOnes(), m_c_ICmp(P0, m_Zero(), &x2 <<= m_ZExt(m_Value(x3))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x3,1) && util::dc(DT, I, x2) && util::dc(DT, I, x3)) { | |
| auto C0 = C(1, -1, B); | |
| auto ret = B->CreateSub(B->CreateZExt(C0(), T(x2)), x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2450, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1784 | |
| %newvar0:i32 = var ; newvar0 | |
| %1:i32 = and 2:i32, %newvar0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i32 = select %2, 2:i32, 0:i32 | |
| infer %3 | |
| result %1 | |
| select ((newvar0 & 2) != 0) 2 0 | |
| => | |
| newvar0 & 2 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x0 = nullptr, *x1 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1784) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), &x1 <<= m_c_And(&x2 <<= m_ExtInt("2", 32), m_Value(x0))), &x2 <<= m_ExtInt("2", 32), m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x0)) { | |
| auto C0 = C(32, 2, B); | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(1784, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1584 | |
| %newvar0:i8 = var ; newvar0 | |
| %1:i8 = and 1:i8, %newvar0 | |
| %2:i32 = zext %1 | |
| %3:i1 = ne 0:i32, %2 | |
| %4:i32 = select %3, 1:i32, 0:i32 | |
| infer %4 | |
| result %2 | |
| select (zext((newvar0 & 1)) != 0) 1 0 | |
| => | |
| zext((newvar0 & 1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x1 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1584) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), &x0 <<= m_ZExt(&x2 <<= m_c_And(&x3 <<= m_ExtInt("1", 8), m_Value(x1)))), m_ExtInt("1", 32), m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x1)) { | |
| auto C0 = C(8, 1, B); | |
| auto ret = x0; | |
| if (util::check_width(ret, I)) { | |
| St.hit(1584, 4); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1003 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = and %symconst_2, %v0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %4:i8 = and %v0, %symconst_1 | |
| %5:i8 = or %2, %4 | |
| infer %5 | |
| %6:i8 = or %symconst_2, %symconst_1 | |
| %7:i8 = and %v0, %6 | |
| result %7 | |
| (v0 & C2) | (v0 & C1) | |
| => | |
| v0 & (C2 | C1) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1003) && match(I, m_c_Or(m_c_And(m_Constant(&x2), m_Value(x1)), m_c_And(m_Deferred(x1), m_Constant(&x0))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateAnd(x1, B->CreateOr(x2, x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1003, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 386 | |
| %newvar5:i64 = var ; newvar5 | |
| %newvar2:i64 = var ; newvar2 | |
| %2:i64 = shl 1:i64, %newvar2 | |
| %3:i64 = mul %newvar5, %2 | |
| infer %3 | |
| %4:i64 = shl %newvar5, %newvar2 | |
| result %4 | |
| newvar5 * (1 << newvar2) | |
| => | |
| newvar5 << newvar2 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 386) && match(I, m_c_Mul(m_Value(x1), m_Shl(m_ExtInt("1", 64), m_Value(x0))))) { | |
| if (util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateShl(x1, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(386, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3682 | |
| %newvar0:i32 = var ; newvar0 | |
| %1:i32 = subnsw %newvar0, 1:i32 | |
| %v3:i32 = var ; v3 | |
| %3:i1 = slt %1, %v3 | |
| infer %3 | |
| %4:i1 = sle %newvar0, %v3 | |
| result %4 | |
| (newvar0 -nsw 1) <s v3 | |
| => | |
| newvar0 <=s v3 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3682) && match(I, m_ICmp(P0, m_NSWSub(m_Value(x1), m_ExtInt("1", 32)), m_Value(x0)))) { | |
| if (P0 == ICmpInst::ICMP_SLT && util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_SLE, x1, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3682, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 30 | |
| %v0:i64 = var ; v0 | |
| %1:i64 = xor 18446744073709551615:i64, %v0 | |
| %2:i64 = add 1:i64, %1 | |
| infer %2 | |
| %3:i64 = mul 18446744073709551615:i64, %v0 | |
| result %3 | |
| ~v0 + 1 | |
| => | |
| v0 * 0xFFFFFFFFFFFFFFFF | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 30) && match(I, m_c_Add(m_ExtInt("1", 64), m_c_Xor(&x1 <<= m_AllOnes(), m_Value(x0))))) { | |
| if (util::dc(DT, I, x0)) { | |
| auto C0 = C(64, -1, B); | |
| auto ret = B->CreateMul(C0(x0), x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(30, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3056 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = mul 2:i8, %symconst_1 | |
| %3:i1 = eq %symconst_2, %2 | |
| pc %3 1:i1 | |
| %v1:i8 = var ; v1 | |
| %5:i8 = add %symconst_1, %v1 | |
| %6:i1 = eq %symconst_2, %5 | |
| infer %6 | |
| %7:i1 = eq %symconst_1, %v1 | |
| result %7 | |
| C2 == (C1 * 2) | |
| |= | |
| C2 == (v1 + C1) | |
| => | |
| v1 == C1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3056) && match(I, m_c_ICmp(P0, m_Constant(&x2), m_c_Add(m_Constant(&x1), m_Value(x3))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x1) && util::dc(DT, I, x3) && (eq(util::V(x2), mul(llvm::APInt(8, 2), util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x1, x3); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3056, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3055 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = and 1:i32, %v0 | |
| %2:i1 = eq 1:i32, %1 | |
| infer %2 | |
| %3:i1 = trunc %v0 | |
| result %3 | |
| (v0 & 1) == 1 | |
| => | |
| trunc(v0) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3055) && match(I, m_c_ICmp(P0, m_ExtInt("1", 32), m_c_And(m_ExtInt("1", 32), m_Value(x0))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateTrunc(x0, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3055, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2967 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %v1:i8 = var ; v1 | |
| %2:i8 = add %symconst_1, %v1 | |
| %3:i1 = eq %symconst_1, %2 | |
| infer %3 | |
| %4:i1 = eq 0:i8, %v1 | |
| result %4 | |
| C1 == (v1 + C1) | |
| => | |
| v1 == 0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2967) && match(I, m_c_ICmp(P0, m_Constant(&x1), m_c_Add(m_Deferred(x1), m_Value(x0))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x0)) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, C0(x0), x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2967, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2905 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = sext %v0 | |
| %3:i32 = add %symconst_1, %2 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %5:i32 = subnsw %3, %symconst_2 | |
| %6:i8 = trunc %5 | |
| infer %6 | |
| %7:i32 = sub %symconst_1, %symconst_2 | |
| %8:i8 = trunc %7 | |
| %9:i8 = add %v0, %8 | |
| result %9 | |
| trunc(((C1 + sext(v0)) -nsw C2)) | |
| => | |
| v0 + trunc((C1 - C2)) | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2905) && match(I, m_Trunc(m_NSWSub(m_c_Add(m_Constant(&x4), m_SExt(m_Value(x3))), m_Constant(&x1))))) { | |
| if (util::dc(DT, I, x3)) { | |
| auto ret = B->CreateAdd(x3, B->CreateTrunc(B->CreateSub(x4, x1), T(x3))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2905, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2814 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %2:i32 = sext 1:i1 | |
| %3:i32 = xor %symconst_2, %2 | |
| %4:i1 = eq %symconst_1, %3 | |
| pc %4 1:i1 | |
| %v0:i8 = var ; v0 | |
| %6:i32 = zext %v0 | |
| %7:i32 = and %symconst_1, %6 | |
| %8:i32 = or %symconst_2, %7 | |
| %9:i8 = trunc %8 | |
| infer %9 | |
| %10:i8 = trunc %symconst_2 | |
| %11:i8 = or %v0, %10 | |
| result %11 | |
| C1 == (C2 ^ sext(1)) | |
| |= | |
| trunc((C2 | (C1 & zext(v0)))) | |
| => | |
| v0 | trunc(C2) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x3 = nullptr, *x1 = nullptr, *x6 = nullptr, *x5 = nullptr, *x4 = nullptr; | |
| if (util::filter(F, 2814) && match(I, m_Trunc(m_c_Or(m_Constant(&x1), m_c_And(m_Constant(&x3), m_ZExt(m_Value(x6))))))) { | |
| if (util::dc(DT, I, x6) && (eq(util::V(x3), xor_(llvm::APInt(1, 1).sext(64), util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateOr(x6, B->CreateTrunc(x1, T(x6))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2814, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2777 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = sext %v0 | |
| %v2:i8 = var ; v2 | |
| %3:i32 = sext %v2 | |
| %4:i32 = and %1, %3 | |
| %5:i8 = trunc %4 | |
| infer %5 | |
| %6:i8 = and %v0, %v2 | |
| result %6 | |
| trunc((sext(v0) & sext(v2))) | |
| => | |
| v2 & v0 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2777) && match(I, m_Trunc(m_c_And(m_SExt(m_Value(x4)), m_SExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x4) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateAnd(x4, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2777, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2770 | |
| %v0:i8 = var ; v0 | |
| %1:i32 = sext %v0 | |
| %v2:i8 = var ; v2 | |
| %3:i32 = sext %v2 | |
| %4:i32 = xor %1, %3 | |
| %5:i8 = trunc %4 | |
| infer %5 | |
| %6:i8 = xor %v0, %v2 | |
| result %6 | |
| trunc((sext(v0) ^ sext(v2))) | |
| => | |
| v2 ^ v0 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2770) && match(I, m_Trunc(m_c_Xor(m_SExt(m_Value(x4)), m_SExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x4) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateXor(x4, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2770, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2751 | |
| %v4:i8 = var ; v4 | |
| %1:i32 = zext %v4 | |
| %v1:i8 = var ; v1 | |
| %3:i32 = zext %v1 (hasExternalUses) | |
| %4:i32 = sub %1, %3 | |
| %5:i8 = trunc %4 | |
| infer %5 | |
| %6:i8 = sub %v4, %v1 | |
| result %6 | |
| trunc((zext(v4) - zext(v1))) | |
| => | |
| v4 - v1 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2751) && match(I, m_Trunc(m_Sub(m_ZExt(m_Value(x4)), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x4) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSub(x4, x2); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2751, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2599 | |
| %v0:i8 = var ; v0 | |
| %1:i8 = and 1:i8, %v0 | |
| %2:i32 = zext %1 | |
| %3:i1 = ne 0:i32, %2 | |
| %4:i8 = zext %3 | |
| infer %4 | |
| result %1 | |
| zext((zext((v0 & 1)) != 0)) | |
| => | |
| v0 & 1 | |
| */ | |
| { | |
| llvm::Value *x4 = nullptr, *x2 = nullptr, *x3 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2599) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), m_ZExt(&x3 <<= m_c_And(&x4 <<= m_ExtInt("1", 8), m_Value(x2))))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2)) { | |
| auto C0 = C(8, 1, B); | |
| auto ret = x3; | |
| if (util::check_width(ret, I)) { | |
| St.hit(2599, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2443 | |
| %newvar0:i32 = var ; newvar0 | |
| %1:i32 = and 1:i32, %newvar0 | |
| %2:i1 = ne 0:i32, %1 | |
| %3:i8 = zext %2 | |
| infer %3 | |
| %4:i8 = trunc %1 | |
| result %4 | |
| zext(((newvar0 & 1) != 0)) | |
| => | |
| trunc((newvar0 & 1)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x1 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2443) && match(I, m_ZExt(m_c_ICmp(P0, m_Zero(), &x2 <<= m_c_And(&x3 <<= m_ExtInt("1", 32), m_Value(x1)))))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::dc(DT, I, x2) && util::dc(DT, I, x1)) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateTrunc(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2443, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2430 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = add 0:i32, %v0 | |
| %2:i64 = zext %1 | |
| infer %2 | |
| %3:i64 = zext %v0 | |
| result %3 | |
| zext((v0 + 0)) | |
| => | |
| zext(v0) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2430) && match(I, m_ZExt(m_c_Add(m_Zero(), m_Value(x1))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateZExt(x1, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2430, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1521 | |
| %v0:i32 = var ; v0 | |
| %1:i32 = width %v0 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %3:i1 = slt %v0, 0:i32 (hasExternalUses) | |
| %4:i32 = select %3, 1:i32, 0:i32 | |
| infer %4 | |
| %5:i32 = lshr %v0, 31:i32 | |
| result %5 | |
| width(v0) == 32 | |
| |= | |
| select (v0 <s 0) 1 0 | |
| => | |
| v0 >>l 31 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x1 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1521) && match(I, m_Select(m_ICmp(P0, m_Value(x1), m_Zero()), m_ExtInt("1", 32), m_Zero()))) { | |
| if (P0 == ICmpInst::ICMP_SLT && util::dc(DT, I, x1) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 31, B); | |
| auto ret = B->CreateLShr(x1, C0(x1)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1521, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1232 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %newvar1:i1 = var ; newvar1 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %4:i8 = select %newvar1, %symconst_1, %symconst_2 | |
| %5:i8 = xor %symconst_3, %4 | |
| infer %5 | |
| %6:i8 = xor %symconst_3, %symconst_1 | |
| %7:i8 = xor %symconst_3, %symconst_2 | |
| %8:i8 = select %newvar1, %6, %7 | |
| result %8 | |
| C3 ^ (select newvar1 C1 C2) | |
| => | |
| select newvar1 (C3 ^ C1) (C3 ^ C2) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1232) && match(I, m_c_Xor(m_Constant(&x3), m_Select(m_Value(x2), m_Constant(&x1), m_Constant(&x0))))) { | |
| if (util::check_width(x2,1) && util::dc(DT, I, x2)) { | |
| auto ret = B->CreateSelect(x2, B->CreateXor(x3, x1), B->CreateXor(x3, x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1232, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1106 | |
| %v0:i8 = var ; v0 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i8 = and %v0, %symconst_2 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %symconst_3:i8 = var ; symconst_3 | |
| %5:i8 = and %v0, %symconst_3 | |
| %6:i8 = and %symconst_1, %5 | |
| %7:i8 = or %2, %6 | |
| infer %7 | |
| %8:i8 = and %symconst_1, %symconst_3 | |
| %9:i8 = or %symconst_2, %8 | |
| %10:i8 = and %v0, %9 | |
| result %10 | |
| (v0 & C2) | (C1 & (v0 & C3)) | |
| => | |
| v0 & (C2 | (C3 & C1)) | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x3 = nullptr, *x2 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 1106) && match(I, m_c_Or(m_c_And(m_Value(x1), m_Constant(&x3)), m_c_And(m_Constant(&x2), m_c_And(m_Deferred(x1), m_Constant(&x0)))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto ret = B->CreateAnd(x1, B->CreateOr(x3, B->CreateAnd(x2, x0))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1106, 3); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 814 | |
| %v0:i32 = var (range=[1,2)) ; v0 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %2:i32 = and %v0, %symconst_1 | |
| infer %2 | |
| %3:i32 = and 1:i32, %symconst_1 | |
| result %3 | |
| v0 (range=[1,2)) & C1 | |
| => | |
| C1 & 1 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 814) && match(I, m_c_And(m_Value(x1), m_Constant(&x0)))) { | |
| if (util::dc(DT, I, x0) && util::cr(x1, "1", "2")) { | |
| auto C0 = C(32, 1, B); | |
| auto ret = B->CreateAnd(C0(x0), x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(814, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 781 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %v0:i1 = var ; v0 | |
| %2:i32 = select %v0, 0:i32, %symconst_2 | |
| %3:i32 = and %symconst_2, %2 | |
| infer %3 | |
| result %2 | |
| C2 & (select v0 0 C2) | |
| => | |
| select v0 0 C2 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x0 = nullptr, *x1 = nullptr, *x2 = nullptr; | |
| if (util::filter(F, 781) && match(I, m_c_And(m_Constant(&x0), &x2 <<= m_Select(m_Value(x1), &x3 <<= m_Zero(), m_Deferred(x0))))) { | |
| if (util::check_width(x1,1) && util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto C0 = C(32, 0, B); | |
| auto ret = x2; | |
| if (util::check_width(ret, I)) { | |
| St.hit(781, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 728 | |
| %symconst_4:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx111111) ; symconst_4 | |
| %1:i32 = width %symconst_4 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %newvar4:i32 = var ; newvar4 | |
| %4:i32 = width %newvar4 | |
| %5:i1 = eq 32:i32, %4 | |
| pc %5 1:i1 | |
| %symconst_2:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11) ; symconst_2 | |
| %7:i32 = width %symconst_2 | |
| %8:i1 = eq 32:i32, %7 | |
| pc %8 1:i1 | |
| %symconst_1:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx11x) ; symconst_1 | |
| %10:i32 = width %symconst_1 | |
| %11:i1 = eq 32:i32, %10 | |
| pc %11 1:i1 | |
| %v0:i8 = var ; v0 | |
| %13:i8 = width %v0 | |
| %14:i1 = eq 8:i8, %13 | |
| pc %14 1:i1 | |
| %15:i32 = zext %v0 | |
| %16:i32 = width %15 | |
| %17:i1 = eq 32:i32, %16 | |
| pc %17 1:i1 | |
| %18:i32 = and 60:i32, %newvar4 | |
| %19:i32 = ashr %15, %symconst_1 | |
| %20:i32 = and %symconst_2, %19 | |
| %21:i32 = or %18, %20 | |
| %22:i32 = and %symconst_4, %21 | |
| infer %22 | |
| %23:i32 = add %18, %19 | |
| result %23 | |
| width(C4 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxx111111)) == 32 && | |
| width(newvar4) == 32 && | |
| width(C2 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11)) == 32 && | |
| width(C1 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx11x)) == 32 && | |
| width(v0) == 8 && | |
| let var0 = zext(v0); | |
| width(var0) == 32 | |
| |= | |
| let var2 = (newvar4 & 60); | |
| let var4 = (var0 >>a C1); | |
| let var3 = (C2 & var4); | |
| let var1 = (var2 | var3); | |
| C4 & var1 | |
| => | |
| var2 + var4 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x6 = nullptr, *x5 = nullptr, *x4 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x9 = nullptr, *x8 = nullptr, *x7 = nullptr; | |
| if (util::filter(F, 728) && match(I, m_c_And(m_Constant(&x6), m_c_Or(&x8 <<= m_c_And(m_Value(x5), &x9 <<= m_ExtInt("60", 32)), m_c_And(m_Constant(&x4), &x7 <<= m_AShr(&x1 <<= m_ZExt(m_Value(x2)), m_Constant(&x3))))))) { | |
| if (util::dc(DT, I, x8) && util::dc(DT, I, x5) && util::dc(DT, I, x7) && util::dc(DT, I, x1) && util::dc(DT, I, x2) && util::dc(DT, I, x3) && util::k1(x6, "111111", 32) && util::k1(x4, "11", 32) && util::k1(x3, "110", 32) && util::check_width(x6,32) && util::check_width(x5,32) && util::check_width(x4,32) && util::check_width(x3,32) && util::check_width(x2,8) && util::check_width(x1,32)) { | |
| auto C0 = C(32, 60, B); | |
| auto ret = B->CreateAdd(x8, x7); | |
| if (util::check_width(ret, I)) { | |
| St.hit(728, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 64 | |
| %v0:i8 = var ; v0 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i8 = sub %v0, %symconst_2 | |
| %3:i8 = add 255:i8, %2 | |
| infer %3 | |
| %4:i8 = xor 255:i8, %symconst_2 | |
| %5:i8 = add %v0, %4 | |
| result %5 | |
| (v0 - C2) + 0xFF | |
| => | |
| v0 + ~C2 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 64) && match(I, m_c_Add(&x2 <<= m_AllOnes(), m_Sub(m_Value(x1), m_Constant(&x0))))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto C0 = C(8, -1, B); | |
| auto ret = B->CreateAdd(x1, B->CreateXor(C0(x0), x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(64, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 644 | |
| %symconst_1:i32 = var (knownBits=xxxxxxxxxxxxxxxxxxxxxxxx11111111) ; symconst_1 | |
| %1:i32 = width %symconst_1 | |
| %2:i1 = eq 32:i32, %1 | |
| pc %2 1:i1 | |
| %v0:i8 = var ; v0 | |
| %4:i8 = width %v0 | |
| %5:i1 = eq 8:i8, %4 | |
| pc %5 1:i1 | |
| %6:i32 = zext %v0 | |
| %7:i32 = width %6 | |
| %8:i1 = eq 32:i32, %7 | |
| pc %8 1:i1 | |
| %9:i32 = and %symconst_1, %6 | |
| infer %9 | |
| result %6 | |
| width(C1 (knownBits=xxxxxxxxxxxxxxxxxxxxxxxx11111111)) == 32 && | |
| width(v0) == 8 && | |
| let var0 = zext(v0); | |
| width(var0) == 32 | |
| |= | |
| C1 & var0 | |
| => | |
| var0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr; | |
| if (util::filter(F, 644) && match(I, m_c_And(m_Constant(&x3), &x1 <<= m_ZExt(m_Value(x2))))) { | |
| if (util::dc(DT, I, x2) && util::k1(x3, "11111111", 32) && util::check_width(x3,32) && util::check_width(x2,8) && util::check_width(x1,32)) { | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(644, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3962 | |
| %symconst_5:i8 = var ; symconst_5 | |
| %symconst_4:i8 = var ; symconst_4 | |
| %v0:i8 = var ; v0 | |
| %3:i8 = and %symconst_4, %v0 | |
| %4:i8 = and %symconst_5, %3 | |
| %symDF_DB:i8 = var ; symDF_DB | |
| %6:i8 = demandedmask %4, %symDF_DB | |
| infer %6 | |
| %7:i8 = and %symconst_5, %symDF_DB | |
| %8:i8 = and %symconst_4, %7 | |
| %9:i8 = and %v0, %8 | |
| %10:i8 = demandedmask %9, %symDF_DB | |
| result %10 | |
| C5 & (v0 & C4) | |
| => | |
| v0 & (C4 & (C5 & @db)) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 3962) && match(I, m_c_And(m_Constant(&x3), m_c_And(m_Constant(&x2), m_Value(x1))))) { | |
| if (util::symdb(DB, I, x0, B) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateAnd(x1, B->CreateAnd(x2, B->CreateAnd(x3, x0))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3962, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3947 | |
| %symconst_3:i32 = var ; symconst_3 | |
| %symDF_DB:i32 = var ; symDF_DB | |
| %2:i32 = xor 4294967295:i32, %symDF_DB | |
| %3:i1 = eq %symconst_3, %2 | |
| pc %3 1:i1 | |
| %newvar0:i32 = var ; newvar0 | |
| %5:i32 = and %symconst_3, %newvar0 | |
| %6:i32 = demandedmask %5, %symDF_DB | |
| infer %6 | |
| %7:i32 = demandedmask 0:i32, %symDF_DB | |
| result %7 | |
| C3 == ~@db | |
| |= | |
| C3 & newvar0 | |
| => | |
| 0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x2 = nullptr, *x1 = nullptr, *x3 = nullptr; | |
| if (util::filter(F, 3947) && match(I, m_c_And(m_Constant(&x2), m_Value(x3)))) { | |
| if (util::symdb(DB, I, x1, B) && util::dc(DT, I, x1) && (eq(util::V(x2), flip(util::V(x1))) == llvm::APInt(1, 1))) { | |
| auto C0 = C(32, 0, B); | |
| auto ret = C0(I); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3947, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3945 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %symDF_K1:i32 = var ; symDF_K1 | |
| %2:i1 = knownones %symconst_1, %symDF_K1 | |
| pc %2 1:i1 | |
| %symDF_DB:i32 = var ; symDF_DB | |
| %4:i1 = knownones %symDF_K1, %symDF_DB | |
| pc %4 1:i1 | |
| %newvar0:i32 = var ; newvar0 | |
| %6:i32 = or %symconst_1, %newvar0 | |
| %7:i32 = demandedmask %6, %symDF_DB | |
| infer %7 | |
| %8:i32 = demandedmask %symconst_1, %symDF_DB | |
| result %8 | |
| symconst_1.k1 <<=1 @db | |
| |= | |
| let var0 = C1 | newvar0; | |
| var0 | |
| => | |
| C1 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x5 = nullptr, *x3 = nullptr, *x4 = nullptr, *x2 = nullptr, *x1 = nullptr, *x6 = nullptr; | |
| if (util::filter(F, 3945) && match(I, m_c_Or(m_Constant(&x5), m_Value(x6)))) { | |
| if (util::symk1bind(x5, x3, B) && util::symdb(DB, I, x2, B) && util::dc(DT, I, x5) && util::dc(DT, I, x2) && util::symk1test(x3, x2)) { | |
| auto ret = x5; | |
| if (util::check_width(ret, I)) { | |
| St.hit(3945, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 391 | |
| %newvar0:i8 = var ; newvar0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = sub %newvar0, %symconst_1 | |
| %3:i8 = mul 255:i8, %2 | |
| infer %3 | |
| %4:i8 = sub %symconst_1, %newvar0 | |
| result %4 | |
| (newvar0 - C1) * 0xFF | |
| => | |
| C1 - newvar0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 391) && match(I, m_c_Mul(m_Sub(m_Value(x1), m_Constant(&x0)), m_AllOnes()))) { | |
| if (util::dc(DT, I, x0) && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateSub(x0, x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(391, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 326 | |
| %v0:i8 = var ; v0 | |
| %1:i8 = sub 0:i8, %v0 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %3:i8 = subnsw %1, %symconst_2 | |
| infer %3 | |
| %4:i8 = sub 0:i8, %symconst_2 | |
| %5:i8 = sub %4, %v0 | |
| result %5 | |
| (0 - v0) -nsw C2 | |
| => | |
| (0 - C2) - v0 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 326) && match(I, m_NSWSub(m_Sub(&x2 <<= m_Zero(), m_Value(x1)), m_Constant(&x0)))) { | |
| if (util::dc(DT, I, x1)) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateSub(B->CreateSub(C0(x0), x0), x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(326, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 320 | |
| %v0:i32 = var ; v0 | |
| %newvar0:i32 = var ; newvar0 | |
| %2:i32 = add %v0, %newvar0 | |
| %3:i32 = subnsw %2, %newvar0 | |
| infer %3 | |
| result %v0 | |
| (v0 + newvar0) -nsw newvar0 | |
| => | |
| v0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 320) && match(I, m_NSWSub(m_c_Add(m_Value(x1), m_Value(x0)), m_Deferred(x0)))) { | |
| auto ret = x1; | |
| if (util::check_width(ret, I)) { | |
| St.hit(320, 2); | |
| return ret; | |
| } | |
| } | |
| } | |
| /* Opt : 3108 | |
| %v0:i8 = var ; v0 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %2:i8 = add %v0, %symconst_1 | |
| %v2:i8 = var ; v2 | |
| %4:i8 = add %symconst_1, %v2 | |
| %5:i1 = eq %2, %4 | |
| infer %5 | |
| %6:i1 = eq %v0, %v2 | |
| result %6 | |
| (v0 + C1) == (v2 + C1) | |
| => | |
| v2 == v0 | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3108) && match(I, m_c_ICmp(P0, m_c_Add(m_Value(x2), m_Constant(&x1)), m_c_Add(m_Deferred(x1), m_Value(x0))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x2) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x2, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3108, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3102 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i8 = sub 0:i8, %v0 | |
| %3:i1 = eq %symconst_1, %2 | |
| infer %3 | |
| %4:i8 = sub 0:i8, %symconst_1 | |
| %5:i1 = eq %v0, %4 | |
| result %5 | |
| C1 == (0 - v0) | |
| => | |
| v0 == (0 - C1) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3102) && match(I, m_c_ICmp(P0, m_Constant(&x1), m_Sub(&x2 <<= m_Zero(), m_Value(x0))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x0)) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x0, B->CreateSub(C0(x1), x1)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3102, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3066 | |
| %newvar1:i8 = var ; newvar1 | |
| %1:i1 = eq %newvar1, %newvar1 | |
| infer %1 | |
| %2:i1 = eq 0:i8, 0:i8 | |
| result %2 | |
| newvar1 == newvar1 | |
| => | |
| 0 == 0 | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3066) && match(I, m_c_ICmp(P0, m_Value(x0), m_Deferred(x0)))) { | |
| if (P0 == ICmpInst::ICMP_EQ) { | |
| auto C0 = C(8, 0, B); | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, C0(), C0()); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3066, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 3058 | |
| %v0:i1 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %2:i1 = eq 0:i32, %1 | |
| infer %2 | |
| %3:i1 = xor 1:i1, %v0 | |
| result %3 | |
| zext(v0) == 0 | |
| => | |
| ~v0 | |
| */ | |
| { | |
| llvm::Value *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 3058) && match(I, m_c_ICmp(P0, m_Zero(), m_ZExt(m_Value(x1))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::check_width(x1,1) && util::dc(DT, I, x1)) { | |
| auto C0 = C(1, -1, B); | |
| auto ret = B->CreateXor(C0(x1), x1); | |
| if (util::check_width(ret, I)) { | |
| St.hit(3058, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2980 | |
| %symconst_1:i8 = var ; symconst_1 | |
| %newvar0:i8 = var ; newvar0 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %3:i8 = sub %newvar0, %symconst_2 | |
| %4:i1 = eq %symconst_1, %3 | |
| infer %4 | |
| %5:i8 = add %symconst_1, %symconst_2 | |
| %6:i1 = eq %newvar0, %5 | |
| result %6 | |
| C1 == (newvar0 - C2) | |
| => | |
| newvar0 == (C2 + C1) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 2980) && match(I, m_c_ICmp(P0, m_Constant(&x2), m_Sub(m_Value(x1), m_Constant(&x0))))) { | |
| if (P0 == ICmpInst::ICMP_EQ && util::dc(DT, I, x1)) { | |
| auto ret = B->CreateCmp(ICmpInst::ICMP_EQ, x1, B->CreateAdd(x2, x0)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2980, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 285 | |
| %symconst_1:i16 = var ; symconst_1 | |
| %symconst_2:i8 = var ; symconst_2 | |
| %2:i16 = zext %symconst_2 | |
| %3:i1 = eq %symconst_1, %2 | |
| pc %3 1:i1 | |
| %newvar4:i16 = var ; newvar4 | |
| %5:i16 = add %symconst_1, %newvar4 | |
| %6:i8 = trunc %5 | |
| %7:i8 = sub %6, %symconst_2 | |
| infer %7 | |
| %8:i8 = trunc %newvar4 | |
| result %8 | |
| C1 == zext(C2) | |
| |= | |
| trunc((C1 + newvar4)) - C2 | |
| => | |
| trunc(newvar4) | |
| */ | |
| { | |
| llvm::Value *x0 = nullptr, *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x5 = nullptr, *x4 = nullptr; | |
| if (util::filter(F, 285) && match(I, m_Sub(m_Trunc(m_c_Add(m_Constant(&x3), m_Value(x5))), m_Constant(&x2)))) { | |
| if (util::dc(DT, I, x5) && (eq(util::V(x3), util::V(x2).zext(64)) == llvm::APInt(1, 1))) { | |
| auto ret = B->CreateTrunc(x5, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(285, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2837 | |
| %symconst_1:i32 = var ; symconst_1 | |
| %v0:i8 = var ; v0 | |
| %2:i32 = zext %v0 | |
| %3:i32 = mul %symconst_1, %2 | |
| %4:i8 = trunc %3 | |
| infer %4 | |
| %5:i8 = trunc %symconst_1 | |
| %6:i8 = mul %v0, %5 | |
| result %6 | |
| trunc((C1 * zext(v0))) | |
| => | |
| v0 * trunc(C1) | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2837) && match(I, m_Trunc(m_c_Mul(m_Constant(&x3), m_ZExt(m_Value(x2)))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateMul(x2, B->CreateTrunc(x3, T(x2))); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2837, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 2816 | |
| %newvar1:i16 = var ; newvar1 | |
| %1:i32 = zext %newvar1 | |
| %2:i8 = trunc %1 | |
| infer %2 | |
| %3:i8 = trunc %newvar1 | |
| result %3 | |
| trunc(zext(newvar1)) | |
| => | |
| trunc(newvar1) | |
| */ | |
| { | |
| llvm::Value *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| if (util::filter(F, 2816) && match(I, m_Trunc(m_ZExt(m_Value(x2))))) { | |
| if (util::dc(DT, I, x2)) { | |
| auto ret = B->CreateTrunc(x2, T(I)); | |
| if (util::check_width(ret, I)) { | |
| St.hit(2816, 1); | |
| return ret; | |
| } | |
| } | |
| }} | |
| /* Opt : 1922 | |
| %v0:i1 = var ; v0 | |
| %1:i32 = zext %v0 | |
| %2:i1 = ne 0:i32, %1 | |
| %symconst_2:i32 = var ; symconst_2 | |
| %v3:i32 = var ; v3 | |
| %5:i32 = select %2, %symconst_2, %v3 | |
| infer %5 | |
| %6:i32 = select %v0, %symconst_2, %v3 | |
| result %6 | |
| select (zext(v0) != 0) C2 v3 | |
| => | |
| select v0 C2 v3 | |
| */ | |
| { | |
| llvm::Value *x3 = nullptr, *x2 = nullptr, *x1 = nullptr, *x0 = nullptr; | |
| ICmpInst::Predicate P0; | |
| if (util::filter(F, 1922) && match(I, m_Select(m_c_ICmp(P0, m_Zero(), m_ZExt(m_Value(x3))), m_Constant(&x1), m_Value(x0)))) { | |
| if (P0 == ICmpInst::ICMP_NE && util::check_width(x3,1) && util::dc(DT, I, x3) && util::dc(DT, I, x1) && util::dc(DT, I, x0)) { | |
| auto ret = B->CreateSelect(x3, x1, x0); | |
| if (util::check_width(ret, I)) { | |
| St.hit(1922, 2); | |
| return ret; | |
| } | |
| } | |
| }} | |
| return nullptr; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment