Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison.ll
Show First 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | |||||
define void @test-add-not-header2(float* %input, i32 %offset, i32 %numIterations) { | define void @test-add-not-header2(float* %input, i32 %offset, i32 %numIterations) { | ||||
; CHECK-LABEL: @test-add-not-header2 | ; CHECK-LABEL: @test-add-not-header2 | ||||
entry: | entry: | ||||
br label %loop | br label %loop | ||||
loop: | loop: | ||||
%i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ] | %i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ] | ||||
; CHECK: %index32 = | ; CHECK: %index32 = | ||||
; CHECK: --> {%offset,+,1}<nsw> | |||||
%index32 = add nsw i32 %i, %offset | |||||
%ptr = getelementptr inbounds float, float* %input, i32 %index32 | |||||
%nexti = add nsw i32 %i, 1 | |||||
br label %loop2 | |||||
loop2: | |||||
%f = load float, float* %ptr, align 4 | |||||
%exitcond = icmp eq i32 %nexti, %numIterations | |||||
br i1 %exitcond, label %exit, label %loop | |||||
exit: | |||||
ret void | |||||
} | |||||
; Similar to test-add-not-header, but in this case the load | |||||
; instruction may not be executed. | |||||
define void @test-add-not-header3(float* %input, i32 %offset, i32 %numIterations, | |||||
i1* %cond_buf) { | |||||
; CHECK-LABEL: @test-add-not-header3 | |||||
entry: | |||||
br label %loop | |||||
loop: | |||||
%i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ] | |||||
; CHECK: %index32 = | |||||
; CHECK: --> {%offset,+,1}<nw> | ; CHECK: --> {%offset,+,1}<nw> | ||||
%index32 = add nsw i32 %i, %offset | %index32 = add nsw i32 %i, %offset | ||||
%ptr = getelementptr inbounds float, float* %input, i32 %index32 | %ptr = getelementptr inbounds float, float* %input, i32 %index32 | ||||
%nexti = add nsw i32 %i, 1 | %nexti = add nsw i32 %i, 1 | ||||
%cond = load volatile i1, i1* %cond_buf | |||||
br i1 %cond, label %loop2, label %exit | |||||
loop2: | |||||
%f = load float, float* %ptr, align 4 | |||||
%exitcond = icmp eq i32 %nexti, %numIterations | |||||
br i1 %exitcond, label %exit, label %loop | |||||
exit: | |||||
ret void | |||||
} | |||||
; Same thing as test-add-not-header2, except we have a few extra | |||||
; blocks. | |||||
define void @test-add-not-header4(float* %input, i32 %offset, i32 %numIterations) { | |||||
; CHECK-LABEL: @test-add-not-header4 | |||||
entry: | |||||
br label %loop | |||||
loop: | |||||
%i = phi i32 [ %nexti, %loop2 ], [ 0, %entry ] | |||||
; CHECK: %index32 = | |||||
; CHECK: --> {%offset,+,1}<nsw> | |||||
%index32 = add nsw i32 %i, %offset | |||||
%ptr = getelementptr inbounds float, float* %input, i32 %index32 | |||||
%nexti = add nsw i32 %i, 1 | |||||
br label %loop3 | |||||
loop3: | |||||
br label %loop4 | |||||
loop4: | |||||
br label %loop2 | br label %loop2 | ||||
loop2: | loop2: | ||||
%f = load float, float* %ptr, align 4 | %f = load float, float* %ptr, align 4 | ||||
%exitcond = icmp eq i32 %nexti, %numIterations | %exitcond = icmp eq i32 %nexti, %numIterations | ||||
br i1 %exitcond, label %exit, label %loop | br i1 %exitcond, label %exit, label %loop | ||||
exit: | exit: | ||||
ret void | ret void | ||||
} | } | ||||
; Demonstrate why we need a Visited set in llvm::isKnownNotFullPoison. | |||||
define void @test-add-not-header5(float* %input, i32 %offset) { | |||||
; CHECK-LABEL: @test-add-not-header5 | |||||
entry: | |||||
br label %loop | |||||
loop: | |||||
%i = phi i32 [ %nexti, %loop ], [ 0, %entry ] | |||||
; CHECK: %index32 = | |||||
; CHECK: --> {%offset,+,1}<nw> | |||||
%index32 = add nsw i32 %i, %offset | |||||
%ptr = getelementptr inbounds float, float* %input, i32 %index32 | |||||
%nexti = add nsw i32 %i, 1 | |||||
br label %loop | |||||
exit: | |||||
ret void | |||||
} | |||||
; The call instruction makes it not guaranteed that the add will be | ; The call instruction makes it not guaranteed that the add will be | ||||
; executed, since it could run forever or throw an exception, so we | ; executed, since it could run forever or throw an exception, so we | ||||
; cannot assume that the UB is realized. | ; cannot assume that the UB is realized. | ||||
define void @test-add-call(float* %input, i32 %offset, i32 %numIterations) { | define void @test-add-call(float* %input, i32 %offset, i32 %numIterations) { | ||||
; CHECK-LABEL: @test-add-call | ; CHECK-LABEL: @test-add-call | ||||
entry: | entry: | ||||
br label %loop | br label %loop | ||||
loop: | loop: | ||||
▲ Show 20 Lines • Show All 455 Lines • Show Last 20 Lines |