1
1
// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
2
2
// RUN: FileCheck --input-file=%t.cir %s
3
+ // RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir-flat %s -o %t.cir.flat
4
+ // RUN: FileCheck --check-prefix=FLAT --input-file=%t.cir.flat %s
5
+ // RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -o - %s \
6
+ // RUN: | opt -S -passes=instcombine,mem2reg,simplifycfg -o %t.ll
7
+ // RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s
3
8
4
9
int go (int const & val);
5
10
@@ -18,3 +23,31 @@ int go1() {
18
23
// CHECK-NEXT: cir.yield %[[#RValTmp]] : !s32i
19
24
// CHECK-NEXT: }
20
25
// CHECK-NEXT: cir.store %[[#RVal]], %[[#XAddr]] : !s32i, !cir.ptr<!s32i>
26
+
27
+ // FLAT: cir.func @_Z3go1v() -> !s32i
28
+ // FLAT: %[[#TmpAddr:]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["ref.tmp0", init] {alignment = 4 : i64}
29
+ // FLAT: %[[#XAddr:]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
30
+ // FLAT: cir.br ^[[before_body:.*]]{{ loc.*}}
31
+ // FLAT-NEXT: ^[[before_body]]: // pred: ^bb0
32
+ // FLAT-NEXT: %[[#One:]] = cir.const #cir.int<1> : !s32i
33
+ // FLAT-NEXT: cir.store %[[#One]], %[[#TmpAddr]] : !s32i, !cir.ptr<!s32i>
34
+ // FLAT-NEXT: %[[#RValTmp:]] = cir.call @_Z2goRKi(%[[#TmpAddr]]) : (!cir.ptr<!s32i>) -> !s32i
35
+ // FLAT-NEXT: cir.br ^[[continue_block:.*]](%[[#RValTmp]] : !s32i) {{loc.*}}
36
+ // FLAT-NEXT: ^[[continue_block]](%[[#BlkArgRval:]]: !s32i {{loc.*}}): // pred: ^[[before_body]]
37
+ // FLAT-NEXT: cir.store %[[#BlkArgRval]], %[[#XAddr]] : !s32i, !cir.ptr<!s32i>
38
+
39
+ // LLVM-LABEL: @_Z3go1v()
40
+ // LLVM-NEXT: %[[#TmpAddr:]] = alloca i32, i64 1, align 4
41
+ // LLVM: br label %[[before_body:[0-9]+]]
42
+ // LLVM: [[before_body]]:
43
+ // LLVM-NEXT: store i32 1, ptr %[[#TmpAddr]], align 4
44
+ // LLVM-NEXT: %[[#RValTmp:]] = call i32 @_Z2goRKi(ptr %[[#TmpAddr]])
45
+ // LLVM-NEXT: br label %[[continue_block:[0-9]+]]
46
+
47
+ // LLVM: [[continue_block]]:
48
+ // LLVM-NEXT: [[PHI:%.*]] = phi i32 [ %[[#RValTmp]], %[[before_body]] ]
49
+ // LLVM: store i32 [[PHI]], ptr [[TMP0:%.*]], align 4
50
+ // LLVM: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
51
+ // LLVM: store i32 [[TMP1]], ptr [[TMP2:%.*]], align 4
52
+ // LLVM: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
53
+ // LLVM: ret i32 [[TMP3]]
0 commit comments