; 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 -1 } ; 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 -1 }