forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			324 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			324 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 | |
| ; RUN: opt -S -codegenprepare < %s | FileCheck %s
 | |
| 
 | |
| target triple = "x86_64-unknown-linux-gnu"
 | |
| 
 | |
| define void @f1(i32 %a) {
 | |
| ; CHECK-LABEL: @f1(
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[A:%.*]]
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[FR]], 0
 | |
| ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %c = icmp eq i32 %a, 0
 | |
|   %fr = freeze i1 %c
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f2(i32 %a) {
 | |
| ; CHECK-LABEL: @f2(
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[A:%.*]]
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 0, [[FR]]
 | |
| ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %c = icmp eq i32 0, %a
 | |
|   %fr = freeze i1 %c
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f3(i32 %a) {
 | |
| ; CHECK-LABEL: @f3(
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 0, 1
 | |
| ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %c = icmp eq i32 0, 1
 | |
|   %fr = freeze i1 %c
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define i1 @ptrcmp(i8* %p) {
 | |
| ; CHECK-LABEL: @ptrcmp(
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i8* [[P:%.*]]
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp eq i8* [[FR]], null
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %c = icmp eq i8* %p, null
 | |
|   %fr = freeze i1 %c
 | |
|   ret i1 %fr
 | |
| }
 | |
| 
 | |
| 
 | |
| define i1 @fcmp(float %a) {
 | |
| ; CHECK-LABEL: @fcmp(
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze float [[A:%.*]]
 | |
| ; CHECK-NEXT:    [[C:%.*]] = fcmp oeq float [[FR]], 0.000000e+00
 | |
| ; CHECK-NEXT:    ret i1 [[C]]
 | |
| ;
 | |
|   %c = fcmp oeq float %a, 0.0
 | |
|   %fr = freeze i1 %c
 | |
|   ret i1 %fr
 | |
| }
 | |
| 
 | |
| define i1 @fcmp_nan(float %a) {
 | |
| ; CHECK-LABEL: @fcmp_nan(
 | |
| ; CHECK-NEXT:    [[C:%.*]] = fcmp nnan oeq float [[A:%.*]], 0.000000e+00
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[C]]
 | |
| ; CHECK-NEXT:    ret i1 [[FR]]
 | |
| ;
 | |
|   %c = fcmp nnan oeq float %a, 0.0
 | |
|   %fr = freeze i1 %c
 | |
|   ret i1 %fr
 | |
| }
 | |
| 
 | |
| define void @and_bitmask(i32 %flag) {
 | |
| ; CHECK-LABEL: @and_bitmask(
 | |
| ; CHECK-NEXT:    [[V:%.*]] = and i32 [[FLAG:%.*]], 1
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[V]]
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[FR]], 0
 | |
| ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %v = and i32 %flag, 1
 | |
|   %c = icmp eq i32 %v, 0
 | |
|   %fr = freeze i1 %c
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @and_bitmask_r(i32 %flag) {
 | |
| ; CHECK-LABEL: @and_bitmask_r(
 | |
| ; CHECK-NEXT:    [[V:%.*]] = and i32 1, [[FLAG:%.*]]
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[V]]
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 0, [[FR]]
 | |
| ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %v = and i32 1, %flag
 | |
|   %c = icmp eq i32 0, %v
 | |
|   %fr = freeze i1 %c
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @and_bitmask2(i32 %flag, i32 %flag2) {
 | |
| ; CHECK-LABEL: @and_bitmask2(
 | |
| ; CHECK-NEXT:    [[V:%.*]] = and i32 [[FLAG:%.*]], 1
 | |
| ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[V]], 0
 | |
| ; CHECK-NEXT:    [[V2:%.*]] = and i32 [[FLAG2:%.*]], 2
 | |
| ; CHECK-NEXT:    [[C2:%.*]] = icmp eq i32 [[V2]], 0
 | |
| ; CHECK-NEXT:    [[COND:%.*]] = or i1 [[C]], [[C2]]
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND]]
 | |
| ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %v = and i32 %flag, 1
 | |
|   %c = icmp eq i32 %v, 0
 | |
|   %v2 = and i32 %flag2, 2
 | |
|   %c2 = icmp eq i32 %v2, 0
 | |
|   %cond = or i1 %c, %c2
 | |
|   %fr = freeze i1 %cond
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @and(i1 %a, i1 %b, i1 %c) {
 | |
| ; CHECK-LABEL: @and(
 | |
| ; CHECK-NEXT:    [[COND:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
 | |
| ; CHECK-NEXT:    [[COND2:%.*]] = and i1 [[C:%.*]], [[COND]]
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND2]]
 | |
| ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %cond = and i1 %a, %b
 | |
|   %cond2 = and i1 %c, %cond
 | |
|   %fr = freeze i1 %cond2
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @and_long(i1 %a, i1 %b, i1 %c, i1 %d, i1 %e, i1 %f, i1 %g) {
 | |
| ; CHECK-LABEL: @and_long(
 | |
| ; CHECK-NEXT:    [[COND:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
 | |
| ; CHECK-NEXT:    [[COND2:%.*]] = and i1 [[C:%.*]], [[COND]]
 | |
| ; CHECK-NEXT:    [[COND3:%.*]] = and i1 [[D:%.*]], [[COND2]]
 | |
| ; CHECK-NEXT:    [[COND4:%.*]] = and i1 [[E:%.*]], [[COND3]]
 | |
| ; CHECK-NEXT:    [[COND5:%.*]] = and i1 [[F:%.*]], [[COND4]]
 | |
| ; CHECK-NEXT:    [[COND6:%.*]] = and i1 [[G:%.*]], [[COND5]]
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND6]]
 | |
| ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %cond = and i1 %a, %b
 | |
|   %cond2 = and i1 %c, %cond
 | |
|   %cond3 = and i1 %d, %cond2
 | |
|   %cond4 = and i1 %e, %cond3
 | |
|   %cond5 = and i1 %f, %cond4
 | |
|   %cond6 = and i1 %g, %cond5
 | |
|   %fr = freeze i1 %cond6
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @and_cmp(i32 %v, float %w, i32 %v2) {
 | |
| ; CHECK-LABEL: @and_cmp(
 | |
| ; CHECK-NEXT:    [[C1:%.*]] = icmp eq i32 [[V:%.*]], 0
 | |
| ; CHECK-NEXT:    [[C2:%.*]] = fcmp oeq float [[W:%.*]], 0.000000e+00
 | |
| ; CHECK-NEXT:    [[COND:%.*]] = and i1 [[C1]], [[C2]]
 | |
| ; CHECK-NEXT:    [[C3:%.*]] = icmp eq i32 [[V2:%.*]], 1
 | |
| ; CHECK-NEXT:    [[COND2:%.*]] = and i1 [[COND]], [[C3]]
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND2]]
 | |
| ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %c1 = icmp eq i32 %v, 0
 | |
|   %c2 = fcmp oeq float %w, 0.0
 | |
|   %cond = and i1 %c1, %c2
 | |
|   %c3 = icmp eq i32 %v2, 1
 | |
|   %cond2 = and i1 %cond, %c3
 | |
|   %fr = freeze i1 %cond2
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @or(i1 %a, i1 %b, i1 %c) {
 | |
| ; CHECK-LABEL: @or(
 | |
| ; CHECK-NEXT:    [[COND:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
 | |
| ; CHECK-NEXT:    [[COND2:%.*]] = or i1 [[C:%.*]], [[COND]]
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND2]]
 | |
| ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    call void @g1()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    call void @g2()
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   %cond = or i1 %a, %b
 | |
|   %cond2 = or i1 %c, %cond
 | |
|   %fr = freeze i1 %cond2
 | |
|   br i1 %fr, label %A, label %B
 | |
| A:
 | |
|   call void @g1()
 | |
|   ret void
 | |
| B:
 | |
|   call void @g2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @and_loop(i1 %a, i1 %b) {
 | |
| ; CHECK-LABEL: @and_loop(
 | |
| ; CHECK-NEXT:    ret void
 | |
| ; CHECK:       UNREACHABLE:
 | |
| ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A:%.*]], [[C]]
 | |
| ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[C]]
 | |
| ; CHECK-NEXT:    br i1 [[FR]], label [[UNREACHABLE:%.*]], label [[EXIT:%.*]]
 | |
| ; CHECK:       EXIT:
 | |
| ; CHECK-NEXT:    ret void
 | |
| ;
 | |
|   ret void
 | |
| UNREACHABLE:
 | |
|   %c = and i1 %a, %c
 | |
|   %fr = freeze i1 %c
 | |
|   br i1 %fr, label %UNREACHABLE, label %EXIT
 | |
| EXIT:
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| declare void @g1()
 | |
| declare void @g2()
 |