brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · b5c8792 Raw
105 lines · plain
1; This test tries to ensure that the inliner successfully invalidates function2; analyses after inlining into the function body.3;4; The strategy for these tests is to compute domtree over all the functions,5; then run the inliner, and then verify the domtree. Then we can arrange the6; inline to disturb the domtree (easy) and detect any stale cached entries in7; the verifier. We do the initial computation both *inside* the CGSCC walk and8; in a pre-step to make sure both work.9;10; RUN: opt < %s -passes='function(require<domtree>),cgscc(inline,function(verify<domtree>))' -S | FileCheck %s11; RUN: opt < %s -passes='cgscc(function(require<domtree>),inline,function(verify<domtree>))' -S | FileCheck %s12 13; An external function used to control branches.14declare i1 @flag()15; CHECK-LABEL: declare i1 @flag()16 17; The utility function with interesting control flow that gets inlined below to18; perturb the dominator tree.19define internal void @callee() {20; CHECK-LABEL: @callee21entry:22  %ptr = alloca i823  %flag = call i1 @flag()24  br i1 %flag, label %then, label %else25 26then:27  store volatile i8 42, ptr %ptr28  br label %return29 30else:31  store volatile i8 -42, ptr %ptr32  br label %return33 34return:35  ret void36}37 38 39; The 'test1_' prefixed functions test the basic scenario of inlining40; destroying dominator tree.41 42define void @test1_caller() {43; CHECK-LABEL: define void @test1_caller()44entry:45  call void @callee()46; CHECK-NOT: @callee47  ret void48; CHECK: ret void49}50 51 52; The 'test2_' prefixed functions test the scenario of not inlining preserving53; dominators.54 55define void @test2_caller() {56; CHECK-LABEL: define void @test2_caller()57entry:58  call void @callee() noinline59; CHECK: call void @callee60  ret void61; CHECK: ret void62}63 64 65; The 'test3_' prefixed functions test the scenario of not inlining preserving66; dominators after splitting an SCC into two smaller SCCs.67 68; This function gets visited first and we end up inlining everything we69; can into this routine. That splits test3_g into a separate SCC that is enqued70; for later processing.71define void @test3_f() {72; CHECK-LABEL: define void @test3_f()73entry:74  ; Create the first edge in the SCC cycle.75  call void @test3_g()76; CHECK-NOT: @test3_g()77; CHECK: call void @test3_f()78 79  ; Pull interesting CFG into this function.80  call void @callee()81; CHECK-NOT: call void @callee()82 83  ret void84; CHECK: ret void85}86 87; This function ends up split into a separate SCC, which can cause its analyses88; to become stale if the splitting doesn't properly invalidate things. Also, as89; a consequence of being split out, test3_f is too large to inline by the time90; we get here.91define void @test3_g() {92; CHECK-LABEL: define void @test3_g()93entry:94  ; Create the second edge in the SCC cycle.95  call void @test3_f()96; CHECK: call void @test3_f()97 98  ; Pull interesting CFG into this function.99  call void @callee()100; CHECK-NOT: call void @callee()101 102  ret void103; CHECK: ret void104}105