1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=hexagon -ifcvt-limit=0 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Check if the branch probabilities are reflected in the instructions: 4*9880d681SAndroid Build Coastguard Worker; The basic block placement pass should place the more probable successor 5*9880d681SAndroid Build Coastguard Worker; block as the fall-through block. The unconditional jump in the predecessor 6*9880d681SAndroid Build Coastguard Worker; should then get the right hint (not_taken or ":nt") 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker@j = external global i32 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i32 %a) nounwind { 12*9880d681SAndroid Build Coastguard Worker; CHECK: if{{ *}}(!p{{[0-3]}}.new) jump:nt 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %a, 0 15*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %if.then, !prof !0 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 18*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %a, 10 19*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @foobar to i32 (i32)*)(i32 %add) nounwind 20*9880d681SAndroid Build Coastguard Worker br label %return 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 23*9880d681SAndroid Build Coastguard Worker %call2 = tail call i32 bitcast (i32 (...)* @foobar to i32 (i32)*)(i32 4) nounwind 24*9880d681SAndroid Build Coastguard Worker br label %return 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.else, %if.then 27*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 28*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdeclare i32 @foobar(...) 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(i32 %a) nounwind { 34*9880d681SAndroid Build Coastguard Worker; CHECK: if{{ *}}(p{{[0-3]}}.new) jump:nt 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %a, 0 37*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %if.then, !prof !1 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 40*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %a, 10 41*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @foobar to i32 (i32)*)(i32 %add) nounwind 42*9880d681SAndroid Build Coastguard Worker br label %return 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 45*9880d681SAndroid Build Coastguard Worker %call2 = tail call i32 bitcast (i32 (...)* @foobar to i32 (i32)*)(i32 4) nounwind 46*9880d681SAndroid Build Coastguard Worker br label %return 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.else, %if.then 49*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 50*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @foo_bar(i32 %a, i16 signext %b) nounwind { 54*9880d681SAndroid Build Coastguard Worker; CHECK: if{{ *}}(!cmp.eq(r{{[0-9]*}}.new, #0)) jump:nt 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @j, align 4 57*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %0, 0 58*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %if.then, !prof !0 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 61*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %a, 10 62*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @foobar to i32 (i32)*)(i32 %add) nounwind 63*9880d681SAndroid Build Coastguard Worker br label %return 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 66*9880d681SAndroid Build Coastguard Worker %add1 = add nsw i32 %a, 4 67*9880d681SAndroid Build Coastguard Worker %call2 = tail call i32 bitcast (i32 (...)* @foobar to i32 (i32)*)(i32 %add1) nounwind 68*9880d681SAndroid Build Coastguard Worker br label %return 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.else, %if.then 71*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 72*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 64, i32 4} 76*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 64} 77