@@ -17,51 +17,19 @@ using namespace swift;
17
17
static bool isSideEffectFree (BuiltinFunctionRefInst *FR) {
18
18
19
19
// First, check if we are dealing with a swift builtin.
20
- const BuiltinInfo &Info = FR->getBuiltinInfo ();
21
- if (Info .ID != BuiltinValueKind::None) {
22
- return Info .isReadNone ();
20
+ const BuiltinInfo &BInfo = FR->getBuiltinInfo ();
21
+ if (BInfo .ID != BuiltinValueKind::None) {
22
+ return BInfo .isReadNone ();
23
23
}
24
24
25
25
// Second, specialcase llvm intrinsic.
26
- // FIXME: This list might not be complete. Would be good to derive this
27
- // info from llvm.
28
- switch (FR->getIntrinsicInfo ().ID ) {
29
- default :
30
- return false ;
31
- case llvm::Intrinsic::fabs:
32
- case llvm::Intrinsic::log:
33
- case llvm::Intrinsic::log2:
34
- case llvm::Intrinsic::log10:
35
- case llvm::Intrinsic::exp:
36
- case llvm::Intrinsic::exp2:
37
- case llvm::Intrinsic::floor:
38
- case llvm::Intrinsic::sqrt:
39
- case llvm::Intrinsic::pow:
40
- case llvm::Intrinsic::powi:
41
- case llvm::Intrinsic::bswap:
42
- case llvm::Intrinsic::ctpop:
43
- case llvm::Intrinsic::ctlz:
44
- case llvm::Intrinsic::cttz:
45
- case llvm::Intrinsic::sadd_with_overflow:
46
- case llvm::Intrinsic::uadd_with_overflow:
47
- case llvm::Intrinsic::ssub_with_overflow:
48
- case llvm::Intrinsic::usub_with_overflow:
49
- case llvm::Intrinsic::smul_with_overflow:
50
- case llvm::Intrinsic::umul_with_overflow:
51
- case llvm::Intrinsic::convert_from_fp16:
52
- case llvm::Intrinsic::convert_to_fp16:
53
- case llvm::Intrinsic::x86_sse_cvtss2si:
54
- case llvm::Intrinsic::x86_sse_cvtss2si64:
55
- case llvm::Intrinsic::x86_sse_cvttss2si:
56
- case llvm::Intrinsic::x86_sse_cvttss2si64:
57
- case llvm::Intrinsic::x86_sse2_cvtsd2si:
58
- case llvm::Intrinsic::x86_sse2_cvtsd2si64:
59
- case llvm::Intrinsic::x86_sse2_cvttsd2si:
60
- case llvm::Intrinsic::x86_sse2_cvttsd2si64:
61
- return true ;
26
+ const IntrinsicInfo & IInfo = FR->getIntrinsicInfo ();
27
+ if (IInfo.ID != llvm::Intrinsic::not_intrinsic) {
28
+ return ( (IInfo.hasAttribute (llvm::Attribute::ReadNone) ||
29
+ IInfo.hasAttribute (llvm::Attribute::ReadOnly)) &&
30
+ IInfo.hasAttribute (llvm::Attribute::NoUnwind) );
62
31
}
63
32
64
- // FIXME: Special handling of LLVM IR instructions.
65
33
llvm_unreachable (" All cases are covered." );
66
34
}
67
35
@@ -76,8 +44,7 @@ static bool isInstructionTriviallyDead(SILInstruction *I) {
76
44
if (const ApplyInst *AI = dyn_cast<ApplyInst>(I)) {
77
45
if (BuiltinFunctionRefInst *FR =
78
46
dyn_cast<BuiltinFunctionRefInst>(AI->getCallee ().getDef ())) {
79
- if (isSideEffectFree (FR))
80
- return true ;
47
+ return isSideEffectFree (FR);
81
48
}
82
49
}
83
50
0 commit comments