@@ -36,27 +36,13 @@ int f1(int n, ...) {
36
36
// AFTER: [[CMP0:%.*]] = cir.cmp(ge, [[GR_OFFS]], [[ZERO]]) : !s32i, !cir.bool
37
37
// AFTER-NEXT: cir.brcond [[CMP0]] [[BB_ON_STACK:\^bb.*]], [[BB_MAY_REG:\^bb.*]]
38
38
39
- // This BB is where different path converges. BLK_ARG is the arg addr which
40
- // could come from IN_REG block where arg is passed in register, and saved in callee
41
- // stack's argument saving area.
42
- // Or from ON_STACK block which means arg is passed in from caller's stack area.
43
- // AFTER-NEXT: [[BB_END:\^bb.*]]([[BLK_ARG:%.*]]: !cir.ptr<!void>): // 2 preds: [[BB_IN_REG:\^bb.*]], [[BB_ON_STACK]]
44
- // AFTER-NEXT: [[TMP0:%.*]] = cir.cast(bitcast, [[BLK_ARG]] : !cir.ptr<!void>), !cir.ptr<!s32i>
45
- // AFTER-NEXT: [[TMP1:%.*]] = cir.load [[TMP0]] : !cir.ptr<!s32i>, !s32i
46
- // AFTER: cir.store [[TMP1]], [[RESP]] : !s32i, !cir.ptr<!s32i>
47
- // AFTER: cir.va.end [[VARLIST]] : !cir.ptr<!ty_22__va_list22>
48
- // AFTER: [[RES:%.*]] = cir.load [[RESP]] : !cir.ptr<!s32i>, !s32i
49
- // AFTER: cir.store [[RES]], [[RETP]] : !s32i, !cir.ptr<!s32i>
50
- // AFTER: [[RETV:%.*]] = cir.load [[RETP]] : !cir.ptr<!s32i>, !s32i
51
- // AFTER: cir.return [[RETV]] : !s32i
52
-
53
39
// This BB calculates to see if it is possible to pass arg in register.
54
40
// AFTER: [[BB_MAY_REG]]:
55
41
// AFTER-NEXT: [[EIGHT:%.*]] = cir.const #cir.int<8> : !s32i
56
42
// AFTER-NEXT: [[NEW_REG_OFFS:%.*]] = cir.binop(add, [[GR_OFFS]], [[EIGHT]]) : !s32i
57
43
// AFTER-NEXT: cir.store [[NEW_REG_OFFS]], [[GR_OFFS_P]] : !s32i, !cir.ptr<!s32i>
58
44
// AFTER-NEXT: [[CMP1:%.*]] = cir.cmp(le, [[NEW_REG_OFFS]], [[ZERO]]) : !s32i, !cir.bool
59
- // AFTER-NEXT: cir.brcond [[CMP1]] [[BB_IN_REG]], [[BB_ON_STACK]]
45
+ // AFTER-NEXT: cir.brcond [[CMP1]] [[BB_IN_REG:\^bb.* ]], [[BB_ON_STACK]]
60
46
61
47
// arg is passed in register.
62
48
// AFTER: [[BB_IN_REG]]:
@@ -65,7 +51,7 @@ int f1(int n, ...) {
65
51
// AFTER-NEXT: [[TMP2:%.*]] = cir.cast(bitcast, [[GR_TOP]] : !cir.ptr<!void>), !cir.ptr<i8>
66
52
// AFTER-NEXT: [[TMP3:%.*]] = cir.ptr_stride([[TMP2]] : !cir.ptr<i8>, [[GR_OFFS]] : !s32i), !cir.ptr<i8>
67
53
// AFTER-NEXT: [[IN_REG_OUTPUT:%.*]] = cir.cast(bitcast, [[TMP3]] : !cir.ptr<i8>), !cir.ptr<!void>
68
- // AFTER-NEXT: cir.br [[BB_END]]([[IN_REG_OUTPUT]] : !cir.ptr<!void>)
54
+ // AFTER-NEXT: cir.br [[BB_END:\^bb.* ]]([[IN_REG_OUTPUT]] : !cir.ptr<!void>)
69
55
70
56
// arg is passed in stack.
71
57
// AFTER: [[BB_ON_STACK]]:
@@ -78,6 +64,20 @@ int f1(int n, ...) {
78
64
// AFTER-NEXT: cir.store [[NEW_STACK_V]], [[STACK_P]] : !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>
79
65
// AFTER-NEXT: cir.br [[BB_END]]([[STACK_V]] : !cir.ptr<!void>)
80
66
67
+ // This BB is where different path converges. BLK_ARG is the arg addr which
68
+ // could come from IN_REG block where arg is passed in register, and saved in callee
69
+ // stack's argument saving area.
70
+ // Or from ON_STACK block which means arg is passed in from caller's stack area.
71
+ // AFTER-NEXT: [[BB_END]]([[BLK_ARG:%.*]]: !cir.ptr<!void>): // 2 preds: [[BB_IN_REG]], [[BB_ON_STACK]]
72
+ // AFTER-NEXT: [[TMP0:%.*]] = cir.cast(bitcast, [[BLK_ARG]] : !cir.ptr<!void>), !cir.ptr<!s32i>
73
+ // AFTER-NEXT: [[TMP1:%.*]] = cir.load [[TMP0]] : !cir.ptr<!s32i>, !s32i
74
+ // AFTER: cir.store [[TMP1]], [[RESP]] : !s32i, !cir.ptr<!s32i>
75
+ // AFTER: cir.va.end [[VARLIST]] : !cir.ptr<!ty_22__va_list22>
76
+ // AFTER: [[RES:%.*]] = cir.load [[RESP]] : !cir.ptr<!s32i>, !s32i
77
+ // AFTER: cir.store [[RES]], [[RETP]] : !s32i, !cir.ptr<!s32i>
78
+ // AFTER: [[RETV:%.*]] = cir.load [[RETP]] : !cir.ptr<!s32i>, !s32i
79
+ // AFTER: cir.return [[RETV]] : !s32i
80
+
81
81
// LLVM: %struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
82
82
// LLVM: define i32 @f1(i32 %0, ...)
83
83
// LLVM: [[ARGN:%.*]] = alloca i32, i64 1, align 4,
@@ -89,32 +89,32 @@ int f1(int n, ...) {
89
89
// LLVM-NEXT: [[CMP0:%.*]] = icmp sge i32 [[GR_OFFS]], 0,
90
90
// LLVM-NEXT: br i1 [[CMP0]], label %[[BB_ON_STACK:.*]], label %[[BB_MAY_REG:.*]],
91
91
92
- // LLVM: [[BB_END:.*]]: ; preds = %[[BB_ON_STACK]], %[[BB_IN_REG:.*]]
93
- // LLVM-NEXT: [[PHIP:%.*]] = phi ptr [ [[IN_REG_OUTPUT:%.*]], %[[BB_IN_REG]] ], [ [[STACK_V:%.*]], %[[BB_ON_STACK]] ]
94
- // LLVM-NEXT: [[PHIV:%.*]] = load i32, ptr [[PHIP]], align 4,
95
- // LLVM-NEXT: store i32 [[PHIV]], ptr [[RESP]], align 4,
96
- // LLVM: call void @llvm.va_end.p0(ptr [[VARLIST]]),
97
- // LLVM: [[RES:%.*]] = load i32, ptr [[RESP]], align 4,
98
- // LLVM: store i32 [[RES]], ptr [[RETP]], align 4,
99
- // LLVM: [[RETV:%.*]] = load i32, ptr [[RETP]], align 4,
100
- // LLVM-NEXT: ret i32 [[RETV]],
101
-
102
92
// LLVM: [[BB_MAY_REG]]: ;
103
93
// LLVM: [[NEW_REG_OFFS:%.*]] = add i32 [[GR_OFFS]], 8,
104
94
// LLVM: store i32 [[NEW_REG_OFFS]], ptr [[GR_OFFS_P]], align 4,
105
95
// LLVM-NEXT: [[CMP1:%.*]] = icmp sle i32 [[NEW_REG_OFFS]], 0,
106
- // LLVM-NEXT: br i1 [[CMP1]], label %[[BB_IN_REG]], label %[[BB_ON_STACK]],
96
+ // LLVM-NEXT: br i1 [[CMP1]], label %[[BB_IN_REG:.* ]], label %[[BB_ON_STACK]],
107
97
108
98
// LLVM: [[BB_IN_REG]]: ;
109
99
// LLVM-NEXT: [[GR_TOP_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 1,
110
100
// LLVM-NEXT: [[GR_TOP:%.*]] = load ptr, ptr [[GR_TOP_P]], align 8,
111
101
// LLVM-NEXT: [[EXT64_GR_OFFS:%.*]] = sext i32 [[GR_OFFS]] to i64,
112
- // LLVM-NEXT: [[IN_REG_OUTPUT]] = getelementptr i8, ptr [[GR_TOP]], i64 [[EXT64_GR_OFFS]],
113
- // LLVM-NEXT: br label %[[BB_END]],
102
+ // LLVM-NEXT: [[IN_REG_OUTPUT:%.* ]] = getelementptr i8, ptr [[GR_TOP]], i64 [[EXT64_GR_OFFS]],
103
+ // LLVM-NEXT: br label %[[BB_END:.* ]],
114
104
115
105
// LLVM: [[BB_ON_STACK]]: ;
116
106
// LLVM-NEXT: [[STACK_P:%.*]] = getelementptr %struct.__va_list, ptr [[VARLIST]], i32 0, i32 0,
117
- // LLVM-NEXT: [[STACK_V]] = load ptr, ptr [[STACK_P]], align 8,
107
+ // LLVM-NEXT: [[STACK_V:%.* ]] = load ptr, ptr [[STACK_P]], align 8,
118
108
// LLVM-NEXT: [[NEW_STACK_V:%.*]] = getelementptr i8, ptr [[STACK_V]], i32 8,
119
109
// LLVM-NEXT: store ptr [[NEW_STACK_V]], ptr [[STACK_P]], align 8,
120
110
// LLVM-NEXT: br label %[[BB_END]],
111
+
112
+ // LLVM: [[BB_END]]: ; preds = %[[BB_ON_STACK]], %[[BB_IN_REG]]
113
+ // LLVM-NEXT: [[PHIP:%.*]] = phi ptr [ [[IN_REG_OUTPUT]], %[[BB_IN_REG]] ], [ [[STACK_V]], %[[BB_ON_STACK]] ]
114
+ // LLVM-NEXT: [[PHIV:%.*]] = load i32, ptr [[PHIP]], align 4,
115
+ // LLVM-NEXT: store i32 [[PHIV]], ptr [[RESP]], align 4,
116
+ // LLVM: call void @llvm.va_end.p0(ptr [[VARLIST]]),
117
+ // LLVM: [[RES:%.*]] = load i32, ptr [[RESP]], align 4,
118
+ // LLVM: store i32 [[RES]], ptr [[RETP]], align 4,
119
+ // LLVM: [[RETV:%.*]] = load i32, ptr [[RETP]], align 4,
120
+ // LLVM-NEXT: ret i32 [[RETV]],
0 commit comments