1; RUN: opt -instcombine -S < %s | FileCheck %s 2 3;; This tests that the instructions in the entry blocks are sunk into each 4;; arm of the 'if'. 5 6define i32 @test1(i1 %C, i32 %A, i32 %B) { 7; CHECK-LABEL: @test1( 8entry: 9 %tmp.2 = sdiv i32 %A, %B ; <i32> [#uses=1] 10 %tmp.9 = add i32 %B, %A ; <i32> [#uses=1] 11 br i1 %C, label %then, label %endif 12 13then: ; preds = %entry 14 ret i32 %tmp.9 15 16endif: ; preds = %entry 17; CHECK: sdiv i32 18; CHECK-NEXT: ret i32 19 ret i32 %tmp.2 20} 21 22 23;; PHI use, sink divide before call. 24define i32 @test2(i32 %x) nounwind ssp { 25; CHECK-LABEL: @test2( 26; CHECK-NOT: sdiv i32 27entry: 28 br label %bb 29 30bb: ; preds = %bb2, %entry 31 %x_addr.17 = phi i32 [ %x, %entry ], [ %x_addr.0, %bb2 ] ; <i32> [#uses=4] 32 %i.06 = phi i32 [ 0, %entry ], [ %4, %bb2 ] ; <i32> [#uses=1] 33 %0 = add nsw i32 %x_addr.17, 1 ; <i32> [#uses=1] 34 %1 = sdiv i32 %0, %x_addr.17 ; <i32> [#uses=1] 35 %2 = icmp eq i32 %x_addr.17, 0 ; <i1> [#uses=1] 36 br i1 %2, label %bb1, label %bb2 37 38bb1: ; preds = %bb 39; CHECK: bb1: 40; CHECK-NEXT: add nsw i32 %x_addr.17, 1 41; CHECK-NEXT: sdiv i32 42; CHECK-NEXT: tail call i32 @bar() 43 %3 = tail call i32 @bar() nounwind ; <i32> [#uses=0] 44 br label %bb2 45 46bb2: ; preds = %bb, %bb1 47 %x_addr.0 = phi i32 [ %1, %bb1 ], [ %x_addr.17, %bb ] ; <i32> [#uses=2] 48 %4 = add nsw i32 %i.06, 1 ; <i32> [#uses=2] 49 %exitcond = icmp eq i32 %4, 1000000 ; <i1> [#uses=1] 50 br i1 %exitcond, label %bb4, label %bb 51 52bb4: ; preds = %bb2 53 ret i32 %x_addr.0 54} 55 56declare i32 @bar() 57