| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S -passes=mergefunc < %s | FileCheck %s |
| |
| define i32 @fn_add_nuw_nsw(i32 %a) { |
| ; CHECK-LABEL: define i32 @fn_add_nuw_nsw( |
| ; CHECK-SAME: i32 [[A:%.*]]) { |
| ; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| %add = add nuw nsw i32 %a, 1 |
| ret i32 %add |
| } |
| |
| define internal i32 @fn_add_nuw(i32 %a) { |
| %add = add nuw i32 %a, 1 |
| ret i32 %add |
| } |
| |
| define ptr @fn_gep_inbounds(ptr %a) { |
| ; CHECK-LABEL: define ptr @fn_gep_inbounds( |
| ; CHECK-SAME: ptr [[A:%.*]]) { |
| ; CHECK-NEXT: [[GEP:%.*]] = getelementptr nusw i8, ptr [[A]], i64 1 |
| ; CHECK-NEXT: ret ptr [[GEP]] |
| ; |
| %gep = getelementptr inbounds i8, ptr %a, i64 1 |
| ret ptr %gep |
| } |
| |
| define internal ptr @fn_gep_nusw(ptr %a) { |
| %gep = getelementptr nusw i8, ptr %a, i64 1 |
| ret ptr %gep |
| } |
| |
| define ptr @fn_gep_inbounds2(ptr %a) { |
| ; CHECK-LABEL: define ptr @fn_gep_inbounds2( |
| ; CHECK-SAME: ptr [[A:%.*]]) { |
| ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 2 |
| ; CHECK-NEXT: ret ptr [[GEP]] |
| ; |
| %gep = getelementptr inbounds i8, ptr %a, i64 2 |
| ret ptr %gep |
| } |
| |
| define internal ptr @fn_gep_nuw(ptr %a) { |
| %gep = getelementptr nuw i8, ptr %a, i64 2 |
| ret ptr %gep |
| } |
| |
| define float @fn_fadd_ninf_nnan(float %a) { |
| ; CHECK-LABEL: define float @fn_fadd_ninf_nnan( |
| ; CHECK-SAME: float [[A:%.*]]) { |
| ; CHECK-NEXT: [[ADD:%.*]] = fadd ninf float [[A]], 1.000000e+00 |
| ; CHECK-NEXT: ret float [[ADD]] |
| ; |
| %add = fadd ninf nnan float %a, 1.0 |
| ret float %add |
| } |
| |
| define internal float @fn_fadd_ninf_reassoc(float %a) { |
| %add = fadd ninf reassoc float %a, 1.0 |
| ret float %add |
| } |
| |
| define i32 @fn_vararg_add_nsw(i32 %a, ...) { |
| ; CHECK-LABEL: define i32 @fn_vararg_add_nsw( |
| ; CHECK-SAME: i32 [[A:%.*]], ...) { |
| ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], 1 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| %add = add nsw i32 %a, 1 |
| ret i32 %add |
| } |
| |
| define i32 @fn_vararg_add_wrap(i32 %a, ...) { |
| ; CHECK-LABEL: define i32 @fn_vararg_add_wrap( |
| ; CHECK-SAME: i32 [[A:%.*]], ...) { |
| ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], 1 |
| ; CHECK-NEXT: ret i32 [[ADD]] |
| ; |
| %add = add i32 %a, 1 |
| ret i32 %add |
| } |
| |
| define void @calls(i32 %x, ptr %p, float %f) { |
| ; CHECK-LABEL: define void @calls( |
| ; CHECK-SAME: i32 [[X:%.*]], ptr [[P:%.*]], float [[F:%.*]]) { |
| ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @fn_add_nuw_nsw(i32 [[X]]) |
| ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @fn_add_nuw_nsw(i32 [[X]]) |
| ; CHECK-NEXT: [[TMP3:%.*]] = call ptr @fn_gep_inbounds(ptr [[P]]) |
| ; CHECK-NEXT: [[TMP4:%.*]] = call ptr @fn_gep_inbounds(ptr [[P]]) |
| ; CHECK-NEXT: [[TMP5:%.*]] = call ptr @fn_gep_inbounds2(ptr [[P]]) |
| ; CHECK-NEXT: [[TMP6:%.*]] = call ptr @fn_gep_inbounds2(ptr [[P]]) |
| ; CHECK-NEXT: [[TMP7:%.*]] = call float @fn_fadd_ninf_nnan(float [[F]]) |
| ; CHECK-NEXT: [[TMP8:%.*]] = call float @fn_fadd_ninf_nnan(float [[F]]) |
| ; CHECK-NEXT: [[TMP9:%.*]] = call i32 (i32, ...) @fn_vararg_add_nsw(i32 [[X]]) |
| ; CHECK-NEXT: [[TMP10:%.*]] = call i32 (i32, ...) @fn_vararg_add_nsw(i32 [[X]]) |
| ; CHECK-NEXT: ret void |
| ; |
| call i32 @fn_add_nuw_nsw(i32 %x) |
| call i32 @fn_add_nuw(i32 %x) |
| call ptr @fn_gep_inbounds(ptr %p) |
| call ptr @fn_gep_nusw(ptr %p) |
| call ptr @fn_gep_inbounds2(ptr %p) |
| call ptr @fn_gep_nuw(ptr %p) |
| call float @fn_fadd_ninf_nnan(float %f) |
| call float @fn_fadd_ninf_reassoc(float %f) |
| call i32 (i32, ...) @fn_vararg_add_nsw(i32 %x) |
| call i32 (i32, ...) @fn_vararg_add_wrap(i32 %x) |
| ret void |
| } |