[opaque pointer type] Add textual IR support for explicit type parameter for global...
[oota-llvm.git] / test / Transforms / InstCombine / select-cmp-br.ll
index 2e999510b4220bc2dae22f2d204fbcd526c7c60a..1dc7e153f5fb0da41e55036696f27899c5e09013 100644 (file)
@@ -5,16 +5,17 @@
 %struct.S = type { i64*, i32, i32 }
 
 declare void @bar(%struct.S *) #1
+declare void @foobar()
 
 define void @test1(%C*) {
 entry:
-  %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
-  %m = load i64** %1, align 8
-  %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
-  %n = load i64** %2, align 8
-  %3 = getelementptr inbounds i64* %m, i64 9
+  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
+  %m = load i64*, i64** %1, align 8
+  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
+  %n = load i64*, i64** %2, align 8
+  %3 = getelementptr inbounds i64, i64* %m, i64 9
   %4 = bitcast i64* %3 to i64 (%C*)**
-  %5 = load i64 (%C*)** %4, align 8
+  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
   %6 = icmp eq i64* %m, %n
   %7 = select i1 %6, %C* %0, %C* null
   %8 = icmp eq %C* %7, null
@@ -24,7 +25,7 @@ entry:
   ret void
 
 ; <label>:10                                      ; preds = %entry
-  %11 = getelementptr inbounds %C* %7, i64 0, i32 0
+  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
   tail call void @bar(%struct.S* %11)
   br label %9
 
@@ -34,17 +35,18 @@ entry:
 ; CHECK-LABEL: @test1(
 ; CHECK-NOT: select
 ; CHECK: or
+; CHECK-NOT: select
 }
 
 define void @test2(%C*) {
 entry:
-  %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
-  %m = load i64** %1, align 8
-  %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
-  %n = load i64** %2, align 8
-  %3 = getelementptr inbounds i64* %m, i64 9
+  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
+  %m = load i64*, i64** %1, align 8
+  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
+  %n = load i64*, i64** %2, align 8
+  %3 = getelementptr inbounds i64, i64* %m, i64 9
   %4 = bitcast i64* %3 to i64 (%C*)**
-  %5 = load i64 (%C*)** %4, align 8
+  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
   %6 = icmp eq i64* %m, %n
   %7 = select i1 %6, %C* null, %C* %0
   %8 = icmp eq %C* %7, null
@@ -54,7 +56,7 @@ entry:
   ret void
 
 ; <label>:10                                      ; preds = %entry
-  %11 = getelementptr inbounds %C* %7, i64 0, i32 0
+  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
   tail call void @bar(%struct.S* %11)
   br label %9
 
@@ -64,17 +66,18 @@ entry:
 ; CHECK-LABEL: @test2(
 ; CHECK-NOT: select
 ; CHECK: or
+; CHECK-NOT: select
 }
 
 define void @test3(%C*) {
 entry:
-  %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
-  %m = load i64** %1, align 8
-  %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
-  %n = load i64** %2, align 8
-  %3 = getelementptr inbounds i64* %m, i64 9
+  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
+  %m = load i64*, i64** %1, align 8
+  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
+  %n = load i64*, i64** %2, align 8
+  %3 = getelementptr inbounds i64, i64* %m, i64 9
   %4 = bitcast i64* %3 to i64 (%C*)**
-  %5 = load i64 (%C*)** %4, align 8
+  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
   %6 = icmp eq i64* %m, %n
   %7 = select i1 %6, %C* %0, %C* null
   %8 = icmp ne %C* %7, null
@@ -84,7 +87,7 @@ entry:
   ret void
 
 ; <label>:10                                      ; preds = %entry
-  %11 = getelementptr inbounds %C* %7, i64 0, i32 0
+  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
   tail call void @bar(%struct.S* %11)
   br label %9
 
@@ -94,17 +97,18 @@ entry:
 ; CHECK-LABEL: @test3(
 ; CHECK-NOT: select
 ; CHECK: or
+; CHECK-NOT: select
 }
 
 define void @test4(%C*) {
 entry:
-  %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
-  %m = load i64** %1, align 8
-  %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
-  %n = load i64** %2, align 8
-  %3 = getelementptr inbounds i64* %m, i64 9
+  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
+  %m = load i64*, i64** %1, align 8
+  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
+  %n = load i64*, i64** %2, align 8
+  %3 = getelementptr inbounds i64, i64* %m, i64 9
   %4 = bitcast i64* %3 to i64 (%C*)**
-  %5 = load i64 (%C*)** %4, align 8
+  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
   %6 = icmp eq i64* %m, %n
   %7 = select i1 %6, %C* null, %C* %0
   %8 = icmp ne %C* %7, null
@@ -114,7 +118,7 @@ entry:
   ret void
 
 ; <label>:10                                      ; preds = %entry
-  %11 = getelementptr inbounds %C* %7, i64 0, i32 0
+  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
   tail call void @bar(%struct.S* %11)
   br label %9
 
@@ -124,4 +128,28 @@ entry:
 ; CHECK-LABEL: @test4(
 ; CHECK-NOT: select
 ; CHECK: or
+; CHECK-NOT: select
+}
+
+define void @test5(%C*, i1) {
+entry:
+  %2 = select i1 %1, %C* null, %C* %0
+  %3 = icmp ne %C* %2, null
+  br i1 %3, label %5, label %7
+
+; <label>:4                                       ; preds = %10, %12
+  ret void
+
+; <label>:5                                      ; preds = %entry
+  %6 = getelementptr inbounds %C, %C* %2, i64 0, i32 0
+  tail call void @bar(%struct.S* %6)
+  br label %4
+
+; <label>:7                                      ; preds = %entry
+  tail call void @foobar()
+  br label %4
+; CHECK-LABEL: @test5(
+; CHECK-NOT: select
+; CHECK: or
+; CHECK-NOT: select
 }