49 lines
1.6 KiB
LLVM
49 lines
1.6 KiB
LLVM
; RUN: opt -loop-unswitch -loop-unswitch-memoryssa-threshold=0 -memssa-check-limit=1 -enable-new-pm=0 -S %s | FileCheck --check-prefix=THRESHOLD-0 %s
|
|
; RUN: opt -loop-unswitch -memssa-check-limit=1 -S -enable-new-pm=0 %s | FileCheck --check-prefix=THRESHOLD-DEFAULT %s
|
|
|
|
; Make sure -loop-unswitch-memoryssa-threshold works. The test uses
|
|
; -memssa-check-limit=1 to effectively disable any MemorySSA optimizations
|
|
; on construction, so the test can be kept simple.
|
|
|
|
declare void @clobber()
|
|
|
|
; Partial unswitching is possible, because the store in %noclobber does not
|
|
; alias the load of the condition.
|
|
define i32 @partial_unswitch_true_successor_noclobber(i32* noalias %ptr.1, i32* noalias %ptr.2, i32 %N) {
|
|
; THRESHOLD-0-LABEL: @partial_unswitch_true_successor
|
|
; THRESHOLD-0: entry:
|
|
; THRESHOLD-0: br label %loop.header
|
|
;
|
|
; THRESHOLD-DEFAULT-LABEL: @partial_unswitch_true_successor
|
|
; THRESHOLD-DEFAULT-NEXT: entry:
|
|
; THRESHOLD-DEFAULT-NEXT: [[LV:%[0-9]+]] = load i32, i32* %ptr.1, align 4
|
|
; THRESHOLD-DEFAULT-NEXT: [[C:%[0-9]+]] = icmp eq i32 [[LV]], 100
|
|
; THRESHOLD-DEFAULT-NEXT: br i1 [[C]]
|
|
;
|
|
entry:
|
|
br label %loop.header
|
|
|
|
loop.header:
|
|
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
|
|
%lv = load i32, i32* %ptr.1
|
|
%sc = icmp eq i32 %lv, 100
|
|
br i1 %sc, label %noclobber, label %clobber
|
|
|
|
noclobber:
|
|
%gep.1 = getelementptr i32, i32* %ptr.2, i32 %iv
|
|
store i32 %lv, i32* %gep.1
|
|
br label %loop.latch
|
|
|
|
clobber:
|
|
call void @clobber()
|
|
br label %loop.latch
|
|
|
|
loop.latch:
|
|
%c = icmp ult i32 %iv, %N
|
|
%iv.next = add i32 %iv, 1
|
|
br i1 %c, label %loop.header, label %exit
|
|
|
|
exit:
|
|
ret i32 10
|
|
}
|