brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · 7f07182 Raw
136 lines · plain
1; RUN: opt -verify-loop-info -irce-print-changed-loops -passes=irce -S < %s 2>&1 | FileCheck %s2; RUN: opt -verify-loop-info -irce-print-changed-loops -passes='require<branch-prob>,irce' -S < %s 2>&1 | FileCheck %s3 4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1"5target triple = "x86_64-unknown-linux-gnu"6 7; IRCE should fail here because the preheader's exiting value is a phi from the8; loop, and this value cannot be expanded at loop's preheader.9 10; CHECK-NOT:   irce: in function test_01: constrained Loop11; CHECK-NOT:   irce: in function test_02: constrained Loop12; CHECK-LABEL: irce: in function test_03: constrained Loop13 14define void @test_01() {15 16; CHECK-NOT:   irce: in function test_01: constrained Loop17 18; CHECK-LABEL: test_0119; CHECK-NOT:   preloop20; CHECK-NOT:   postloop21; CHECK-NOT:   br i1 false22; CHECK-NOT:   br i1 true23 24entry:25  br label %loop26 27exit:                                       ; preds = %guarded, %loop28  ret void29 30loop:                                      ; preds = %guarded, %entry31  %iv = phi i64 [ 380, %entry ], [ %limit, %guarded ]32  %bad_phi = phi i32 [ 3, %entry ], [ %bad_phi.next, %guarded ]33  %bad_phi.next = add nuw nsw i32 %bad_phi, 134  %iv.next = add nuw nsw i64 %iv, 135  %rc = icmp slt i64 %iv.next, 536  br i1 %rc, label %guarded, label %exit37 38guarded:39  %limit = add nsw i64 %iv, -140  %tmp5 = add nuw nsw i32 %bad_phi, 841  %tmp6 = zext i32 %tmp5 to i6442  %tmp7 = icmp eq i64 %limit, %tmp643  br i1 %tmp7, label %exit, label %loop44}45 46; This test should fail because we are unable to prove that the division is47; safe to expand it to preheader: if we exit by maybe_exit condition, it is48; unsafe to execute it there.49 50define void @test_02(ptr %p1, ptr %p2, i1 %maybe_exit) {51 52; CHECK-LABEL: test_0253; CHECK-NOT:   preloop54; CHECK-NOT:   postloop55; CHECK-NOT:   br i1 false56; CHECK-NOT:   br i1 true57 58 59entry:60  %num = load i64, ptr %p1, align 4, !range !061  %denom = load i64, ptr %p2, align 4, !range !062  br label %loop63 64exit:                                       ; preds = %guarded, %loop65  ret void66 67loop:                                      ; preds = %guarded, %entry68  %iv = phi i64 [ 0, %entry ], [ %iv.next, %guarded ]69  %iv.next = add nuw nsw i64 %iv, 170  br i1 %maybe_exit, label %range_check, label %exit71 72range_check:73  %div_result = udiv i64 %num, %denom74  %rc = icmp slt i64 %iv.next, %div_result75  br i1 %rc, label %guarded, label %exit76 77guarded:78  %gep = getelementptr i64, ptr %p1, i64 %iv.next79  %loaded = load i64, ptr %gep, align 480  %tmp7 = icmp slt i64 %iv.next, 100081  br i1 %tmp7, label %loop, label %exit82}83 84define void @test_03(ptr %p1, ptr %p2, i1 %maybe_exit) {85 86; Show that IRCE would hit test_02 if the division was safe (denom not zero).87 88; CHECK-LABEL: test_0389; CHECK:       entry:90; CHECK-NEXT:    %num = load i64, ptr %p1, align 491; CHECK-NEXT:    [[DIV:%[^ ]+]] = udiv i64 %num, 1392; CHECK-NEXT:    [[DIV_MINUS_1:%[^ ]+]] = add nsw i64 [[DIV]], -193; CHECK-NEXT:    %exit.mainloop.at = call i64 @llvm.smax.i64(i64 [[DIV_MINUS_1]], i64 0)94; CHECK-NEXT:    [[COMP2:%[^ ]+]] = icmp slt i64 0, %exit.mainloop.at95; CHECK-NEXT:    br i1 [[COMP2]], label %loop.preheader, label %main.pseudo.exit96; CHECK-NOT:     preloop97; CHECK:       loop:98; CHECK-NEXT:    %iv = phi i64 [ %iv.next, %guarded ], [ 0, %loop.preheader ]99; CHECK-NEXT:    %iv.next = add nuw nsw i64 %iv, 1100; CHECK-NEXT:    %rc = icmp slt i64 %iv.next, %div_result101; CHECK-NEXT:    %or.cond = select i1 %maybe_exit, i1 true, i1 false102; CHECK-NEXT:    br i1 %or.cond, label %guarded, label %exit.loopexit1103; CHECK:       guarded:104; CHECK-NEXT:    %gep = getelementptr i64, ptr %p1, i64 %iv.next105; CHECK-NEXT:    %loaded = load i64, ptr %gep, align 4106; CHECK-NEXT:    %tmp7 = icmp slt i64 %iv.next, 1000107; CHECK-NEXT:    [[EXIT_MAIN_LOOP:%[^ ]+]] = icmp slt i64 %iv.next, %exit.mainloop.at108; CHECK-NEXT:    br i1 [[EXIT_MAIN_LOOP]], label %loop, label %main.exit.selector109; CHECK:       postloop110 111entry:112  %num = load i64, ptr %p1, align 4, !range !0113  br label %loop114 115exit:                                       ; preds = %guarded, %loop116  ret void117 118loop:                                      ; preds = %guarded, %entry119  %iv = phi i64 [ 0, %entry ], [ %iv.next, %guarded ]120  %iv.next = add nuw nsw i64 %iv, 1121  br i1 %maybe_exit, label %range_check, label %exit122 123range_check:124  %div_result = udiv i64 %num, 13125  %rc = icmp slt i64 %iv.next, %div_result126  br i1 %rc, label %guarded, label %exit127 128guarded:129  %gep = getelementptr i64, ptr %p1, i64 %iv.next130  %loaded = load i64, ptr %gep, align 4131  %tmp7 = icmp slt i64 %iv.next, 1000132  br i1 %tmp7, label %loop, label %exit133}134 135!0 = !{i64 0, i64 100}136