Index: llvm/lib/Transforms/Utils/Local.cpp =================================================================== --- llvm/lib/Transforms/Utils/Local.cpp +++ llvm/lib/Transforms/Utils/Local.cpp @@ -181,6 +181,12 @@ return true; } + if (isa(BI->getCondition())) { + // Branch on undef is undefined behavior. + changeToUnreachable(BI, /*PreserveLCSSA*/ false, DTU); + return true; + } + return false; } Index: llvm/test/Transforms/SimplifyCFG/branch-on-undef.ll =================================================================== --- llvm/test/Transforms/SimplifyCFG/branch-on-undef.ll +++ llvm/test/Transforms/SimplifyCFG/branch-on-undef.ll @@ -6,15 +6,7 @@ define void @br_undef_simple() { ; CHECK-LABEL: @br_undef_simple( ; CHECK-NEXT: call void @foo(i32 0) -; CHECK-NEXT: br i1 undef, label [[IF:%.*]], label [[ELSE:%.*]] -; CHECK: common.ret: -; CHECK-NEXT: ret void -; CHECK: if: -; CHECK-NEXT: call void @foo(i32 1) -; CHECK-NEXT: br label [[COMMON_RET:%.*]] -; CHECK: else: -; CHECK-NEXT: call void @foo(i32 2) -; CHECK-NEXT: br label [[COMMON_RET]] +; CHECK-NEXT: unreachable ; call void @foo(i32 0) br i1 undef, label %if, label %else @@ -31,15 +23,7 @@ define void @br_poison_simple() { ; CHECK-LABEL: @br_poison_simple( ; CHECK-NEXT: call void @foo(i32 0) -; CHECK-NEXT: br i1 poison, label [[IF:%.*]], label [[ELSE:%.*]] -; CHECK: common.ret: -; CHECK-NEXT: ret void -; CHECK: if: -; CHECK-NEXT: call void @foo(i32 1) -; CHECK-NEXT: br label [[COMMON_RET:%.*]] -; CHECK: else: -; CHECK-NEXT: call void @foo(i32 2) -; CHECK-NEXT: br label [[COMMON_RET]] +; CHECK-NEXT: unreachable ; call void @foo(i32 0) br i1 poison, label %if, label %else @@ -62,16 +46,14 @@ ; CHECK-NEXT: ] ; CHECK: br: ; CHECK-NEXT: call void @foo(i32 0) -; CHECK-NEXT: br i1 poison, label [[IF]], label [[ELSE]] +; CHECK-NEXT: unreachable ; CHECK: common.ret: ; CHECK-NEXT: ret void ; CHECK: if: -; CHECK-NEXT: [[PHI1:%.*]] = phi i32 [ 1, [[BR]] ], [ 2, [[ENTRY:%.*]] ] -; CHECK-NEXT: call void @foo(i32 [[PHI1]]) +; CHECK-NEXT: call void @foo(i32 2) ; CHECK-NEXT: br label [[COMMON_RET:%.*]] ; CHECK: else: -; CHECK-NEXT: [[PHI2:%.*]] = phi i32 [ 3, [[BR]] ], [ 4, [[ENTRY]] ] -; CHECK-NEXT: call void @foo(i32 [[PHI2]]) +; CHECK-NEXT: call void @foo(i32 4) ; CHECK-NEXT: br label [[COMMON_RET]] ; entry: