brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 0a00f1e Raw
100 lines · plain
1; RUN: opt -passes=licm < %s -S | FileCheck %s2; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<target-ir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck %s3 4define void @f_0(i1 %p, i1 %arg) nounwind ssp {5; CHECK-LABEL: @f_0(6entry:7  br label %for.body8 9for.body:10  br i1 %arg, label %if.then, label %for.cond.backedge11 12for.cond.backedge:13  br i1 %arg, label %for.end104, label %for.body14 15if.then:16  br i1 %arg, label %if.then27, label %if.end.if.end.split_crit_edge.critedge17 18if.then27:19; CHECK: tail call void @llvm.assume20  tail call void @llvm.assume(i1 %p)21  br label %for.body61.us22 23if.end.if.end.split_crit_edge.critedge:24  br label %for.body6125 26for.body61.us:27  br i1 %arg, label %for.cond.backedge, label %for.body61.us28 29for.body61:30  br i1 %arg, label %for.cond.backedge, label %for.body6131 32for.end104:33  ret void34}35 36define void @f_1(i1 %cond, ptr %ptr) {37; CHECK-LABEL: @f_1(38; CHECK-LABEL: entry:39; CHECK: call void @llvm.assume(i1 %cond)40; CHECK: %val = load i32, ptr %ptr41; CHECK-LABEL: loop:42 43entry:44  br label %loop45 46loop:47  %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]48  call void @llvm.assume(i1 %cond)49  %val = load i32, ptr %ptr50  %x.inc = add i32 %x, %val51  br label %loop52}53 54; Can't hoist because the call may throw and the assume55; may never execute.56define void @f_2(i1 %cond, ptr %ptr) {57; CHECK-LABEL: @f_2(58; CHECK-LABEL: entry:59; CHECK-LABEL: loop:60; CHECK: call void @llvm.assume(i1 %cond)61; CHECK: %val = load i32, ptr %ptr62 63entry:64  br label %loop65 66loop:67  %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]68  call void @maythrow()69  call void @llvm.assume(i1 %cond)70  %val = load i32, ptr %ptr71  %x.inc = add i32 %x, %val72  br label %loop73}74 75; Note: resulting loop could be peeled and then hoisted, but76; by default assume is captured in phi cycle.77define void @f_3(i1 %cond, ptr %ptr) {78; CHECK-LABEL: @f_3(79; CHECK-LABEL: entry:80; CHECK: %val = load i32, ptr %ptr81; CHECK-LABEL: loop:82; CHECK: call void @llvm.assume(i1 %x.cmp)83 84entry:85  br label %loop86 87loop:88  %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]89  %x.cmp = phi i1 [%cond, %entry], [%cond.next, %loop]90  call void @llvm.assume(i1 %x.cmp)91  %val = load i32, ptr %ptr92  %cond.next = icmp eq i32 %val, 593  %x.inc = add i32 %x, %val94  br label %loop95}96 97 98declare void @maythrow()99declare void @llvm.assume(i1)100