| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -ipsccp -instcombine -S | FileCheck %s |
| |
| define internal i32 @foo(i1 %C) { |
| ; CHECK-LABEL: @foo( |
| ; CHECK-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]] |
| ; CHECK: T: |
| ; CHECK-NEXT: ret i32 undef |
| ; CHECK: F: |
| ; CHECK-NEXT: ret i32 undef |
| ; |
| br i1 %C, label %T, label %F |
| |
| T: ; preds = %0 |
| ret i32 52 |
| |
| F: ; preds = %0 |
| ret i32 52 |
| } |
| |
| define i1 @caller(i1 %C) { |
| ; CHECK-LABEL: @caller( |
| ; CHECK-NEXT: [[X:%.*]] = call i32 @foo(i1 [[C:%.*]]) |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %X = call i32 @foo( i1 %C ) ; <i32> [#uses=1] |
| %Y = icmp ne i32 %X, 0 ; <i1> [#uses=1] |
| ret i1 %Y |
| } |
| |
| define i1 @invokecaller(i1 %C) personality i32 (...)* @__gxx_personality_v0 { |
| ; CHECK-LABEL: @invokecaller( |
| ; CHECK-NEXT: [[X:%.*]] = invoke i32 @foo(i1 [[C:%.*]]) |
| ; CHECK-NEXT: to label [[OK:%.*]] unwind label [[FAIL:%.*]] |
| ; CHECK: OK: |
| ; CHECK-NEXT: ret i1 true |
| ; CHECK: FAIL: |
| ; CHECK-NEXT: [[EXN:%.*]] = landingpad { i8*, i32 } |
| ; CHECK-NEXT: cleanup |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %X = invoke i32 @foo( i1 %C ) to label %OK unwind label %FAIL ; <i32> [#uses=1] |
| OK: |
| %Y = icmp ne i32 %X, 0 ; <i1> [#uses=1] |
| ret i1 %Y |
| FAIL: |
| %exn = landingpad {i8*, i32} |
| cleanup |
| ret i1 false |
| } |
| |
| declare i32 @__gxx_personality_v0(...) |