Home | History | Annotate | Download | only in InstCombine
      1 ; Replace a 'select' with 'or' in 'select - cmp [eq|ne] - br' sequence
      2 ; RUN: opt -instcombine -S < %s | FileCheck %s
      3 
      4 %C = type <{ %struct.S }>
      5 %struct.S = type { i64*, i32, i32 }
      6 
      7 declare void @bar(%struct.S *) #1
      8 declare void @foobar()
      9 
     10 define void @test1(%C*) {
     11 entry:
     12   %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
     13   %m = load i64*, i64** %1, align 8
     14   %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
     15   %n = load i64*, i64** %2, align 8
     16   %3 = getelementptr inbounds i64, i64* %m, i64 9
     17   %4 = bitcast i64* %3 to i64 (%C*)**
     18   %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
     19   %6 = icmp eq i64* %m, %n
     20   %7 = select i1 %6, %C* %0, %C* null
     21   %8 = icmp eq %C* %7, null
     22   br i1 %8, label %12, label %10
     23 
     24 ; <label>:9                                       ; preds = %10, %12
     25   ret void
     26 
     27 ; <label>:10                                      ; preds = %entry
     28   %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
     29   tail call void @bar(%struct.S* %11)
     30   br label %9
     31 
     32 ; <label>:12                                      ; preds = %entry
     33   %13 = tail call i64 %5(%C* %0)
     34   br label %9
     35 ; CHECK-LABEL: @test1(
     36 ; CHECK-NOT: select
     37 ; CHECK: or
     38 ; CHECK-NOT: select
     39 }
     40 
     41 define void @test2(%C*) {
     42 entry:
     43   %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
     44   %m = load i64*, i64** %1, align 8
     45   %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
     46   %n = load i64*, i64** %2, align 8
     47   %3 = getelementptr inbounds i64, i64* %m, i64 9
     48   %4 = bitcast i64* %3 to i64 (%C*)**
     49   %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
     50   %6 = icmp eq i64* %m, %n
     51   %7 = select i1 %6, %C* null, %C* %0
     52   %8 = icmp eq %C* %7, null
     53   br i1 %8, label %12, label %10
     54 
     55 ; <label>:9                                       ; preds = %10, %12
     56   ret void
     57 
     58 ; <label>:10                                      ; preds = %entry
     59   %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
     60   tail call void @bar(%struct.S* %11)
     61   br label %9
     62 
     63 ; <label>:12                                      ; preds = %entry
     64   %13 = tail call i64 %5(%C* %0)
     65   br label %9
     66 ; CHECK-LABEL: @test2(
     67 ; CHECK-NOT: select
     68 ; CHECK: or
     69 ; CHECK-NOT: select
     70 }
     71 
     72 define void @test3(%C*) {
     73 entry:
     74   %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
     75   %m = load i64*, i64** %1, align 8
     76   %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
     77   %n = load i64*, i64** %2, align 8
     78   %3 = getelementptr inbounds i64, i64* %m, i64 9
     79   %4 = bitcast i64* %3 to i64 (%C*)**
     80   %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
     81   %6 = icmp eq i64* %m, %n
     82   %7 = select i1 %6, %C* %0, %C* null
     83   %8 = icmp ne %C* %7, null
     84   br i1 %8, label %10, label %12
     85 
     86 ; <label>:9                                       ; preds = %10, %12
     87   ret void
     88 
     89 ; <label>:10                                      ; preds = %entry
     90   %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
     91   tail call void @bar(%struct.S* %11)
     92   br label %9
     93 
     94 ; <label>:12                                      ; preds = %entry
     95   %13 = tail call i64 %5(%C* %0)
     96   br label %9
     97 ; CHECK-LABEL: @test3(
     98 ; CHECK-NOT: select
     99 ; CHECK: or
    100 ; CHECK-NOT: select
    101 }
    102 
    103 define void @test4(%C*) {
    104 entry:
    105   %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
    106   %m = load i64*, i64** %1, align 8
    107   %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
    108   %n = load i64*, i64** %2, align 8
    109   %3 = getelementptr inbounds i64, i64* %m, i64 9
    110   %4 = bitcast i64* %3 to i64 (%C*)**
    111   %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
    112   %6 = icmp eq i64* %m, %n
    113   %7 = select i1 %6, %C* null, %C* %0
    114   %8 = icmp ne %C* %7, null
    115   br i1 %8, label %10, label %12
    116 
    117 ; <label>:9                                       ; preds = %10, %12
    118   ret void
    119 
    120 ; <label>:10                                      ; preds = %entry
    121   %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
    122   tail call void @bar(%struct.S* %11)
    123   br label %9
    124 
    125 ; <label>:12                                      ; preds = %entry
    126   %13 = tail call i64 %5(%C* %0)
    127   br label %9
    128 ; CHECK-LABEL: @test4(
    129 ; CHECK-NOT: select
    130 ; CHECK: or
    131 ; CHECK-NOT: select
    132 }
    133 
    134 define void @test5(%C*, i1) {
    135 entry:
    136   %2 = select i1 %1, %C* null, %C* %0
    137   %3 = icmp ne %C* %2, null
    138   br i1 %3, label %5, label %7
    139 
    140 ; <label>:4                                       ; preds = %10, %12
    141   ret void
    142 
    143 ; <label>:5                                      ; preds = %entry
    144   %6 = getelementptr inbounds %C, %C* %2, i64 0, i32 0
    145   tail call void @bar(%struct.S* %6)
    146   br label %4
    147 
    148 ; <label>:7                                      ; preds = %entry
    149   tail call void @foobar()
    150   br label %4
    151 ; CHECK-LABEL: @test5(
    152 ; CHECK-NOT: select
    153 ; CHECK: or
    154 ; CHECK-NOT: select
    155 }
    156