1 // RUN: tco %s | FileCheck %s
2 // RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s
4 // Test peephole optimizations
6 // CHECK-LABEL: define i8 @test_trunc(
7 // CHECK-SAME: i256 %[[arg:.*]])
8 // CHECK-NEXT: = trunc i256 %[[arg]] to i8
10 func.func @test_trunc(%0 : i256) -> i8 {
11 %1 = fir.convert %0 : (i256) -> i128
12 %2 = fir.convert %1 : (i128) -> i64
13 %3 = fir.convert %2 : (i64) -> i32
14 %4 = fir.convert %3 : (i32) -> i16
15 %5 = fir.convert %4 : (i16) -> i8
19 // CHECK-LABEL: define i256 @test_sext(
20 // CHECK-SAME: i8 %[[arg:.*]])
21 // CHECK-NEXT: = sext i8 %[[arg]] to i256
22 // CHECK-NEXT: ret i256
23 func.func @test_sext(%0 : i8) -> i256 {
24 %1 = fir.convert %0 : (i8) -> i16
25 %2 = fir.convert %1 : (i16) -> i32
26 %3 = fir.convert %2 : (i32) -> i64
27 %4 = fir.convert %3 : (i64) -> i128
28 %5 = fir.convert %4 : (i128) -> i256
32 // CHECK-LABEL: define half @test_fptrunc(
33 // CHECK-SAME: fp128 %[[arg:.*]])
34 // CHECK-NEXT: %[[res:.*]] = fptrunc fp128 %[[arg]] to half
35 // CHECK-NEXT: ret half %[[res]]
36 func.func @test_fptrunc(%0 : f128) -> f16 {
37 %2 = fir.convert %0 : (f128) -> f64
38 %3 = fir.convert %2 : (f64) -> f32
39 %4 = fir.convert %3 : (f32) -> f16
43 // CHECK-LABEL: define x86_fp80 @test_fpext(
44 // CHECK-SAME: bfloat %[[arg:.*]])
45 // CHECK-NEXT: = fpext bfloat %[[arg]] to x86_fp80
46 // CHECK-NEXT: ret x86_fp80
47 func.func @test_fpext(%0 : bf16) -> f80 {
48 %2 = fir.convert %0 : (bf16) -> f32
49 %3 = fir.convert %2 : (f32) -> f64
50 %4 = fir.convert %3 : (f64) -> f80
54 // CHECK-LABEL: define i64 @test_ascending(
55 // CHECK-SAME: i8 %[[arg:.*]])
56 // CHECK-NEXT: = sext i8 %[[arg]] to i64
57 // CHECK-NEXT: ret i64
58 func.func @test_ascending(%0 : i8) -> index {
59 %1 = fir.convert %0 : (i8) -> i16
60 %2 = fir.convert %1 : (i16) -> i32
61 %3 = fir.convert %2 : (i32) -> i64
62 %5 = fir.convert %3 : (i64) -> index
66 // CHECK-LABEL: define i8 @test_descending(
67 // CHECK-SAME: i64 %[[arg:.*]])
68 // CHECK-NEXT: = trunc i64 %[[arg]] to i8
70 func.func @test_descending(%0 : index) -> i8 {
71 %2 = fir.convert %0 : (index) -> i64
72 %3 = fir.convert %2 : (i64) -> i32
73 %4 = fir.convert %3 : (i32) -> i16
74 %5 = fir.convert %4 : (i16) -> i8
78 // CHECK-LABEL: define float @test_useless(
79 // CHECK-SAME: float %[[arg:.*]])
80 // CHECK-NEXT: ret float %[[arg]]
81 func.func @test_useless(%0 : f32) -> f32 {
82 %1 = fir.convert %0 : (f32) -> f32
86 // CHECK-LABEL: define float @test_useless_sext(
87 // CHECK-SAME: i32 %[[arg:.*]])
88 // CHECK-NEXT: %[[res:.*]] = sitofp i32 %[[arg]] to float
89 // CHECK-NEXT: ret float %[[res]]
90 func.func @test_useless_sext(%0 : i32) -> f32 {
91 %1 = fir.convert %0 : (i32) -> i64
92 %2 = fir.convert %1 : (i64) -> i32
93 %3 = fir.convert %2 : (i32) -> f32
97 // CHECK-LABEL: define i16 @test_hump(
98 // CHECK-SAME: i32 %[[arg:.*]])
99 // CHECK-NEXT: trunc i32 %[[arg]] to i16
100 // CHECK-NEXT: ret i16
101 func.func @test_hump(%0 : i32) -> i16 {
102 %1 = fir.convert %0 : (i32) -> i64
103 %2 = fir.convert %1 : (i64) -> i16
107 // CHECK-LABEL: define i16 @test_slump(
108 // CHECK-SAME: i32 %[[arg:.*]])
109 // CHECK-NEXT: %[[i:.*]] = trunc i32 %[[arg]] to i8
110 // CHECK-NEXT: sext i8 %[[i]] to i16
111 // CHECK-NEXT: ret i16
112 func.func @test_slump(%0 : i32) -> i16 {
113 %1 = fir.convert %0 : (i32) -> i8
114 %2 = fir.convert %1 : (i8) -> i16
118 // CHECK-LABEL: define i64 @test_slump2(
119 // CHECK-SAME: i64 %[[arg:.*]])
120 // CHECK-NEXT: %[[i:.*]] = trunc i64 %[[arg]] to i16
121 // CHECK-NEXT: sext i16 %[[i]] to i64
122 // CHECK-NEXT: ret i64
123 func.func @test_slump2(%0 : index) -> index {
124 %1 = fir.convert %0 : (index) -> i16
125 %2 = fir.convert %1 : (i16) -> index