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 6 define i32 @test1(i1 %C, i32 %A, i32 %B) { 7 ; CHECK-LABEL: @test1( 8 entry: 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 13 then: ; preds = %entry 14 ret i32 %tmp.9 15 16 endif: ; 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. 24 define i32 @test2(i32 %x) nounwind ssp { 25 ; CHECK-LABEL: @test2( 26 ; CHECK-NOT: sdiv i32 27 entry: 28 br label %bb 29 30 bb: ; 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 38 bb1: ; 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 46 bb2: ; 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 52 bb4: ; preds = %bb2 53 ret i32 %x_addr.0 54 } 55 56 declare i32 @bar() 57