2018-01-31 13:02:01 +00:00
|
|
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
|
|
; RUN: llc < %s -mtriple=i386-apple-darwin10.0 | FileCheck %s --check-prefix=CHECK-X86
|
|
|
|
; RUN: llc < %s -mtriple=x86_64-grtev4-linux-gnu | FileCheck %s --check-prefix=CHECK-X64
|
2009-10-09 20:35:19 +00:00
|
|
|
|
|
|
|
@g_14 = global i8 -6, align 1 ; <i8*> [#uses=1]
|
|
|
|
|
|
|
|
declare i32 @func_16(i8 signext %p_19, i32 %p_20) nounwind
|
|
|
|
|
|
|
|
define i32 @func_35(i64 %p_38) nounwind ssp {
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X86-LABEL: func_35:
|
|
|
|
; CHECK-X86: ## %bb.0: ## %entry
|
|
|
|
; CHECK-X86-NEXT: subl $12, %esp
|
|
|
|
; CHECK-X86-NEXT: movsbl _g_14, %eax
|
|
|
|
; CHECK-X86-NEXT: xorl %ecx, %ecx
|
|
|
|
; CHECK-X86-NEXT: testl $255, %eax
|
|
|
|
; CHECK-X86-NEXT: setg %cl
|
|
|
|
; CHECK-X86-NEXT: subl $8, %esp
|
|
|
|
; CHECK-X86-NEXT: pushl %ecx
|
|
|
|
; CHECK-X86-NEXT: pushl %eax
|
|
|
|
; CHECK-X86-NEXT: calll _func_16
|
|
|
|
; CHECK-X86-NEXT: addl $16, %esp
|
|
|
|
; CHECK-X86-NEXT: movl $1, %eax
|
|
|
|
; CHECK-X86-NEXT: addl $12, %esp
|
|
|
|
; CHECK-X86-NEXT: retl
|
|
|
|
;
|
|
|
|
; CHECK-X64-LABEL: func_35:
|
|
|
|
; CHECK-X64: # %bb.0: # %entry
|
|
|
|
; CHECK-X64-NEXT: pushq %rax
|
|
|
|
; CHECK-X64-NEXT: movsbl {{.*}}(%rip), %edi
|
|
|
|
; CHECK-X64-NEXT: xorl %esi, %esi
|
|
|
|
; CHECK-X64-NEXT: testl $255, %edi
|
|
|
|
; CHECK-X64-NEXT: setg %sil
|
|
|
|
; CHECK-X64-NEXT: callq func_16
|
|
|
|
; CHECK-X64-NEXT: movl $1, %eax
|
|
|
|
; CHECK-X64-NEXT: popq %rcx
|
|
|
|
; CHECK-X64-NEXT: retq
|
2009-10-09 20:35:19 +00:00
|
|
|
entry:
|
2015-02-27 21:17:42 +00:00
|
|
|
%tmp = load i8, i8* @g_14 ; <i8> [#uses=2]
|
2009-10-09 20:35:19 +00:00
|
|
|
%conv = zext i8 %tmp to i32 ; <i32> [#uses=1]
|
|
|
|
%cmp = icmp sle i32 1, %conv ; <i1> [#uses=1]
|
|
|
|
%conv2 = zext i1 %cmp to i32 ; <i32> [#uses=1]
|
|
|
|
%call = call i32 @func_16(i8 signext %tmp, i32 %conv2) ssp ; <i32> [#uses=1]
|
|
|
|
ret i32 1
|
|
|
|
}
|
2018-01-31 13:02:01 +00:00
|
|
|
|
|
|
|
define void @fail(i16 %a, <2 x i8> %b) {
|
|
|
|
; CHECK-X86-LABEL: fail:
|
|
|
|
; CHECK-X86: ## %bb.0:
|
|
|
|
; CHECK-X86-NEXT: subl $12, %esp
|
|
|
|
; CHECK-X86-NEXT: .cfi_def_cfa_offset 16
|
|
|
|
; CHECK-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
|
|
|
|
; CHECK-X86-NEXT: cmpb $123, {{[0-9]+}}(%esp)
|
|
|
|
; CHECK-X86-NEXT: sete %al
|
2018-01-31 19:20:06 +00:00
|
|
|
; CHECK-X86-NEXT: testl $263, %ecx ## imm = 0x107
|
[Codegen] Merge tail blocks with no successors after block placement
Summary:
I found the following case having tail blocks with no successors merging opportunities after block placement.
Before block placement:
bb0:
...
bne a0, 0, bb2:
bb1:
mv a0, 1
ret
bb2:
...
bb3:
mv a0, 1
ret
bb4:
mv a0, -1
ret
The conditional branch bne in bb0 is opposite to beq.
After block placement:
bb0:
...
beq a0, 0, bb1
bb2:
...
bb4:
mv a0, -1
ret
bb1:
mv a0, 1
ret
bb3:
mv a0, 1
ret
After block placement, that appears new tail merging opportunity, bb1 and bb3 can be merged as one block. So the conditional constraint for merging tail blocks with no successors should be removed. In my experiment for RISC-V, it decreases code size.
Author of original patch: Jim Lin
Reviewers: haicheng, aheejin, craig.topper, rnk, RKSimon, Jim, dmgreen
Reviewed By: Jim, dmgreen
Subscribers: xbolva00, dschuff, javed.absar, sbc100, jgravelle-google, aheejin, kito-cheng, dmgreen, PkmX, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D54411
llvm-svn: 363284
2019-06-13 18:11:32 +00:00
|
|
|
; CHECK-X86-NEXT: je LBB1_3
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X86-NEXT: ## %bb.1:
|
|
|
|
; CHECK-X86-NEXT: testb %al, %al
|
[Codegen] Merge tail blocks with no successors after block placement
Summary:
I found the following case having tail blocks with no successors merging opportunities after block placement.
Before block placement:
bb0:
...
bne a0, 0, bb2:
bb1:
mv a0, 1
ret
bb2:
...
bb3:
mv a0, 1
ret
bb4:
mv a0, -1
ret
The conditional branch bne in bb0 is opposite to beq.
After block placement:
bb0:
...
beq a0, 0, bb1
bb2:
...
bb4:
mv a0, -1
ret
bb1:
mv a0, 1
ret
bb3:
mv a0, 1
ret
After block placement, that appears new tail merging opportunity, bb1 and bb3 can be merged as one block. So the conditional constraint for merging tail blocks with no successors should be removed. In my experiment for RISC-V, it decreases code size.
Author of original patch: Jim Lin
Reviewers: haicheng, aheejin, craig.topper, rnk, RKSimon, Jim, dmgreen
Reviewed By: Jim, dmgreen
Subscribers: xbolva00, dschuff, javed.absar, sbc100, jgravelle-google, aheejin, kito-cheng, dmgreen, PkmX, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D54411
llvm-svn: 363284
2019-06-13 18:11:32 +00:00
|
|
|
; CHECK-X86-NEXT: jne LBB1_3
|
|
|
|
; CHECK-X86-NEXT: ## %bb.2: ## %no
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X86-NEXT: calll _bar
|
[Codegen] Merge tail blocks with no successors after block placement
Summary:
I found the following case having tail blocks with no successors merging opportunities after block placement.
Before block placement:
bb0:
...
bne a0, 0, bb2:
bb1:
mv a0, 1
ret
bb2:
...
bb3:
mv a0, 1
ret
bb4:
mv a0, -1
ret
The conditional branch bne in bb0 is opposite to beq.
After block placement:
bb0:
...
beq a0, 0, bb1
bb2:
...
bb4:
mv a0, -1
ret
bb1:
mv a0, 1
ret
bb3:
mv a0, 1
ret
After block placement, that appears new tail merging opportunity, bb1 and bb3 can be merged as one block. So the conditional constraint for merging tail blocks with no successors should be removed. In my experiment for RISC-V, it decreases code size.
Author of original patch: Jim Lin
Reviewers: haicheng, aheejin, craig.topper, rnk, RKSimon, Jim, dmgreen
Reviewed By: Jim, dmgreen
Subscribers: xbolva00, dschuff, javed.absar, sbc100, jgravelle-google, aheejin, kito-cheng, dmgreen, PkmX, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D54411
llvm-svn: 363284
2019-06-13 18:11:32 +00:00
|
|
|
; CHECK-X86-NEXT: LBB1_3: ## %yes
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X86-NEXT: addl $12, %esp
|
|
|
|
; CHECK-X86-NEXT: retl
|
|
|
|
;
|
|
|
|
; CHECK-X64-LABEL: fail:
|
|
|
|
; CHECK-X64: # %bb.0:
|
|
|
|
; CHECK-X64-NEXT: pushq %rax
|
|
|
|
; CHECK-X64-NEXT: .cfi_def_cfa_offset 16
|
2018-12-16 18:35:55 +00:00
|
|
|
; CHECK-X64-NEXT: testl $263, %edi # imm = 0x107
|
[Codegen] Merge tail blocks with no successors after block placement
Summary:
I found the following case having tail blocks with no successors merging opportunities after block placement.
Before block placement:
bb0:
...
bne a0, 0, bb2:
bb1:
mv a0, 1
ret
bb2:
...
bb3:
mv a0, 1
ret
bb4:
mv a0, -1
ret
The conditional branch bne in bb0 is opposite to beq.
After block placement:
bb0:
...
beq a0, 0, bb1
bb2:
...
bb4:
mv a0, -1
ret
bb1:
mv a0, 1
ret
bb3:
mv a0, 1
ret
After block placement, that appears new tail merging opportunity, bb1 and bb3 can be merged as one block. So the conditional constraint for merging tail blocks with no successors should be removed. In my experiment for RISC-V, it decreases code size.
Author of original patch: Jim Lin
Reviewers: haicheng, aheejin, craig.topper, rnk, RKSimon, Jim, dmgreen
Reviewed By: Jim, dmgreen
Subscribers: xbolva00, dschuff, javed.absar, sbc100, jgravelle-google, aheejin, kito-cheng, dmgreen, PkmX, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D54411
llvm-svn: 363284
2019-06-13 18:11:32 +00:00
|
|
|
; CHECK-X64-NEXT: je .LBB1_3
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X64-NEXT: # %bb.1:
|
2019-08-07 16:24:26 +00:00
|
|
|
; CHECK-X64-NEXT: pcmpeqb {{.*}}(%rip), %xmm0
|
|
|
|
; CHECK-X64-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
|
|
|
|
; CHECK-X64-NEXT: pextrw $1, %xmm0, %eax
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X64-NEXT: testb $1, %al
|
[Codegen] Merge tail blocks with no successors after block placement
Summary:
I found the following case having tail blocks with no successors merging opportunities after block placement.
Before block placement:
bb0:
...
bne a0, 0, bb2:
bb1:
mv a0, 1
ret
bb2:
...
bb3:
mv a0, 1
ret
bb4:
mv a0, -1
ret
The conditional branch bne in bb0 is opposite to beq.
After block placement:
bb0:
...
beq a0, 0, bb1
bb2:
...
bb4:
mv a0, -1
ret
bb1:
mv a0, 1
ret
bb3:
mv a0, 1
ret
After block placement, that appears new tail merging opportunity, bb1 and bb3 can be merged as one block. So the conditional constraint for merging tail blocks with no successors should be removed. In my experiment for RISC-V, it decreases code size.
Author of original patch: Jim Lin
Reviewers: haicheng, aheejin, craig.topper, rnk, RKSimon, Jim, dmgreen
Reviewed By: Jim, dmgreen
Subscribers: xbolva00, dschuff, javed.absar, sbc100, jgravelle-google, aheejin, kito-cheng, dmgreen, PkmX, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D54411
llvm-svn: 363284
2019-06-13 18:11:32 +00:00
|
|
|
; CHECK-X64-NEXT: jne .LBB1_3
|
|
|
|
; CHECK-X64-NEXT: # %bb.2: # %no
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X64-NEXT: callq bar
|
[Codegen] Merge tail blocks with no successors after block placement
Summary:
I found the following case having tail blocks with no successors merging opportunities after block placement.
Before block placement:
bb0:
...
bne a0, 0, bb2:
bb1:
mv a0, 1
ret
bb2:
...
bb3:
mv a0, 1
ret
bb4:
mv a0, -1
ret
The conditional branch bne in bb0 is opposite to beq.
After block placement:
bb0:
...
beq a0, 0, bb1
bb2:
...
bb4:
mv a0, -1
ret
bb1:
mv a0, 1
ret
bb3:
mv a0, 1
ret
After block placement, that appears new tail merging opportunity, bb1 and bb3 can be merged as one block. So the conditional constraint for merging tail blocks with no successors should be removed. In my experiment for RISC-V, it decreases code size.
Author of original patch: Jim Lin
Reviewers: haicheng, aheejin, craig.topper, rnk, RKSimon, Jim, dmgreen
Reviewed By: Jim, dmgreen
Subscribers: xbolva00, dschuff, javed.absar, sbc100, jgravelle-google, aheejin, kito-cheng, dmgreen, PkmX, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D54411
llvm-svn: 363284
2019-06-13 18:11:32 +00:00
|
|
|
; CHECK-X64-NEXT: .LBB1_3: # %yes
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X64-NEXT: popq %rax
|
2018-04-24 10:32:08 +00:00
|
|
|
; CHECK-X64-NEXT: .cfi_def_cfa_offset 8
|
2018-01-31 13:02:01 +00:00
|
|
|
; CHECK-X64-NEXT: retq
|
|
|
|
%1 = icmp eq <2 x i8> %b, <i8 40, i8 123>
|
|
|
|
%2 = extractelement <2 x i1> %1, i32 1
|
|
|
|
%3 = and i16 %a, 263
|
|
|
|
%4 = icmp eq i16 %3, 0
|
|
|
|
%merge = or i1 %4, %2
|
|
|
|
br i1 %merge, label %yes, label %no
|
|
|
|
|
|
|
|
yes: ; preds = %0
|
|
|
|
ret void
|
|
|
|
|
|
|
|
no: ; preds = %0
|
|
|
|
call void @bar()
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
declare void @bar()
|