1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -jump-threading -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes=jump-threading -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" 5*9880d681SAndroid Build Coastguard Workertarget triple = "i386-apple-darwin7" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Test that we can thread through the block with the partially redundant load (%2). 8*9880d681SAndroid Build Coastguard Worker; rdar://6402033 9*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32* %P) nounwind { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @f1() nounwind ; <i32> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker br i1 %1, label %bb1, label %bb 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 17*9880d681SAndroid Build Coastguard Worker; CHECK: bb1.thread: 18*9880d681SAndroid Build Coastguard Worker; CHECK: store 19*9880d681SAndroid Build Coastguard Worker; CHECK: br label %bb3 20*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P, align 4 21*9880d681SAndroid Build Coastguard Worker br label %bb1 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry, %bb 24*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] ; <i32> [#uses=2] 25*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* %P, align 4 ; <i32> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %3 = icmp sgt i32 %2, 36 ; <i1> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker br i1 %3, label %bb3, label %bb2 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb1 30*9880d681SAndroid Build Coastguard Worker %4 = tail call i32 (...) @f2() nounwind ; <i32> [#uses=0] 31*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb1 34*9880d681SAndroid Build Coastguard Worker; CHECK: bb3: 35*9880d681SAndroid Build Coastguard Worker; CHECK: %res.01 = phi i32 [ 1, %bb1.thread ], [ 0, %bb1 ] 36*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %res.01 37*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdeclare i32 @f1(...) 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdeclare i32 @f2(...) 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker;; Check that we preserve TBAA information. 46*9880d681SAndroid Build Coastguard Worker; rdar://11039258 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* %P) nounwind { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 50*9880d681SAndroid Build Coastguard Workerentry: 51*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @f1() nounwind ; <i32> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 53*9880d681SAndroid Build Coastguard Worker br i1 %1, label %bb1, label %bb 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 56*9880d681SAndroid Build Coastguard Worker; CHECK: bb1.thread: 57*9880d681SAndroid Build Coastguard Worker; CHECK: store{{.*}}, !tbaa !0 58*9880d681SAndroid Build Coastguard Worker; CHECK: br label %bb3 59*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P, align 4, !tbaa !0 60*9880d681SAndroid Build Coastguard Worker br label %bb1 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry, %bb 63*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 64*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* %P, align 4, !tbaa !0 65*9880d681SAndroid Build Coastguard Worker %3 = icmp sgt i32 %2, 36 66*9880d681SAndroid Build Coastguard Worker br i1 %3, label %bb3, label %bb2 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb1 69*9880d681SAndroid Build Coastguard Worker %4 = tail call i32 (...) @f2() nounwind 70*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb1 73*9880d681SAndroid Build Coastguard Worker; CHECK: bb3: 74*9880d681SAndroid Build Coastguard Worker; CHECK: %res.01 = phi i32 [ 1, %bb1.thread ], [ 0, %bb1 ] 75*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %res.01 76*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i8** %x, i1 %f) { 80*9880d681SAndroid Build Coastguard Worker; Correctly thread loads of different (but compatible) types, placing bitcasts 81*9880d681SAndroid Build Coastguard Worker; as necessary in the predecessors. This is especially tricky because the same 82*9880d681SAndroid Build Coastguard Worker; predecessor ends up with two entries in the PHI node and they must share 83*9880d681SAndroid Build Coastguard Worker; a single cast. 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8** %x to i32** 87*9880d681SAndroid Build Coastguard Worker %1 = load i32*, i32** %0, align 8 88*9880d681SAndroid Build Coastguard Worker br i1 %f, label %if.end57, label %if.then56 89*9880d681SAndroid Build Coastguard Worker; CHECK: %[[LOAD:.*]] = load i32*, i32** 90*9880d681SAndroid Build Coastguard Worker; CHECK: %[[CAST:.*]] = bitcast i32* %[[LOAD]] to i8* 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerif.then56: 93*9880d681SAndroid Build Coastguard Worker br label %if.end57 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerif.end57: 96*9880d681SAndroid Build Coastguard Worker %2 = load i8*, i8** %x, align 8 97*9880d681SAndroid Build Coastguard Worker %tobool59 = icmp eq i8* %2, null 98*9880d681SAndroid Build Coastguard Worker br i1 %tobool59, label %return, label %if.then60 99*9880d681SAndroid Build Coastguard Worker; CHECK: %[[PHI:.*]] = phi i8* [ %[[CAST]], %[[PRED:[^ ]+]] ], [ %[[CAST]], %[[PRED]] ] 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[CMP:.*]] = icmp eq i8* %[[PHI]], null 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %[[CMP]] 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerif.then60: 104*9880d681SAndroid Build Coastguard Worker ret i32 42 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerreturn: 107*9880d681SAndroid Build Coastguard Worker ret i32 13 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32* %P) { 111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 112*9880d681SAndroid Build Coastguard Workerentry: 113*9880d681SAndroid Build Coastguard Worker %v0 = tail call i32 (...) @f1() 114*9880d681SAndroid Build Coastguard Worker %v1 = icmp eq i32 %v0, 0 115*9880d681SAndroid Build Coastguard Worker br i1 %v1, label %bb1, label %bb 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerbb: 118*9880d681SAndroid Build Coastguard Worker; CHECK: bb1.thread: 119*9880d681SAndroid Build Coastguard Worker; CHECK: store atomic 120*9880d681SAndroid Build Coastguard Worker; CHECK: br label %bb3 121*9880d681SAndroid Build Coastguard Worker store atomic i32 42, i32* %P unordered, align 4 122*9880d681SAndroid Build Coastguard Worker br label %bb1 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerbb1: 125*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 126*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 127*9880d681SAndroid Build Coastguard Worker; CHECK: load atomic 128*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 129*9880d681SAndroid Build Coastguard Worker %v2 = load atomic i32, i32* %P unordered, align 4 130*9880d681SAndroid Build Coastguard Worker %v3 = icmp sgt i32 %v2, 36 131*9880d681SAndroid Build Coastguard Worker br i1 %v3, label %bb3, label %bb2 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerbb2: 134*9880d681SAndroid Build Coastguard Worker %v4 = tail call i32 (...) @f2() 135*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerbb3: 138*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32* %P) { 142*9880d681SAndroid Build Coastguard Worker; Negative test 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 145*9880d681SAndroid Build Coastguard Workerentry: 146*9880d681SAndroid Build Coastguard Worker %v0 = tail call i32 (...) @f1() 147*9880d681SAndroid Build Coastguard Worker %v1 = icmp eq i32 %v0, 0 148*9880d681SAndroid Build Coastguard Worker br i1 %v1, label %bb1, label %bb 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerbb: 151*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store atomic i32 42, i32* %P release, align 4 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb1 154*9880d681SAndroid Build Coastguard Worker store atomic i32 42, i32* %P release, align 4 155*9880d681SAndroid Build Coastguard Worker br label %bb1 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerbb1: 158*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v2 = load atomic i32, i32* %P acquire, align 4 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v3 = icmp sgt i32 %v2, 36 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %v3, label %bb3, label %bb2 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 165*9880d681SAndroid Build Coastguard Worker %v2 = load atomic i32, i32* %P acquire, align 4 166*9880d681SAndroid Build Coastguard Worker %v3 = icmp sgt i32 %v2, 36 167*9880d681SAndroid Build Coastguard Worker br i1 %v3, label %bb3, label %bb2 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerbb2: 170*9880d681SAndroid Build Coastguard Worker %v4 = tail call i32 (...) @f2() 171*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerbb3: 174*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32* %P) { 178*9880d681SAndroid Build Coastguard Worker; Negative test 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 181*9880d681SAndroid Build Coastguard Workerentry: 182*9880d681SAndroid Build Coastguard Worker %v0 = tail call i32 (...) @f1() 183*9880d681SAndroid Build Coastguard Worker %v1 = icmp eq i32 %v0, 0 184*9880d681SAndroid Build Coastguard Worker br i1 %v1, label %bb1, label %bb 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerbb: 187*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 42, i32* %P 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb1 190*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P 191*9880d681SAndroid Build Coastguard Worker br label %bb1 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerbb1: 194*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v2 = load atomic i32, i32* %P acquire, align 4 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v3 = icmp sgt i32 %v2, 36 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %v3, label %bb3, label %bb2 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 201*9880d681SAndroid Build Coastguard Worker %v2 = load atomic i32, i32* %P acquire, align 4 202*9880d681SAndroid Build Coastguard Worker %v3 = icmp sgt i32 %v2, 36 203*9880d681SAndroid Build Coastguard Worker br i1 %v3, label %bb3, label %bb2 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerbb2: 206*9880d681SAndroid Build Coastguard Worker %v4 = tail call i32 (...) @f2() 207*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerbb3: 210*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32* %P) { 214*9880d681SAndroid Build Coastguard Worker; Negative test 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 217*9880d681SAndroid Build Coastguard Workerentry: 218*9880d681SAndroid Build Coastguard Worker %v0 = tail call i32 (...) @f1() 219*9880d681SAndroid Build Coastguard Worker %v1 = icmp eq i32 %v0, 0 220*9880d681SAndroid Build Coastguard Worker br i1 %v1, label %bb1, label %bb 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerbb: 223*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %val = load i32, i32* %P 225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb1 226*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* %P 227*9880d681SAndroid Build Coastguard Worker br label %bb1 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerbb1: 230*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v2 = load atomic i32, i32* %P acquire, align 4 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v3 = icmp sgt i32 %v2, 36 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %v3, label %bb3, label %bb2 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] 237*9880d681SAndroid Build Coastguard Worker %v2 = load atomic i32, i32* %P acquire, align 4 238*9880d681SAndroid Build Coastguard Worker %v3 = icmp sgt i32 %v2, 36 239*9880d681SAndroid Build Coastguard Worker br i1 %v3, label %bb3, label %bb2 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Workerbb2: 242*9880d681SAndroid Build Coastguard Worker %v4 = tail call i32 (...) @f2() 243*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerbb3: 246*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 247*9880d681SAndroid Build Coastguard Worker} 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker!0 = !{!3, !3, i64 0} 250*9880d681SAndroid Build Coastguard Worker!1 = !{!"omnipotent char", !2} 251*9880d681SAndroid Build Coastguard Worker!2 = !{!"Simple C/C++ TBAA", null} 252*9880d681SAndroid Build Coastguard Worker!3 = !{!"int", !1} 253