X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=test%2FAnalysis%2FBranchProbabilityInfo%2Fbasic.ll;h=05cb31dca0ee9bbf08b4dcd2c9ecfa93f2056c35;hb=5be77762a3aa434ee877b0a03b98b5c3a7571918;hp=08adfa8a36fb069653715a297a6eb01d11384b94;hpb=1a710fdde197b00107ef55df51054925b9a5d2a2;p=oota-llvm.git diff --git a/test/Analysis/BranchProbabilityInfo/basic.ll b/test/Analysis/BranchProbabilityInfo/basic.ll index 08adfa8a36f..05cb31dca0e 100644 --- a/test/Analysis/BranchProbabilityInfo/basic.ll +++ b/test/Analysis/BranchProbabilityInfo/basic.ll @@ -115,3 +115,100 @@ return: } !2 = metadata !{metadata !"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64} + +declare void @coldfunc() cold + +define i32 @test5(i32 %a, i32 %b, i1 %flag) { +; CHECK: Printing analysis {{.*}} for function 'test5' +entry: + br i1 %flag, label %then, label %else +; CHECK: edge entry -> then probability is 4 / 68 +; CHECK: edge entry -> else probability is 64 / 68 + +then: + call void @coldfunc() + br label %exit +; CHECK: edge then -> exit probability is 16 / 16 = 100% + +else: + br label %exit +; CHECK: edge else -> exit probability is 16 / 16 = 100% + +exit: + %result = phi i32 [ %a, %then ], [ %b, %else ] + ret i32 %result +} + +declare i32 @regular_function(i32 %i) + +define i32 @test_cold_call_sites(i32* %a) { +; Test that edges to blocks post-dominated by cold call sites +; are marked as not expected to be taken. +; TODO(dnovillo) The calls to regular_function should not be merged, but +; they are currently being merged. Convert this into a code generation test +; after that is fixed. + +; CHECK: Printing analysis {{.*}} for function 'test_cold_call_sites' +; CHECK: edge entry -> then probability is 4 / 68 = 5.88235% +; CHECK: edge entry -> else probability is 64 / 68 = 94.1176% [HOT edge] + +entry: + %gep1 = getelementptr i32* %a, i32 1 + %val1 = load i32* %gep1 + %cond1 = icmp ugt i32 %val1, 1 + br i1 %cond1, label %then, label %else + +then: + ; This function is not declared cold, but this call site is. + %val4 = call i32 @regular_function(i32 %val1) cold + br label %exit + +else: + %gep2 = getelementptr i32* %a, i32 2 + %val2 = load i32* %gep2 + %val3 = call i32 @regular_function(i32 %val2) + br label %exit + +exit: + %ret = phi i32 [ %val4, %then ], [ %val3, %else ] + ret i32 %ret +} + +define i32 @zero1(i32 %i, i32 %a, i32 %b) { +; CHECK: Printing analysis {{.*}} for function 'zero1' +entry: + %cond = icmp eq i32 %i, 0 + br i1 %cond, label %then, label %else +; CHECK: edge entry -> then probability is 12 / 32 +; CHECK: edge entry -> else probability is 20 / 32 + +then: + br label %exit + +else: + br label %exit + +exit: + %result = phi i32 [ %a, %then ], [ %b, %else ] + ret i32 %result +} + +define i32 @zero2(i32 %i, i32 %a, i32 %b) { +; CHECK: Printing analysis {{.*}} for function 'zero2' +entry: + %cond = icmp ne i32 %i, -1 + br i1 %cond, label %then, label %else +; CHECK: edge entry -> then probability is 20 / 32 +; CHECK: edge entry -> else probability is 12 / 32 + +then: + br label %exit + +else: + br label %exit + +exit: + %result = phi i32 [ %a, %then ], [ %b, %else ] + ret i32 %result +} +