mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[InstCombine] Fix div handling
When we optimize select basing on fact that div by 0 is undef we should not traverse the instruction which are not guaranteed to transfer execution to next instruction. Guard intrinsic is an example. Reviewers: spatel, craig.topper Reviewed By: spatel Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D47576 llvm-svn: 333864
This commit is contained in:
parent
56aff921dc
commit
8b2aa5885a
@ -581,9 +581,9 @@ bool InstCombiner::simplifyDivRemOfSelectWithZeroOp(BinaryOperator &I) {
|
||||
Type *CondTy = SelectCond->getType();
|
||||
while (BBI != BBFront) {
|
||||
--BBI;
|
||||
// If we found a call to a function, we can't assume it will return, so
|
||||
// If we found an instruction that we can't assume will return, so
|
||||
// information from below it cannot be propagated above it.
|
||||
if (isa<CallInst>(BBI) && !isa<IntrinsicInst>(BBI))
|
||||
if (!isGuaranteedToTransferExecutionToSuccessor(&*BBI))
|
||||
break;
|
||||
|
||||
// Replace uses of the select or its condition with the known values.
|
||||
|
@ -3,11 +3,11 @@
|
||||
|
||||
declare void @llvm.experimental.guard(i1, ...)
|
||||
|
||||
; FIXME: If %flag is false then %s == 0 and guard should be triggered.
|
||||
|
||||
; Regression test. If %flag is false then %s == 0 and guard should be triggered.
|
||||
define i32 @a(i1 %flag, i32 %X) nounwind readnone {
|
||||
; CHECK-LABEL: @a(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[FLAG:%.*]]
|
||||
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[CMP]]) #1 [ "deopt"() ]
|
||||
; CHECK-NEXT: [[R:%.*]] = sdiv i32 100, [[X]]
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
@ -18,4 +18,3 @@ define i32 @a(i1 %flag, i32 %X) nounwind readnone {
|
||||
%r = sdiv i32 100, %s
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user