
This change builds on 0a357ad which supported non-constant strides in howFarToZero, but used only context insensitive reasoning. This change does two things: 1) Directly use context sensitive queries to prove facts established before the loop. Note that we technically only need facts known at the latch, but using facts known on entry is a conservative approximation which will cover most everything. 2) For the non-zero check, we can usually prove non-zero from the finite assumption implied by mustprogress. This eliminates the need to do the context sensitive query in the common case.
49 lines
1.5 KiB
LLVM
49 lines
1.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes='loop(loop-rotate,loop-deletion)' -S | FileCheck %s
|
|
|
|
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
define void @main() {
|
|
; CHECK-LABEL: @main(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[L0_PREHEADER:%.*]]
|
|
; CHECK: L0.L0.preheader.loopexit_crit_edge:
|
|
; CHECK-NEXT: br label [[L0_PREHEADER_LOOPEXIT:%.*]]
|
|
; CHECK: L0.preheader.loopexit:
|
|
; CHECK-NEXT: br label [[L0_PREHEADER]]
|
|
; CHECK: L0.preheader:
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, 0
|
|
; CHECK-NEXT: [[INC:%.*]] = zext i1 [[CMP]] to i32
|
|
; CHECK-NEXT: [[TOBOOL3_NOT1:%.*]] = icmp eq i32 [[INC]], 0
|
|
; CHECK-NEXT: br i1 [[TOBOOL3_NOT1]], label [[L0_PREHEADER_LOOPEXIT]], label [[L1_PREHEADER_LR_PH:%.*]]
|
|
; CHECK: L1.preheader.lr.ph:
|
|
; CHECK-NEXT: br label [[L0_L0_PREHEADER_LOOPEXIT_CRIT_EDGE:%.*]]
|
|
;
|
|
entry:
|
|
br label %L0.preheader
|
|
|
|
L0.preheader:
|
|
br label %L0
|
|
|
|
L0: ; preds = %L0.latch, %L0.preheader
|
|
%k.0 = phi i32 [ 0, %L0.preheader ], [ %spec.select, %L0.latch ]
|
|
%cmp = icmp slt i32 0, 0
|
|
%inc = zext i1 %cmp to i32
|
|
%spec.select = add nsw i32 %k.0, %inc
|
|
%tobool3.not = icmp eq i32 %spec.select, 0
|
|
br i1 %tobool3.not, label %L0.preheader, label %L1.preheader
|
|
|
|
L1.preheader:
|
|
%tobool8.not = icmp eq i32 %k.0, 0
|
|
br label %L1
|
|
|
|
L1:
|
|
br i1 %tobool8.not, label %L1.latch, label %L0.latch
|
|
|
|
L1.latch:
|
|
br i1 false, label %L1, label %L0.latch
|
|
|
|
L0.latch:
|
|
br label %L0
|
|
}
|