Home | History | Annotate | Download | only in NewGVN
      1 ; XFAIL: *
      2 ; RUN: opt < %s -basicaa -newgvn -S | FileCheck %s
      3 
      4 @a = external global i32		; <i32*> [#uses=7]
      5 
      6 ;; NewGVN takes two passes to get this, because we prune predicateinfo
      7 ; CHECK-LABEL: @test1(
      8 define i32 @test1() nounwind {
      9 entry:
     10 	%0 = load i32, i32* @a, align 4
     11 	%1 = icmp eq i32 %0, 4
     12 	br i1 %1, label %bb, label %bb1
     13 
     14 bb:		; preds = %entry
     15 	br label %bb8
     16 
     17 bb1:		; preds = %entry
     18 	%2 = load i32, i32* @a, align 4
     19 	%3 = icmp eq i32 %2, 5
     20 	br i1 %3, label %bb2, label %bb3
     21 
     22 bb2:		; preds = %bb1
     23 	br label %bb8
     24 
     25 bb3:		; preds = %bb1
     26 	%4 = load i32, i32* @a, align 4
     27 	%5 = icmp eq i32 %4, 4
     28 ; CHECK: br i1 false, label %bb4, label %bb5
     29 	br i1 %5, label %bb4, label %bb5
     30 
     31 bb4:		; preds = %bb3
     32 	%6 = load i32, i32* @a, align 4
     33 	%7 = add i32 %6, 5
     34 	br label %bb8
     35 
     36 bb5:		; preds = %bb3
     37 	%8 = load i32, i32* @a, align 4
     38 	%9 = icmp eq i32 %8, 5
     39 ; CHECK: br i1 false, label %bb6, label %bb7
     40 	br i1 %9, label %bb6, label %bb7
     41 
     42 bb6:		; preds = %bb5
     43 	%10 = load i32, i32* @a, align 4
     44 	%11 = add i32 %10, 4
     45 	br label %bb8
     46 
     47 bb7:		; preds = %bb5
     48 	%12 = load i32, i32* @a, align 4
     49 	br label %bb8
     50 
     51 bb8:		; preds = %bb7, %bb6, %bb4, %bb2, %bb
     52 	%.0 = phi i32 [ %12, %bb7 ], [ %11, %bb6 ], [ %7, %bb4 ], [ 4, %bb2 ], [ 5, %bb ]
     53 	br label %return
     54 
     55 return:		; preds = %bb8
     56 	ret i32 %.0
     57 }
     58 ;; NewGVN takes two passes to get test[6,8] and test[6,8]_fp's main part
     59 ;; The icmp ne requires an equality table that inserts the inequalities for each
     60 ;; discovered equality while processing.
     61 ; CHECK-LABEL: @test6(
     62 define i1 @test6(i32 %x, i32 %y) {
     63   %cmp2 = icmp ne i32 %x, %y
     64   %cmp = icmp eq i32 %x, %y
     65   %cmp3 = icmp eq i32 %x, %y
     66   br i1 %cmp, label %same, label %different
     67 
     68 same:
     69 ; CHECK: ret i1 false
     70   ret i1 %cmp2
     71 
     72 different:
     73 ; CHECK: ret i1 false
     74   ret i1 %cmp3
     75 }
     76 
     77 ; CHECK-LABEL: @test6_fp(
     78 define i1 @test6_fp(float %x, float %y) {
     79   %cmp2 = fcmp une float %x, %y
     80   %cmp = fcmp oeq float %x, %y
     81   %cmp3 = fcmp oeq float  %x, %y
     82   br i1 %cmp, label %same, label %different
     83 
     84 same:
     85 ; CHECK: ret i1 false
     86   ret i1 %cmp2
     87 
     88 different:
     89 ; CHECK: ret i1 false
     90   ret i1 %cmp3
     91 }
     92 ; CHECK-LABEL: @test8(
     93 define i1 @test8(i32 %x, i32 %y) {
     94   %cmp2 = icmp sle i32 %x, %y
     95   %cmp = icmp sgt i32 %x, %y
     96   %cmp3 = icmp sgt i32 %x, %y
     97   br i1 %cmp, label %same, label %different
     98 
     99 same:
    100 ; CHECK: ret i1 false
    101   ret i1 %cmp2
    102 
    103 different:
    104 ; CHECK: ret i1 false
    105   ret i1 %cmp3
    106 }
    107 
    108 ; CHECK-LABEL: @test8_fp(
    109 define i1 @test8_fp(float %x, float %y) {
    110   %cmp2 = fcmp ule float %x, %y
    111   %cmp = fcmp ogt float %x, %y
    112   %cmp3 = fcmp ogt float %x, %y
    113   br i1 %cmp, label %same, label %different
    114 
    115 same:
    116 ; CHECK: ret i1 false
    117   ret i1 %cmp2
    118 
    119 different:
    120 ; CHECK: ret i1 false
    121   ret i1 %cmp3
    122 }
    123 
    124