================ @@ -0,0 +1,95 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-linux -branch-hint -branch-hint-probability-threshold=60 -show-mc-encoding | FileCheck %s + +; Design: Insert "ds # encoding: [0x3e]" for condition branches who has high probability to take. +; Source code: +; int XX = 0; +; int bar(int x); +; void foo(int a, int b, char* c) { +; if (a == 0) { +; XX += 1; +; } else { +; if (c == 0) +; XX += 2; +; } +; for(int i=0; i<b; i++) +; bar(XX); +; } + +@XX = dso_local local_unnamed_addr global i32 0, align 4 + +; Function Attrs: nounwind +define dso_local void @foo(i32 noundef %a, i32 noundef %b, i8* noundef readnone %c) local_unnamed_addr #0 { +; CHECK-LABEL: foo: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: pushq %rbx # encoding: [0x53] +; CHECK-NEXT: movl %esi, %ebx # encoding: [0x89,0xf3] +; CHECK-NEXT: testl %edi, %edi # encoding: [0x85,0xff] +; CHECK-NEXT: je .LBB0_1 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB0_1-1, kind: FK_PCRel_1 +; CHECK-NEXT: # %bb.2: # %if.else +; CHECK-NEXT: testq %rdx, %rdx # encoding: [0x48,0x85,0xd2] +; CHECK-NEXT: ds # encoding: [0x3e] +; CHECK-NEXT: jne .LBB0_5 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB0_5-1, kind: FK_PCRel_1 +; CHECK-NEXT: # %bb.3: +; CHECK-NEXT: movl $2, %eax # encoding: [0xb8,0x02,0x00,0x00,0x00] +; CHECK-NEXT: jmp .LBB0_4 # encoding: [0xeb,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB0_4-1, kind: FK_PCRel_1 +; CHECK-NEXT: .LBB0_1: +; CHECK-NEXT: movl $1, %eax # encoding: [0xb8,0x01,0x00,0x00,0x00] +; CHECK-NEXT: .LBB0_4: # %if.end4.sink.split +; CHECK-NEXT: addl %eax, XX(%rip) # encoding: [0x01,0x05,A,A,A,A] +; CHECK-NEXT: # fixup A - offset: 2, value: XX-4, kind: reloc_riprel_4byte +; CHECK-NEXT: .LBB0_5: # %if.end4 +; CHECK-NEXT: testl %ebx, %ebx # encoding: [0x85,0xdb] +; CHECK-NEXT: jle .LBB0_7 # encoding: [0x7e,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB0_7-1, kind: FK_PCRel_1 +; CHECK-NEXT: .p2align 4, 0x90 +; CHECK-NEXT: .LBB0_6: # %for.body +; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: movl XX(%rip), %edi # encoding: [0x8b,0x3d,A,A,A,A] +; CHECK-NEXT: # fixup A - offset: 2, value: XX-4, kind: reloc_riprel_4byte_relax +; CHECK-NEXT: callq bar # encoding: [0xe8,A,A,A,A] +; CHECK-NEXT: # fixup A - offset: 1, value: bar-4, kind: reloc_branch_4byte_pcrel +; CHECK-NEXT: decl %ebx # encoding: [0xff,0xcb] +; CHECK-NEXT: ds # encoding: [0x3e] +; CHECK-NEXT: jne .LBB0_6 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB0_6-1, kind: FK_PCRel_1 +; CHECK-NEXT: .LBB0_7: # %for.cond.cleanup +; CHECK-NEXT: popq %rbx # encoding: [0x5b] +; CHECK-NEXT: retq # encoding: [0xc3] +entry: + %cmp = icmp eq i32 %a, 0 + br i1 %cmp, label %if.end4.sink.split, label %if.else + +if.else: ; preds = %entry + %cmp1 = icmp eq i8* %c, null + br i1 %cmp1, label %if.end4.sink.split, label %if.end4 + +if.end4.sink.split: ; preds = %if.else, %entry + %.sink10 = phi i32 [ 1, %entry ], [ 2, %if.else ] + %0 = load i32, i32* @XX, align 4 + %add3 = add nsw i32 %0, %.sink10 + store i32 %add3, i32* @XX, align 4 + br label %if.end4 + +if.end4: ; preds = %if.end4.sink.split, %if.else + %cmp58 = icmp sgt i32 %b, 0 + br i1 %cmp58, label %for.body, label %for.cond.cleanup + +for.cond.cleanup: ; preds = %for.body, %if.end4 + ret void + +for.body: ; preds = %if.end4, %for.body + %i.09 = phi i32 [ %inc, %for.body ], [ 0, %if.end4 ] + %1 = load i32, i32* @XX, align 4 + %call = tail call i32 @bar(i32 noundef %1) #0 + %inc = add nuw nsw i32 %i.09, 1 + %exitcond.not = icmp eq i32 %inc, %b + br i1 %exitcond.not, label %for.cond.cleanup, label %for.body +} + +declare dso_local i32 @bar(i32 noundef) local_unnamed_addr #0 ---------------- KanRobert wrote:
drop `dso_local` `local_unnamed_addr #0` https://github.com/llvm/llvm-project/pull/97721 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits