Home | History | Annotate | Download | only in GVN
      1 ; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
      2 
      3 @a = external global i32		; <i32*> [#uses=7]
      4 
      5 ; CHECK: @test1
      6 define i32 @test1() nounwind {
      7 entry:
      8 	%0 = load i32* @a, align 4
      9 	%1 = icmp eq i32 %0, 4
     10 	br i1 %1, label %bb, label %bb1
     11 
     12 bb:		; preds = %entry
     13 	br label %bb8
     14 
     15 bb1:		; preds = %entry
     16 	%2 = load i32* @a, align 4
     17 	%3 = icmp eq i32 %2, 5
     18 	br i1 %3, label %bb2, label %bb3
     19 
     20 bb2:		; preds = %bb1
     21 	br label %bb8
     22 
     23 bb3:		; preds = %bb1
     24 	%4 = load i32* @a, align 4
     25 	%5 = icmp eq i32 %4, 4
     26 ; CHECK: br i1 false, label %bb4, label %bb5
     27 	br i1 %5, label %bb4, label %bb5
     28 
     29 bb4:		; preds = %bb3
     30 	%6 = load i32* @a, align 4
     31 	%7 = add i32 %6, 5
     32 	br label %bb8
     33 
     34 bb5:		; preds = %bb3
     35 	%8 = load i32* @a, align 4
     36 	%9 = icmp eq i32 %8, 5
     37 ; CHECK: br i1 false, label %bb6, label %bb7
     38 	br i1 %9, label %bb6, label %bb7
     39 
     40 bb6:		; preds = %bb5
     41 	%10 = load i32* @a, align 4
     42 	%11 = add i32 %10, 4
     43 	br label %bb8
     44 
     45 bb7:		; preds = %bb5
     46 	%12 = load i32* @a, align 4
     47 	br label %bb8
     48 
     49 bb8:		; preds = %bb7, %bb6, %bb4, %bb2, %bb
     50 	%.0 = phi i32 [ %12, %bb7 ], [ %11, %bb6 ], [ %7, %bb4 ], [ 4, %bb2 ], [ 5, %bb ]
     51 	br label %return
     52 
     53 return:		; preds = %bb8
     54 	ret i32 %.0
     55 }
     56 
     57 declare void @foo(i1)
     58 
     59 ; CHECK: @test2
     60 define void @test2(i1 %x, i1 %y) {
     61   %z = or i1 %x, %y
     62   br i1 %z, label %true, label %false
     63 true:
     64 ; CHECK: true:
     65   %z2 = or i1 %x, %y
     66   call void @foo(i1 %z2)
     67 ; CHECK: call void @foo(i1 true)
     68   br label %true
     69 false:
     70 ; CHECK: false:
     71   %z3 = or i1 %x, %y
     72   call void @foo(i1 %z3)
     73 ; CHECK: call void @foo(i1 false)
     74   br label %false
     75 }
     76 
     77 declare void @bar(i32)
     78 
     79 ; CHECK: @test3
     80 define void @test3(i32 %x, i32 %y) {
     81   %xz = icmp eq i32 %x, 0
     82   %yz = icmp eq i32 %y, 0
     83   %z = and i1 %xz, %yz
     84   br i1 %z, label %both_zero, label %nope
     85 both_zero:
     86   call void @foo(i1 %xz)
     87 ; CHECK: call void @foo(i1 true)
     88   call void @foo(i1 %yz)
     89 ; CHECK: call void @foo(i1 true)
     90   call void @bar(i32 %x)
     91 ; CHECK: call void @bar(i32 0)
     92   call void @bar(i32 %y)
     93 ; CHECK: call void @bar(i32 0)
     94   ret void
     95 nope:
     96   call void @foo(i1 %z)
     97 ; CHECK: call void @foo(i1 false)
     98   ret void
     99 }
    100 
    101 ; CHECK: @test4
    102 define void @test4(i1 %b, i32 %x) {
    103   br i1 %b, label %sw, label %case3
    104 sw:
    105   switch i32 %x, label %default [
    106     i32 0, label %case0
    107     i32 1, label %case1
    108     i32 2, label %case0
    109     i32 3, label %case3
    110     i32 4, label %default
    111   ]
    112 default:
    113 ; CHECK: default:
    114   call void @bar(i32 %x)
    115 ; CHECK: call void @bar(i32 %x)
    116   ret void
    117 case0:
    118 ; CHECK: case0:
    119   call void @bar(i32 %x)
    120 ; CHECK: call void @bar(i32 %x)
    121   ret void
    122 case1:
    123 ; CHECK: case1:
    124   call void @bar(i32 %x)
    125 ; CHECK: call void @bar(i32 1)
    126   ret void
    127 case3:
    128 ; CHECK: case3:
    129   call void @bar(i32 %x)
    130 ; CHECK: call void @bar(i32 %x)
    131   ret void
    132 }
    133