| // RUN: tco %s | FileCheck %s |
| // RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s |
| |
| // Test peephole optimizations |
| |
| // CHECK-LABEL: define i8 @test_trunc( |
| // CHECK-SAME: i256 %[[arg:.*]]) |
| // CHECK-NEXT: = trunc i256 %[[arg]] to i8 |
| // CHECK-NEXT: ret i8 |
| func.func @test_trunc(%0 : i256) -> i8 { |
| %1 = fir.convert %0 : (i256) -> i128 |
| %2 = fir.convert %1 : (i128) -> i64 |
| %3 = fir.convert %2 : (i64) -> i32 |
| %4 = fir.convert %3 : (i32) -> i16 |
| %5 = fir.convert %4 : (i16) -> i8 |
| return %5 : i8 |
| } |
| |
| // CHECK-LABEL: define i256 @test_sext( |
| // CHECK-SAME: i8 %[[arg:.*]]) |
| // CHECK-NEXT: = sext i8 %[[arg]] to i256 |
| // CHECK-NEXT: ret i256 |
| func.func @test_sext(%0 : i8) -> i256 { |
| %1 = fir.convert %0 : (i8) -> i16 |
| %2 = fir.convert %1 : (i16) -> i32 |
| %3 = fir.convert %2 : (i32) -> i64 |
| %4 = fir.convert %3 : (i64) -> i128 |
| %5 = fir.convert %4 : (i128) -> i256 |
| return %5 : i256 |
| } |
| |
| // CHECK-LABEL: define half @test_fptrunc( |
| // CHECK-SAME: fp128 %[[arg:.*]]) |
| // CHECK-NEXT: %[[res:.*]] = fptrunc fp128 %[[arg]] to half |
| // CHECK-NEXT: ret half %[[res]] |
| func.func @test_fptrunc(%0 : f128) -> f16 { |
| %2 = fir.convert %0 : (f128) -> f64 |
| %3 = fir.convert %2 : (f64) -> f32 |
| %4 = fir.convert %3 : (f32) -> f16 |
| return %4 : f16 |
| } |
| |
| // CHECK-LABEL: define x86_fp80 @test_fpext( |
| // CHECK-SAME: bfloat %[[arg:.*]]) |
| // CHECK-NEXT: = fpext bfloat %[[arg]] to x86_fp80 |
| // CHECK-NEXT: ret x86_fp80 |
| func.func @test_fpext(%0 : bf16) -> f80 { |
| %2 = fir.convert %0 : (bf16) -> f32 |
| %3 = fir.convert %2 : (f32) -> f64 |
| %4 = fir.convert %3 : (f64) -> f80 |
| return %4 : f80 |
| } |
| |
| // CHECK-LABEL: define i64 @test_ascending( |
| // CHECK-SAME: i8 %[[arg:.*]]) |
| // CHECK-NEXT: = sext i8 %[[arg]] to i64 |
| // CHECK-NEXT: ret i64 |
| func.func @test_ascending(%0 : i8) -> index { |
| %1 = fir.convert %0 : (i8) -> i16 |
| %2 = fir.convert %1 : (i16) -> i32 |
| %3 = fir.convert %2 : (i32) -> i64 |
| %5 = fir.convert %3 : (i64) -> index |
| return %5 : index |
| } |
| |
| // CHECK-LABEL: define i8 @test_descending( |
| // CHECK-SAME: i64 %[[arg:.*]]) |
| // CHECK-NEXT: = trunc i64 %[[arg]] to i8 |
| // CHECK-NEXT: ret i8 |
| func.func @test_descending(%0 : index) -> i8 { |
| %2 = fir.convert %0 : (index) -> i64 |
| %3 = fir.convert %2 : (i64) -> i32 |
| %4 = fir.convert %3 : (i32) -> i16 |
| %5 = fir.convert %4 : (i16) -> i8 |
| return %5 : i8 |
| } |
| |
| // CHECK-LABEL: define float @test_useless( |
| // CHECK-SAME: float %[[arg:.*]]) |
| // CHECK-NEXT: ret float %[[arg]] |
| func.func @test_useless(%0 : f32) -> f32 { |
| %1 = fir.convert %0 : (f32) -> f32 |
| return %1 : f32 |
| } |
| |
| // CHECK-LABEL: define float @test_useless_sext( |
| // CHECK-SAME: i32 %[[arg:.*]]) |
| // CHECK-NEXT: %[[res:.*]] = sitofp i32 %[[arg]] to float |
| // CHECK-NEXT: ret float %[[res]] |
| func.func @test_useless_sext(%0 : i32) -> f32 { |
| %1 = fir.convert %0 : (i32) -> i64 |
| %2 = fir.convert %1 : (i64) -> i32 |
| %3 = fir.convert %2 : (i32) -> f32 |
| return %3 : f32 |
| } |
| |
| // CHECK-LABEL: define i16 @test_hump( |
| // CHECK-SAME: i32 %[[arg:.*]]) |
| // CHECK-NEXT: trunc i32 %[[arg]] to i16 |
| // CHECK-NEXT: ret i16 |
| func.func @test_hump(%0 : i32) -> i16 { |
| %1 = fir.convert %0 : (i32) -> i64 |
| %2 = fir.convert %1 : (i64) -> i16 |
| return %2 : i16 |
| } |
| |
| // CHECK-LABEL: define i16 @test_slump( |
| // CHECK-SAME: i32 %[[arg:.*]]) |
| // CHECK-NEXT: %[[i:.*]] = trunc i32 %[[arg]] to i8 |
| // CHECK-NEXT: sext i8 %[[i]] to i16 |
| // CHECK-NEXT: ret i16 |
| func.func @test_slump(%0 : i32) -> i16 { |
| %1 = fir.convert %0 : (i32) -> i8 |
| %2 = fir.convert %1 : (i8) -> i16 |
| return %2 : i16 |
| } |
| |
| // CHECK-LABEL: define i64 @test_slump2( |
| // CHECK-SAME: i64 %[[arg:.*]]) |
| // CHECK-NEXT: %[[i:.*]] = trunc i64 %[[arg]] to i16 |
| // CHECK-NEXT: sext i16 %[[i]] to i64 |
| // CHECK-NEXT: ret i64 |
| func.func @test_slump2(%0 : index) -> index { |
| %1 = fir.convert %0 : (index) -> i16 |
| %2 = fir.convert %1 : (i16) -> index |
| return %2 : index |
| } |