2018-11-17 03:35:00 +08:00
|
|
|
; RUN: llc -x86-condbr-folding=true -mtriple=x86_64-linux-gnu -mcpu=sandybridge %s -o - -verify-machineinstrs | FileCheck %s --check-prefix=MERGE
|
|
|
|
; RUN: llc -x86-condbr-folding=true -mtriple=x86_64-linux-gnu -mcpu=ivybridge %s -o - -verify-machineinstrs | FileCheck %s --check-prefix=MERGE
|
|
|
|
; RUN: llc -x86-condbr-folding=true -mtriple=x86_64-linux-gnu -mcpu=haswell %s -o - -verify-machineinstrs | FileCheck %s --check-prefix=MERGE
|
|
|
|
; RUN: llc -x86-condbr-folding=true -mtriple=x86_64-linux-gnu -mcpu=broadwell %s -o - -verify-machineinstrs | FileCheck %s --check-prefix=MERGE
|
|
|
|
; RUN: llc -x86-condbr-folding=true -mtriple=x86_64-linux-gnu -mcpu=skylake %s -o - -verify-machineinstrs | FileCheck %s --check-prefix=MERGE
|
|
|
|
; RUN: llc -x86-condbr-folding=true -mtriple=x86_64-linux-gnu -mcpu=skx %s -o - -verify-machineinstrs | FileCheck %s --check-prefix=MERGE
|
|
|
|
; RUN: llc -x86-condbr-folding=true -mtriple=x86_64-linux-gnu %s -o - -verify-machineinstrs | FileCheck %s --check-prefix=NOTMERGE
|
2018-10-10 06:03:40 +08:00
|
|
|
|
|
|
|
define i32 @length2_1(i32) {
|
|
|
|
%2 = icmp slt i32 %0, 3
|
|
|
|
br i1 %2, label %3, label %5
|
|
|
|
|
|
|
|
; <label>:3:
|
|
|
|
%4 = tail call i32 (...) @f1()
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:5:
|
|
|
|
%6 = icmp slt i32 %0, 40
|
|
|
|
br i1 %6, label %7, label %13
|
|
|
|
|
|
|
|
; <label>:7:
|
|
|
|
%8 = icmp eq i32 %0, 3
|
|
|
|
br i1 %8, label %9, label %11
|
|
|
|
|
|
|
|
; <label>:9:
|
|
|
|
%10 = tail call i32 (...) @f2()
|
|
|
|
br label %11
|
|
|
|
|
|
|
|
; <label>:11:
|
|
|
|
%12 = tail call i32 (...) @f3() #2
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:13:
|
|
|
|
ret i32 0
|
|
|
|
}
|
|
|
|
; MERGE-LABEL: length2_1
|
|
|
|
; MERGE: cmpl $3
|
|
|
|
; MERGE-NEXT: jg
|
|
|
|
; MERGE-NEXT: jge
|
|
|
|
; NOTMERGE-LABEL: length2_1
|
|
|
|
; NOTMERGE: cmpl $2
|
|
|
|
; NOTMERGE-NEXT: jg
|
|
|
|
|
|
|
|
define i32 @length2_2(i32) {
|
|
|
|
%2 = icmp sle i32 %0, 2
|
|
|
|
br i1 %2, label %3, label %5
|
|
|
|
|
|
|
|
; <label>:3:
|
|
|
|
%4 = tail call i32 (...) @f1()
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:5:
|
|
|
|
%6 = icmp slt i32 %0, 40
|
|
|
|
br i1 %6, label %7, label %13
|
|
|
|
|
|
|
|
; <label>:7:
|
|
|
|
%8 = icmp eq i32 %0, 3
|
|
|
|
br i1 %8, label %9, label %11
|
|
|
|
|
|
|
|
; <label>:9:
|
|
|
|
%10 = tail call i32 (...) @f2()
|
|
|
|
br label %11
|
|
|
|
|
|
|
|
; <label>:11:
|
|
|
|
%12 = tail call i32 (...) @f3() #2
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:13:
|
|
|
|
ret i32 0
|
|
|
|
}
|
|
|
|
; MERGE-LABEL: length2_2
|
|
|
|
; MERGE: cmpl $3
|
|
|
|
; MERGE-NEXT: jg
|
|
|
|
; MERGE-NEXT: jge
|
|
|
|
; NOTMERGE-LABEL: length2_2
|
|
|
|
; NOTMERGE: cmpl $2
|
|
|
|
; NOTMERGE-NEXT: jg
|
|
|
|
|
|
|
|
define i32 @length2_3(i32) {
|
|
|
|
%2 = icmp sgt i32 %0, 3
|
|
|
|
br i1 %2, label %3, label %5
|
|
|
|
|
|
|
|
; <label>:3:
|
|
|
|
%4 = tail call i32 (...) @f1()
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:5:
|
|
|
|
%6 = icmp sgt i32 %0, -40
|
|
|
|
br i1 %6, label %7, label %13
|
|
|
|
|
|
|
|
; <label>:7:
|
|
|
|
%8 = icmp eq i32 %0, 3
|
|
|
|
br i1 %8, label %9, label %11
|
|
|
|
|
|
|
|
; <label>:9:
|
|
|
|
%10 = tail call i32 (...) @f2()
|
|
|
|
br label %11
|
|
|
|
|
|
|
|
; <label>:11:
|
|
|
|
%12 = tail call i32 (...) @f3() #2
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:13:
|
|
|
|
ret i32 0
|
|
|
|
}
|
|
|
|
; MERGE-LABEL: length2_3
|
|
|
|
; MERGE: cmpl $3
|
|
|
|
; MERGE-NEXT: jl
|
|
|
|
; MERGE-NEXT: jle
|
|
|
|
; NOTMERGE-LABEL: length2_3
|
|
|
|
; NOTMERGE: cmpl $4
|
|
|
|
; NOTMERGE-NEXT: jl
|
|
|
|
|
|
|
|
define i32 @length2_4(i32) {
|
|
|
|
%2 = icmp sge i32 %0, 4
|
|
|
|
br i1 %2, label %3, label %5
|
|
|
|
|
|
|
|
; <label>:3:
|
|
|
|
%4 = tail call i32 (...) @f1()
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:5:
|
|
|
|
%6 = icmp sgt i32 %0, -40
|
|
|
|
br i1 %6, label %7, label %13
|
|
|
|
|
|
|
|
; <label>:7:
|
|
|
|
%8 = icmp eq i32 %0, 3
|
|
|
|
br i1 %8, label %9, label %11
|
|
|
|
|
|
|
|
; <label>:9:
|
|
|
|
%10 = tail call i32 (...) @f2()
|
|
|
|
br label %11
|
|
|
|
|
|
|
|
; <label>:11:
|
|
|
|
%12 = tail call i32 (...) @f3() #2
|
|
|
|
br label %13
|
|
|
|
|
|
|
|
; <label>:13:
|
|
|
|
ret i32 0
|
|
|
|
}
|
|
|
|
; MERGE-LABEL: length2_4
|
|
|
|
; MERGE: cmpl $3
|
|
|
|
; MERGE-NEXT: jl
|
|
|
|
; MERGE-NEXT: jle
|
|
|
|
; NOTMERGE-LABEL: length2_4
|
|
|
|
; NOTMERGE: cmpl $4
|
|
|
|
; NOTMERGE-NEXT: jl
|
|
|
|
|
|
|
|
declare i32 @f1(...)
|
|
|
|
declare i32 @f2(...)
|
|
|
|
declare i32 @f3(...)
|
|
|
|
|
|
|
|
define i32 @length1_1(i32) {
|
|
|
|
%2 = icmp sgt i32 %0, 5
|
|
|
|
br i1 %2, label %3, label %5
|
|
|
|
|
|
|
|
; <label>:3:
|
|
|
|
%4 = tail call i32 (...) @f1()
|
|
|
|
br label %9
|
|
|
|
|
|
|
|
; <label>:5:
|
|
|
|
%6 = icmp eq i32 %0, 5
|
|
|
|
br i1 %6, label %7, label %9
|
|
|
|
|
|
|
|
; <label>:7:
|
|
|
|
%8 = tail call i32 (...) @f2()
|
|
|
|
br label %9
|
|
|
|
|
|
|
|
; <label>:9:
|
|
|
|
ret i32 0
|
|
|
|
}
|
|
|
|
; MERGE-LABEL: length1_1
|
|
|
|
; MERGE: cmpl $5
|
|
|
|
; MERGE-NEXT: jl
|
|
|
|
; MERGE-NEXT: jle
|
|
|
|
; NOTMERGE-LABEL: length1_1
|
|
|
|
; NOTMERGE: cmpl $6
|
|
|
|
; NOTMERGE-NEXT: jl
|