|  | ; RUN: opt -sccp -S < %s | FileCheck %s | 
|  |  | 
|  |  | 
|  | ; PR6940 | 
|  | define double @test1() { | 
|  | %t = sitofp i32 undef to double | 
|  | ret double %t | 
|  | ; CHECK-LABEL: @test1( | 
|  | ; CHECK: ret double 0.0 | 
|  | } | 
|  |  | 
|  |  | 
|  | ; rdar://7832370 | 
|  | ; Check that lots of stuff doesn't get turned into undef. | 
|  | define i32 @test2() nounwind readnone ssp { | 
|  | ; CHECK-LABEL: @test2( | 
|  | init: | 
|  | br label %control.outer.outer | 
|  |  | 
|  | control.outer.loopexit.us-lcssa:                  ; preds = %control | 
|  | br label %control.outer.loopexit | 
|  |  | 
|  | control.outer.loopexit:                           ; preds = %control.outer.loopexit.us-lcssa.us, %control.outer.loopexit.us-lcssa | 
|  | br label %control.outer.outer.backedge | 
|  |  | 
|  | control.outer.outer:                              ; preds = %control.outer.outer.backedge, %init | 
|  | %switchCond.0.ph.ph = phi i32 [ 2, %init ], [ 3, %control.outer.outer.backedge ] ; <i32> [#uses=2] | 
|  | %i.0.ph.ph = phi i32 [ undef, %init ], [ %i.0.ph.ph.be, %control.outer.outer.backedge ] ; <i32> [#uses=1] | 
|  | %tmp4 = icmp eq i32 %i.0.ph.ph, 0               ; <i1> [#uses=1] | 
|  | br i1 %tmp4, label %control.outer.outer.split.us, label %control.outer.outer.control.outer.outer.split_crit_edge | 
|  |  | 
|  | control.outer.outer.control.outer.outer.split_crit_edge: ; preds = %control.outer.outer | 
|  | br label %control.outer | 
|  |  | 
|  | control.outer.outer.split.us:                     ; preds = %control.outer.outer | 
|  | br label %control.outer.us | 
|  |  | 
|  | control.outer.us:                                 ; preds = %bb3.us, %control.outer.outer.split.us | 
|  | %A.0.ph.us = phi i32 [ %switchCond.0.us, %bb3.us ], [ 4, %control.outer.outer.split.us ] ; <i32> [#uses=2] | 
|  | %switchCond.0.ph.us = phi i32 [ %A.0.ph.us, %bb3.us ], [ %switchCond.0.ph.ph, %control.outer.outer.split.us ] ; <i32> [#uses=1] | 
|  | br label %control.us | 
|  |  | 
|  | bb3.us:                                           ; preds = %control.us | 
|  | br label %control.outer.us | 
|  |  | 
|  | bb0.us:                                           ; preds = %control.us | 
|  | br label %control.us | 
|  |  | 
|  | ; CHECK: control.us:                                       ; preds = %bb0.us, %control.outer.us | 
|  | ; CHECK-NEXT:  %switchCond.0.us = phi i32 | 
|  | ; CHECK-NEXT:  switch i32 %switchCond.0.us | 
|  | control.us:                                       ; preds = %bb0.us, %control.outer.us | 
|  | %switchCond.0.us = phi i32 [ %A.0.ph.us, %bb0.us ], [ %switchCond.0.ph.us, %control.outer.us ] ; <i32> [#uses=2] | 
|  | switch i32 %switchCond.0.us, label %control.outer.loopexit.us-lcssa.us [ | 
|  | i32 0, label %bb0.us | 
|  | i32 1, label %bb1.us-lcssa.us | 
|  | i32 3, label %bb3.us | 
|  | i32 4, label %bb4.us-lcssa.us | 
|  | ] | 
|  |  | 
|  | control.outer.loopexit.us-lcssa.us:               ; preds = %control.us | 
|  | br label %control.outer.loopexit | 
|  |  | 
|  | bb1.us-lcssa.us:                                  ; preds = %control.us | 
|  | br label %bb1 | 
|  |  | 
|  | bb4.us-lcssa.us:                                  ; preds = %control.us | 
|  | br label %bb4 | 
|  |  | 
|  | control.outer:                                    ; preds = %bb3, %control.outer.outer.control.outer.outer.split_crit_edge | 
|  | %A.0.ph = phi i32 [ %nextId17, %bb3 ], [ 4, %control.outer.outer.control.outer.outer.split_crit_edge ] ; <i32> [#uses=1] | 
|  | %switchCond.0.ph = phi i32 [ 0, %bb3 ], [ %switchCond.0.ph.ph, %control.outer.outer.control.outer.outer.split_crit_edge ] ; <i32> [#uses=1] | 
|  | br label %control | 
|  |  | 
|  | control:                                          ; preds = %bb0, %control.outer | 
|  | %switchCond.0 = phi i32 [ %A.0.ph, %bb0 ], [ %switchCond.0.ph, %control.outer ] ; <i32> [#uses=2] | 
|  | switch i32 %switchCond.0, label %control.outer.loopexit.us-lcssa [ | 
|  | i32 0, label %bb0 | 
|  | i32 1, label %bb1.us-lcssa | 
|  | i32 3, label %bb3 | 
|  | i32 4, label %bb4.us-lcssa | 
|  | ] | 
|  |  | 
|  | bb4.us-lcssa:                                     ; preds = %control | 
|  | br label %bb4 | 
|  |  | 
|  | bb4:                                              ; preds = %bb4.us-lcssa, %bb4.us-lcssa.us | 
|  | br label %control.outer.outer.backedge | 
|  |  | 
|  | control.outer.outer.backedge:                     ; preds = %bb4, %control.outer.loopexit | 
|  | %i.0.ph.ph.be = phi i32 [ 1, %bb4 ], [ 0, %control.outer.loopexit ] ; <i32> [#uses=1] | 
|  | br label %control.outer.outer | 
|  |  | 
|  | bb3:                                              ; preds = %control | 
|  | %nextId17 = add i32 %switchCond.0, -2           ; <i32> [#uses=1] | 
|  | br label %control.outer | 
|  |  | 
|  | bb0:                                              ; preds = %control | 
|  | br label %control | 
|  |  | 
|  | bb1.us-lcssa:                                     ; preds = %control | 
|  | br label %bb1 | 
|  |  | 
|  | bb1:                                              ; preds = %bb1.us-lcssa, %bb1.us-lcssa.us | 
|  | ret i32 0 | 
|  | } | 
|  |  | 
|  | ; Make sure SCCP honors the xor "idiom" | 
|  | ; rdar://9956541 | 
|  | define i32 @test3() { | 
|  | %t = xor i32 undef, undef | 
|  | ret i32 %t | 
|  | ; CHECK-LABEL: @test3( | 
|  | ; CHECK: ret i32 0 | 
|  | } | 
|  |  | 
|  | ; Be conservative with FP ops | 
|  | define double @test4(double %x) { | 
|  | %t = fadd double %x, undef | 
|  | ret double %t | 
|  | ; CHECK-LABEL: @test4( | 
|  | ; CHECK: fadd double %x, undef | 
|  | } | 
|  |  | 
|  | ; Make sure casts produce a possible value | 
|  | define i32 @test5() { | 
|  | %t = sext i8 undef to i32 | 
|  | ret i32 %t | 
|  | ; CHECK-LABEL: @test5( | 
|  | ; CHECK: ret i32 0 | 
|  | } | 
|  |  | 
|  | ; Make sure ashr produces a possible value | 
|  | define i32 @test6() { | 
|  | %t = ashr i32 undef, 31 | 
|  | ret i32 %t | 
|  | ; CHECK-LABEL: @test6( | 
|  | ; CHECK: ret i32 0 | 
|  | } | 
|  |  | 
|  | ; Make sure lshr produces a possible value | 
|  | define i32 @test7() { | 
|  | %t = lshr i32 undef, 31 | 
|  | ret i32 %t | 
|  | ; CHECK-LABEL: @test7( | 
|  | ; CHECK: ret i32 0 | 
|  | } | 
|  |  | 
|  | ; icmp eq with undef simplifies to undef | 
|  | define i1 @test8() { | 
|  | %t = icmp eq i32 undef, -1 | 
|  | ret i1 %t | 
|  | ; CHECK-LABEL: @test8( | 
|  | ; CHECK: ret i1 undef | 
|  | } | 
|  |  | 
|  | ; Make sure we don't conclude that relational comparisons simplify to undef | 
|  | define i1 @test9() { | 
|  | %t = icmp ugt i32 undef, -1 | 
|  | ret i1 %t | 
|  | ; CHECK-LABEL: @test9( | 
|  | ; CHECK: icmp ugt | 
|  | } | 
|  |  | 
|  | ; Make sure we handle extractvalue | 
|  | define i64 @test10() { | 
|  | entry: | 
|  | %e = extractvalue { i64, i64 } undef, 1 | 
|  | ret i64 %e | 
|  | ; CHECK-LABEL: @test10( | 
|  | ; CHECK: ret i64 undef | 
|  | } | 
|  |  | 
|  | @GV = external global i32 | 
|  |  | 
|  | define i32 @test11(i1 %tobool) { | 
|  | entry: | 
|  | %shr4 = ashr i32 undef, zext (i1 icmp eq (i32* bitcast (i32 (i1)* @test11 to i32*), i32* @GV) to i32) | 
|  | ret i32 %shr4 | 
|  | ; CHECK-LABEL: @test11( | 
|  | ; CHECK: ret i32 0 | 
|  | } |