| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -instcombine -S | FileCheck %s |
| |
| define i32 @fold(i32 %x) { |
| ; CHECK-LABEL: @fold( |
| ; CHECK-NEXT: [[Y:%.*]] = freeze i32 [[X:%.*]] |
| ; CHECK-NEXT: ret i32 [[Y]] |
| ; |
| %y = freeze i32 %x |
| %z = freeze i32 %y |
| ret i32 %z |
| } |
| |
| define i32 @make_const() { |
| ; CHECK-LABEL: @make_const( |
| ; CHECK-NEXT: ret i32 10 |
| ; |
| %x = freeze i32 10 |
| ret i32 %x |
| } |
| |
| define i32 @and_freeze_undef(i32 %x) { |
| ; CHECK-LABEL: @and_freeze_undef( |
| ; CHECK-NEXT: ret i32 0 |
| ; |
| %f = freeze i32 undef |
| %res = and i32 %x, %f |
| ret i32 %res |
| } |
| |
| declare void @use_i32(i32) |
| |
| define i32 @and_freeze_undef_multipleuses(i32 %x) { |
| ; CHECK-LABEL: @and_freeze_undef_multipleuses( |
| ; CHECK-NEXT: call void @use_i32(i32 0) |
| ; CHECK-NEXT: ret i32 0 |
| ; |
| %f = freeze i32 undef |
| %res = and i32 %x, %f |
| call void @use_i32(i32 %f) |
| ret i32 %res |
| } |
| |
| define i32 @or_freeze_undef(i32 %x) { |
| ; CHECK-LABEL: @or_freeze_undef( |
| ; CHECK-NEXT: ret i32 -1 |
| ; |
| %f = freeze i32 undef |
| %res = or i32 %x, %f |
| ret i32 %res |
| } |
| |
| define i32 @or_freeze_undef_multipleuses(i32 %x) { |
| ; CHECK-LABEL: @or_freeze_undef_multipleuses( |
| ; CHECK-NEXT: call void @use_i32(i32 0) |
| ; CHECK-NEXT: ret i32 [[X:%.*]] |
| ; |
| %f = freeze i32 undef |
| %res = or i32 %x, %f |
| call void @use_i32(i32 %f) |
| ret i32 %res |
| } |
| |
| declare void @use_i32_i1(i32, i1) |
| |
| define void @or_select_multipleuses(i32 %x, i1 %y) { |
| ; CHECK-LABEL: @or_select_multipleuses( |
| ; CHECK-NEXT: call void @use_i32_i1(i32 32, i1 [[Y:%.*]]) |
| ; CHECK-NEXT: ret void |
| ; |
| %f = freeze i1 undef |
| %a = select i1 %f, i32 %x, i32 32 ; prefers %f to be false |
| %b = or i1 %f, %y ; prefers %f to be true |
| call void @use_i32_i1(i32 %a, i1 %b) |
| ret void |
| } |
| |
| define void @or_select_multipleuses_logical(i32 %x, i1 %y) { |
| ; CHECK-LABEL: @or_select_multipleuses_logical( |
| ; CHECK-NEXT: call void @use_i32_i1(i32 32, i1 [[Y:%.*]]) |
| ; CHECK-NEXT: ret void |
| ; |
| %f = freeze i1 undef |
| %a = select i1 %f, i32 %x, i32 32 ; prefers %f to be false |
| %b = select i1 %f, i1 true, i1 %y ; prefers %f to be true |
| call void @use_i32_i1(i32 %a, i1 %b) |
| ret void |
| } |