222 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; RUN: opt < %s -disable-output -instcombine -verify-dom-info
 | |
| ; RUN: opt < %s -passes='print<postdomtree>' 2>&1 | FileCheck --check-prefixes=CHECK-POSTDOM %s
 | |
| 
 | |
| ; Demonstrate that Predicate Canonicalization (InstCombine) does not invalidate PostDomTree
 | |
| ; if the basic block is post-dom unreachable.
 | |
| 
 | |
| define void @test1(i24 %a, i24 %b) {
 | |
| entry:
 | |
|   br label %LOOP
 | |
| 
 | |
| LOOP:
 | |
|   %f = icmp uge i24 %a, %b
 | |
|   br i1 %f, label %B1, label %B2
 | |
| 
 | |
| B1:
 | |
|   %x = add i24 %a, %b
 | |
|   br label %B2
 | |
| 
 | |
| B2:
 | |
|   br label %LOOP
 | |
| }
 | |
| 
 | |
| ; The same as @test1 except the LOOP condition canonicalized (as by instcombine).
 | |
| define void @test1-canonicalized(i24 %a, i24 %b) {
 | |
| entry:
 | |
|   br label %LOOP
 | |
| 
 | |
| LOOP:
 | |
|   %f.not = icmp ult i24 %a, %b
 | |
|   br i1 %f.not, label %B2, label %B1
 | |
| 
 | |
| B1:
 | |
|   %x = add i24 %a, %b
 | |
|   br label %B2
 | |
| 
 | |
| B2:
 | |
|   br label %LOOP
 | |
| }
 | |
| 
 | |
| ; The same as @test1 but different order of B1 and B2 in the function.
 | |
| ; The different order makes PostDomTree different in presense of postdom
 | |
| ; unreachable blocks.
 | |
| define void @test2(i24 %a, i24 %b) {
 | |
| entry:
 | |
|   br label %LOOP
 | |
| 
 | |
| LOOP:
 | |
|   %f = icmp uge i24 %a, %b
 | |
|   br i1 %f, label %B1, label %B2
 | |
| 
 | |
| B2:
 | |
|   br label %LOOP
 | |
| 
 | |
| B1:
 | |
|   %x = add i24 %a, %b
 | |
|   br label %B2
 | |
| }
 | |
| 
 | |
| ; The same as @test2 except the LOOP condition canonicalized (as by instcombine).
 | |
| define void @test2-canonicalized(i24 %a, i24 %b) {
 | |
| entry:
 | |
|   br label %LOOP
 | |
| 
 | |
| LOOP:
 | |
|   %f.not = icmp ult i24 %a, %b
 | |
|   br i1 %f.not, label %B2, label %B1
 | |
| 
 | |
| B2:
 | |
|   br label %LOOP
 | |
| 
 | |
| B1:
 | |
|   %x = add i24 %a, %b
 | |
|   br label %B2
 | |
| }
 | |
| 
 | |
| ; Two reverse unreachable subgraphs with RU1* and RU2* basic blocks respectively.
 | |
| define void @test3(i24 %a, i24 %b, i32 %flag) {
 | |
| entry:
 | |
|   switch i32 %flag, label %EXIT [
 | |
|     i32 1, label %RU1
 | |
|     i32 2, label %RU2
 | |
|     i32 3, label %RU2_B1
 | |
|   ]
 | |
| 
 | |
| RU1:
 | |
|   %f = icmp uge i24 %a, %b
 | |
|   br label %RU1_LOOP
 | |
| 
 | |
| RU1_LOOP:
 | |
|   br i1 %f, label %RU1_B1, label %RU1_B2
 | |
| 
 | |
| RU1_B1:
 | |
|   %x = add i24 %a, %b
 | |
|   br label %RU1_B2
 | |
| 
 | |
| RU1_B2:
 | |
|   br label %RU1_LOOP
 | |
| 
 | |
| RU2:
 | |
|   %f2 = icmp uge i24 %a, %b
 | |
|   br i1 %f2, label %RU2_B1, label %RU2_B2
 | |
| 
 | |
| RU2_B1:
 | |
|   br label %RU2_B2
 | |
| 
 | |
| RU2_B2:
 | |
|   br label %RU2_B1
 | |
| 
 | |
| EXIT:
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| ; The same as @test3 except the icmp conditions are canonicalized (as by instcombine).
 | |
| define void @test3-canonicalized(i24 %a, i24 %b, i32 %flag) {
 | |
| entry:
 | |
|   switch i32 %flag, label %EXIT [
 | |
|     i32 1, label %RU1
 | |
|     i32 2, label %RU2
 | |
|     i32 3, label %RU2_B1
 | |
|   ]
 | |
| 
 | |
| RU1:
 | |
|   %f.not = icmp ult i24 %a, %b
 | |
|   br label %RU1_LOOP
 | |
| 
 | |
| RU1_LOOP:
 | |
|   br i1 %f.not, label %RU1_B2, label %RU1_B1
 | |
| 
 | |
| RU1_B1:
 | |
|   %x = add i24 %a, %b
 | |
|   br label %RU1_B2
 | |
| 
 | |
| RU1_B2:
 | |
|   br label %RU1_LOOP
 | |
| 
 | |
| RU2:
 | |
|   %f2.not = icmp ult i24 %a, %b
 | |
|   br i1 %f2.not, label %RU2_B2, label %RU2_B1
 | |
| 
 | |
| RU2_B1:
 | |
|   br label %RU2_B2
 | |
| 
 | |
| RU2_B2:
 | |
|   br label %RU2_B1
 | |
| 
 | |
| EXIT:
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| ; PostDomTrees of @test1(), @test2() and @test3() are different.
 | |
| ; PostDomTrees of @testX() and @testX-canonicalize() are the same.
 | |
| 
 | |
| ; CHECK-POSTDOM-LABEL: test1
 | |
| ; CHECK-POSTDOM-NEXT: =============================--------------------------------
 | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.
 | |
| ; CHECK-POSTDOM-NEXT:   [1]  <<exit node>>
 | |
| ; CHECK-POSTDOM-NEXT:     [2] %B1
 | |
| ; CHECK-POSTDOM-NEXT:       [3] %LOOP
 | |
| ; CHECK-POSTDOM-NEXT:         [4] %entry
 | |
| ; CHECK-POSTDOM-NEXT:         [4] %B2
 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B1
 | |
| 
 | |
| ; CHECK-POSTDOM-LABEL: test1-canonicalized
 | |
| ; CHECK-POSTDOM-NEXT: =============================--------------------------------
 | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.
 | |
| ; CHECK-POSTDOM-NEXT:   [1]  <<exit node>>
 | |
| ; CHECK-POSTDOM-NEXT:     [2] %B1
 | |
| ; CHECK-POSTDOM-NEXT:       [3] %LOOP
 | |
| ; CHECK-POSTDOM-NEXT:         [4] %entry
 | |
| ; CHECK-POSTDOM-NEXT:         [4] %B2
 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B1
 | |
| 
 | |
| ; CHECK-POSTDOM-LABEL: test2
 | |
| ; CHECK-POSTDOM-NEXT: =============================--------------------------------
 | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.
 | |
| ; CHECK-POSTDOM-NEXT:   [1]  <<exit node>>
 | |
| ; CHECK-POSTDOM-NEXT:     [2] %B2
 | |
| ; CHECK-POSTDOM-NEXT:       [3] %LOOP
 | |
| ; CHECK-POSTDOM-NEXT:         [4] %entry
 | |
| ; CHECK-POSTDOM-NEXT:       [3] %B1
 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B2
 | |
| 
 | |
| ; CHECK-POSTDOM-LABEL: test2-canonicalized
 | |
| ; CHECK-POSTDOM-NEXT: =============================--------------------------------
 | |
| ; CHECK-POSTDOM-NEXT: Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.
 | |
| ; CHECK-POSTDOM-NEXT:   [1]  <<exit node>>
 | |
| ; CHECK-POSTDOM-NEXT:     [2] %B2
 | |
| ; CHECK-POSTDOM-NEXT:       [3] %LOOP
 | |
| ; CHECK-POSTDOM-NEXT:         [4] %entry
 | |
| ; CHECK-POSTDOM-NEXT:       [3] %B1
 | |
| ; CHECK-POSTDOM-NEXT: Roots: %B2
 | |
| 
 | |
| ; CHECK-POSTDOM-LABEL: test3
 | |
| ; CHECK-POSTDOM-NEXT:=============================--------------------------------
 | |
| ; CHECK-POSTDOM-NEXT:Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.
 | |
| ; CHECK-POSTDOM-NEXT:  [1]  <<exit node>>
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %EXIT
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %entry
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %RU1_B1
 | |
| ; CHECK-POSTDOM-NEXT:      [3] %RU1_LOOP
 | |
| ; CHECK-POSTDOM-NEXT:        [4] %RU1
 | |
| ; CHECK-POSTDOM-NEXT:        [4] %RU1_B2
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %RU2_B1
 | |
| ; CHECK-POSTDOM-NEXT:      [3] %RU2
 | |
| ; CHECK-POSTDOM-NEXT:      [3] %RU2_B2
 | |
| ; CHECK-POSTDOM-NEXT:Roots: %EXIT %RU1_B1 %RU2_B1
 | |
| 
 | |
| ; CHECK-POSTDOM-LABEL: test3-canonicalized
 | |
| ; CHECK-POSTDOM-NEXT:=============================--------------------------------
 | |
| ; CHECK-POSTDOM-NEXT:Inorder PostDominator Tree: DFSNumbers invalid: 0 slow queries.
 | |
| ; CHECK-POSTDOM-NEXT:  [1]  <<exit node>>
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %EXIT
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %entry
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %RU1_B1
 | |
| ; CHECK-POSTDOM-NEXT:      [3] %RU1_LOOP
 | |
| ; CHECK-POSTDOM-NEXT:        [4] %RU1
 | |
| ; CHECK-POSTDOM-NEXT:        [4] %RU1_B2
 | |
| ; CHECK-POSTDOM-NEXT:    [2] %RU2_B1
 | |
| ; CHECK-POSTDOM-NEXT:      [3] %RU2
 | |
| ; CHECK-POSTDOM-NEXT:      [3] %RU2_B2
 | |
| ; CHECK-POSTDOM-NEXT:Roots: %EXIT %RU1_B1 %RU2_B1
 |