128 lines · plain
1// RUN: tco %s | FileCheck %s2// RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s3 4// Test peephole optimizations5 6// CHECK-LABEL: define i8 @test_trunc(7// CHECK-SAME: i256 %[[arg:.*]])8// CHECK-NEXT: = trunc i256 %[[arg]] to i89// CHECK-NEXT: ret i810func.func @test_trunc(%0 : i256) -> i8 {11 %1 = fir.convert %0 : (i256) -> i12812 %2 = fir.convert %1 : (i128) -> i6413 %3 = fir.convert %2 : (i64) -> i3214 %4 = fir.convert %3 : (i32) -> i1615 %5 = fir.convert %4 : (i16) -> i816 return %5 : i817}18 19// CHECK-LABEL: define i256 @test_sext(20// CHECK-SAME: i8 %[[arg:.*]])21// CHECK-NEXT: = sext i8 %[[arg]] to i25622// CHECK-NEXT: ret i25623func.func @test_sext(%0 : i8) -> i256 {24 %1 = fir.convert %0 : (i8) -> i1625 %2 = fir.convert %1 : (i16) -> i3226 %3 = fir.convert %2 : (i32) -> i6427 %4 = fir.convert %3 : (i64) -> i12828 %5 = fir.convert %4 : (i128) -> i25629 return %5 : i25630}31 32// CHECK-LABEL: define half @test_fptrunc(33// CHECK-SAME: fp128 %[[arg:.*]])34// CHECK-NEXT: %[[res:.*]] = fptrunc fp128 %[[arg]] to half35// CHECK-NEXT: ret half %[[res]]36func.func @test_fptrunc(%0 : f128) -> f16 {37 %2 = fir.convert %0 : (f128) -> f6438 %3 = fir.convert %2 : (f64) -> f3239 %4 = fir.convert %3 : (f32) -> f1640 return %4 : f1641}42 43// CHECK-LABEL: define x86_fp80 @test_fpext(44// CHECK-SAME: bfloat %[[arg:.*]])45// CHECK-NEXT: = fpext bfloat %[[arg]] to x86_fp8046// CHECK-NEXT: ret x86_fp8047func.func @test_fpext(%0 : bf16) -> f80 {48 %2 = fir.convert %0 : (bf16) -> f3249 %3 = fir.convert %2 : (f32) -> f6450 %4 = fir.convert %3 : (f64) -> f8051 return %4 : f8052}53 54// CHECK-LABEL: define i64 @test_ascending(55// CHECK-SAME: i8 %[[arg:.*]])56// CHECK-NEXT: = sext i8 %[[arg]] to i6457// CHECK-NEXT: ret i6458func.func @test_ascending(%0 : i8) -> index {59 %1 = fir.convert %0 : (i8) -> i1660 %2 = fir.convert %1 : (i16) -> i3261 %3 = fir.convert %2 : (i32) -> i6462 %5 = fir.convert %3 : (i64) -> index63 return %5 : index64}65 66// CHECK-LABEL: define i8 @test_descending(67// CHECK-SAME: i64 %[[arg:.*]])68// CHECK-NEXT: = trunc i64 %[[arg]] to i869// CHECK-NEXT: ret i870func.func @test_descending(%0 : index) -> i8 {71 %2 = fir.convert %0 : (index) -> i6472 %3 = fir.convert %2 : (i64) -> i3273 %4 = fir.convert %3 : (i32) -> i1674 %5 = fir.convert %4 : (i16) -> i875 return %5 : i876}77 78// CHECK-LABEL: define float @test_useless(79// CHECK-SAME: float %[[arg:.*]])80// CHECK-NEXT: ret float %[[arg]]81func.func @test_useless(%0 : f32) -> f32 {82 %1 = fir.convert %0 : (f32) -> f3283 return %1 : f3284}85 86// CHECK-LABEL: define float @test_useless_sext(87// CHECK-SAME: i32 %[[arg:.*]])88// CHECK-NEXT: %[[res:.*]] = sitofp i32 %[[arg]] to float89// CHECK-NEXT: ret float %[[res]]90func.func @test_useless_sext(%0 : i32) -> f32 {91 %1 = fir.convert %0 : (i32) -> i6492 %2 = fir.convert %1 : (i64) -> i3293 %3 = fir.convert %2 : (i32) -> f3294 return %3 : f3295}96 97// CHECK-LABEL: define i16 @test_hump(98// CHECK-SAME: i32 %[[arg:.*]])99// CHECK-NEXT: trunc i32 %[[arg]] to i16100// CHECK-NEXT: ret i16101func.func @test_hump(%0 : i32) -> i16 {102 %1 = fir.convert %0 : (i32) -> i64103 %2 = fir.convert %1 : (i64) -> i16104 return %2 : i16105}106 107// CHECK-LABEL: define i16 @test_slump(108// CHECK-SAME: i32 %[[arg:.*]])109// CHECK-NEXT: %[[i:.*]] = trunc i32 %[[arg]] to i8110// CHECK-NEXT: sext i8 %[[i]] to i16111// CHECK-NEXT: ret i16112func.func @test_slump(%0 : i32) -> i16 {113 %1 = fir.convert %0 : (i32) -> i8114 %2 = fir.convert %1 : (i8) -> i16115 return %2 : i16116}117 118// CHECK-LABEL: define i64 @test_slump2(119// CHECK-SAME: i64 %[[arg:.*]])120// CHECK-NEXT: %[[i:.*]] = trunc i64 %[[arg]] to i16121// CHECK-NEXT: sext i16 %[[i]] to i64122// CHECK-NEXT: ret i64123func.func @test_slump2(%0 : index) -> index {124 %1 = fir.convert %0 : (index) -> i16125 %2 = fir.convert %1 : (i16) -> index126 return %2 : index127}128