Skip to content

Commit d125cab

Browse files
[InstCombine] Support multi-use values in cast elimination transforms (#165877)
`canEvaluateTruncated` and `canEvaluateSExtd` previously rejected multi-use values to avoid duplication. This was overly conservative, if all users of a multi-use value are part of the transform, we can evaluate it in a different type without duplication. This change tracks visited values and defers decisions on multi-use values until we verify all their users were visited. `EvaluateInDifferentType` now memoizes multi-use values to avoid creating duplicates. Applied to truncation and sext. Zext unchanged due to its dual-return nature.
1 parent 4877c59 commit d125cab

File tree

8 files changed

+544
-180
lines changed

8 files changed

+544
-180
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp

Lines changed: 314 additions & 78 deletions
Large diffs are not rendered by default.

llvm/test/Transforms/InstCombine/cast-mul-select.ll

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -91,22 +91,18 @@ define i8 @select2(i1 %cond, i8 %x, i8 %y, i8 %z) {
9191

9292
define i32 @eval_trunc_multi_use_in_one_inst(i32 %x) {
9393
; CHECK-LABEL: @eval_trunc_multi_use_in_one_inst(
94-
; CHECK-NEXT: [[Z:%.*]] = zext i32 [[X:%.*]] to i64
95-
; CHECK-NEXT: [[A:%.*]] = add nuw nsw i64 [[Z]], 15
96-
; CHECK-NEXT: [[M:%.*]] = mul i64 [[A]], [[A]]
97-
; CHECK-NEXT: [[T:%.*]] = trunc i64 [[M]] to i32
94+
; CHECK-NEXT: [[A:%.*]] = add i32 [[X:%.*]], 15
95+
; CHECK-NEXT: [[T:%.*]] = mul i32 [[A]], [[A]]
9896
; CHECK-NEXT: ret i32 [[T]]
9997
;
10098
; DBGINFO-LABEL: @eval_trunc_multi_use_in_one_inst(
101-
; DBGINFO-NEXT: [[Z:%.*]] = zext i32 [[X:%.*]] to i64, !dbg [[DBG57:![0-9]+]]
102-
; DBGINFO-NEXT: #dbg_value(i64 [[Z]], [[META52:![0-9]+]], !DIExpression(), [[DBG57]])
103-
; DBGINFO-NEXT: [[A:%.*]] = add nuw nsw i64 [[Z]], 15, !dbg [[DBG58:![0-9]+]]
104-
; DBGINFO-NEXT: #dbg_value(i64 [[A]], [[META54:![0-9]+]], !DIExpression(), [[DBG58]])
105-
; DBGINFO-NEXT: [[M:%.*]] = mul i64 [[A]], [[A]], !dbg [[DBG59:![0-9]+]]
106-
; DBGINFO-NEXT: #dbg_value(i64 [[M]], [[META55:![0-9]+]], !DIExpression(), [[DBG59]])
107-
; DBGINFO-NEXT: [[T:%.*]] = trunc i64 [[M]] to i32, !dbg [[DBG60:![0-9]+]]
108-
; DBGINFO-NEXT: #dbg_value(i32 [[T]], [[META56:![0-9]+]], !DIExpression(), [[DBG60]])
109-
; DBGINFO-NEXT: ret i32 [[T]], !dbg [[DBG61:![0-9]+]]
99+
; DBGINFO-NEXT: #dbg_value(i32 [[X:%.*]], [[META52:![0-9]+]], !DIExpression(DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 64, DW_ATE_unsigned, DW_OP_stack_value), [[META57:![0-9]+]])
100+
; DBGINFO-NEXT: [[A:%.*]] = add i32 [[X]], 15, !dbg [[DBG58:![0-9]+]]
101+
; DBGINFO-NEXT: #dbg_value(i32 [[X]], [[META54:![0-9]+]], !DIExpression(DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 64, DW_ATE_unsigned, DW_OP_plus_uconst, 15, DW_OP_stack_value), [[DBG58]])
102+
; DBGINFO-NEXT: [[M:%.*]] = mul i32 [[A]], [[A]], !dbg [[DBG59:![0-9]+]]
103+
; DBGINFO-NEXT: #dbg_value(!DIArgList(i32 [[X]], i32 [[X]]), [[META55:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 64, DW_ATE_unsigned, DW_OP_plus_uconst, 15, DW_OP_LLVM_arg, 1, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 64, DW_ATE_unsigned, DW_OP_plus_uconst, 15, DW_OP_mul, DW_OP_stack_value), [[DBG59]])
104+
; DBGINFO-NEXT: #dbg_value(i32 [[M]], [[META56:![0-9]+]], !DIExpression(), [[META60:![0-9]+]])
105+
; DBGINFO-NEXT: ret i32 [[M]], !dbg [[DBG61:![0-9]+]]
110106
;
111107
%z = zext i32 %x to i64
112108
%a = add nsw nuw i64 %z, 15
@@ -143,25 +139,21 @@ define i32 @eval_zext_multi_use_in_one_inst(i32 %x) {
143139

144140
define i32 @eval_sext_multi_use_in_one_inst(i32 %x) {
145141
; CHECK-LABEL: @eval_sext_multi_use_in_one_inst(
146-
; CHECK-NEXT: [[T:%.*]] = trunc i32 [[X:%.*]] to i16
147-
; CHECK-NEXT: [[A:%.*]] = and i16 [[T]], 14
148-
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i16 [[A]], [[A]]
149-
; CHECK-NEXT: [[O:%.*]] = or disjoint i16 [[M]], -32768
150-
; CHECK-NEXT: [[R:%.*]] = sext i16 [[O]] to i32
142+
; CHECK-NEXT: [[A:%.*]] = and i32 [[X:%.*]], 14
143+
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[A]], [[A]]
144+
; CHECK-NEXT: [[R:%.*]] = or disjoint i32 [[M]], -32768
151145
; CHECK-NEXT: ret i32 [[R]]
152146
;
153147
; DBGINFO-LABEL: @eval_sext_multi_use_in_one_inst(
154-
; DBGINFO-NEXT: [[T:%.*]] = trunc i32 [[X:%.*]] to i16, !dbg [[DBG81:![0-9]+]]
155-
; DBGINFO-NEXT: #dbg_value(i16 [[T]], [[META76:![0-9]+]], !DIExpression(), [[DBG81]])
156-
; DBGINFO-NEXT: [[A:%.*]] = and i16 [[T]], 14, !dbg [[DBG82:![0-9]+]]
157-
; DBGINFO-NEXT: #dbg_value(i16 [[A]], [[META77:![0-9]+]], !DIExpression(), [[DBG82]])
158-
; DBGINFO-NEXT: [[M:%.*]] = mul nuw nsw i16 [[A]], [[A]], !dbg [[DBG83:![0-9]+]]
159-
; DBGINFO-NEXT: #dbg_value(i16 [[M]], [[META78:![0-9]+]], !DIExpression(), [[DBG83]])
160-
; DBGINFO-NEXT: [[O:%.*]] = or disjoint i16 [[M]], -32768, !dbg [[DBG84:![0-9]+]]
161-
; DBGINFO-NEXT: #dbg_value(i16 [[O]], [[META79:![0-9]+]], !DIExpression(), [[DBG84]])
162-
; DBGINFO-NEXT: [[R:%.*]] = sext i16 [[O]] to i32, !dbg [[DBG85:![0-9]+]]
163-
; DBGINFO-NEXT: #dbg_value(i32 [[R]], [[META80:![0-9]+]], !DIExpression(), [[DBG85]])
164-
; DBGINFO-NEXT: ret i32 [[R]], !dbg [[DBG86:![0-9]+]]
148+
; DBGINFO-NEXT: #dbg_value(i32 [[X:%.*]], [[META76:![0-9]+]], !DIExpression(DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 16, DW_ATE_unsigned, DW_OP_stack_value), [[META81:![0-9]+]])
149+
; DBGINFO-NEXT: [[A:%.*]] = and i32 [[X]], 14, !dbg [[DBG82:![0-9]+]]
150+
; DBGINFO-NEXT: #dbg_value(i32 [[X]], [[META77:![0-9]+]], !DIExpression(DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 16, DW_ATE_unsigned, DW_OP_constu, 14, DW_OP_and, DW_OP_stack_value), [[DBG82]])
151+
; DBGINFO-NEXT: [[M:%.*]] = mul nuw nsw i32 [[A]], [[A]], !dbg [[DBG83:![0-9]+]]
152+
; DBGINFO-NEXT: #dbg_value(!DIArgList(i32 [[X]], i32 [[X]]), [[META78:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 16, DW_ATE_unsigned, DW_OP_constu, 14, DW_OP_and, DW_OP_LLVM_arg, 1, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 16, DW_ATE_unsigned, DW_OP_constu, 14, DW_OP_and, DW_OP_mul, DW_OP_stack_value), [[DBG83]])
153+
; DBGINFO-NEXT: [[O:%.*]] = or disjoint i32 [[M]], -32768, !dbg [[DBG84:![0-9]+]]
154+
; DBGINFO-NEXT: #dbg_value(!DIArgList(i32 [[X]], i32 [[X]]), [[META79:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 16, DW_ATE_unsigned, DW_OP_constu, 14, DW_OP_and, DW_OP_LLVM_arg, 1, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_LLVM_convert, 16, DW_ATE_unsigned, DW_OP_constu, 14, DW_OP_and, DW_OP_mul, DW_OP_constu, 18446744073709518848, DW_OP_or, DW_OP_stack_value), [[DBG84]])
155+
; DBGINFO-NEXT: #dbg_value(i32 [[O]], [[META80:![0-9]+]], !DIExpression(), [[META85:![0-9]+]])
156+
; DBGINFO-NEXT: ret i32 [[O]], !dbg [[DBG86:![0-9]+]]
165157
;
166158
%t = trunc i32 %x to i16
167159
%a = and i16 %t, 14

llvm/test/Transforms/InstCombine/cast.ll

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2238,3 +2238,147 @@ define i32 @test95(i32 %x) {
22382238
%5 = zext i8 %4 to i32
22392239
ret i32 %5
22402240
}
2241+
2242+
define i16 @test96(i16 %x, i16 %y) {
2243+
; ALL-LABEL: @test96(
2244+
; ALL-NEXT: [[A:%.*]] = add i16 [[X:%.*]], [[Y:%.*]]
2245+
; ALL-NEXT: [[B:%.*]] = add i16 [[A]], 5
2246+
; ALL-NEXT: [[C:%.*]] = mul i16 [[A]], 3
2247+
; ALL-NEXT: [[T:%.*]] = or i16 [[B]], [[C]]
2248+
; ALL-NEXT: ret i16 [[T]]
2249+
;
2250+
%zx = zext i16 %x to i32
2251+
%zy = zext i16 %y to i32
2252+
%a = add i32 %zx, %zy
2253+
%b = add i32 %a, 5
2254+
%c = mul i32 %a, 3
2255+
%d = or i32 %b, %c
2256+
%t = trunc i32 %d to i16
2257+
ret i16 %t
2258+
}
2259+
2260+
define i16 @test97(i16 %x, i16 %y) {
2261+
; ALL-LABEL: @test97(
2262+
; ALL-NEXT: [[ZX:%.*]] = zext i16 [[X:%.*]] to i32
2263+
; ALL-NEXT: [[ZY:%.*]] = zext i16 [[Y:%.*]] to i32
2264+
; ALL-NEXT: [[A:%.*]] = add nuw nsw i32 [[ZX]], [[ZY]]
2265+
; ALL-NEXT: [[B:%.*]] = add nuw nsw i32 [[A]], 5
2266+
; ALL-NEXT: [[C:%.*]] = mul nuw nsw i32 [[A]], 3
2267+
; ALL-NEXT: [[D:%.*]] = or i32 [[B]], [[C]]
2268+
; ALL-NEXT: call void @use_i32(i32 [[A]])
2269+
; ALL-NEXT: [[T:%.*]] = trunc i32 [[D]] to i16
2270+
; ALL-NEXT: ret i16 [[T]]
2271+
;
2272+
%zx = zext i16 %x to i32
2273+
%zy = zext i16 %y to i32
2274+
%a = add i32 %zx, %zy
2275+
%b = add i32 %a, 5
2276+
%c = mul i32 %a, 3
2277+
%d = or i32 %b, %c
2278+
call void @use_i32(i32 %a)
2279+
%t = trunc i32 %d to i16
2280+
ret i16 %t
2281+
}
2282+
2283+
; expected not to narrow operations to i16 due to a loop in use chains
2284+
define i16 @test98(i16 %x, i16 %n) {
2285+
; ALL-LABEL: @test98(
2286+
; ALL-NEXT: entry:
2287+
; ALL-NEXT: [[Z:%.*]] = zext i16 [[X:%.*]] to i32
2288+
; ALL-NEXT: br label [[LOOP:%.*]]
2289+
; ALL: loop:
2290+
; ALL-NEXT: [[P:%.*]] = phi i32 [ [[Z]], [[ENTRY:%.*]] ], [ [[A:%.*]], [[LOOP]] ]
2291+
; ALL-NEXT: [[A]] = add i32 [[P]], 1
2292+
; ALL-NEXT: [[T:%.*]] = trunc i32 [[A]] to i16
2293+
; ALL-NEXT: [[COND:%.*]] = icmp ugt i16 [[N:%.*]], [[T]]
2294+
; ALL-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
2295+
; ALL: exit:
2296+
; ALL-NEXT: ret i16 [[T]]
2297+
;
2298+
entry:
2299+
%z = zext i16 %x to i32
2300+
br label %loop
2301+
2302+
loop:
2303+
%p = phi i32 [ %z, %entry ], [ %a, %loop ]
2304+
%a = add i32 %p, 1
2305+
%t = trunc i32 %a to i16
2306+
%cond = icmp ult i16 %t, %n
2307+
br i1 %cond, label %loop, label %exit
2308+
2309+
exit:
2310+
ret i16 %t
2311+
}
2312+
2313+
define i32 @test99(i32 %x, i32 %y) {
2314+
; ALL-LABEL: @test99(
2315+
; ALL-NEXT: [[A:%.*]] = add i32 [[X:%.*]], [[Y:%.*]]
2316+
; ALL-NEXT: [[B:%.*]] = add i32 [[A]], 5
2317+
; ALL-NEXT: [[C:%.*]] = mul i32 [[A]], 3
2318+
; ALL-NEXT: [[D:%.*]] = or i32 [[B]], [[C]]
2319+
; ALL-NEXT: [[SEXT:%.*]] = shl i32 [[D]], 16
2320+
; ALL-NEXT: [[S:%.*]] = ashr exact i32 [[SEXT]], 16
2321+
; ALL-NEXT: ret i32 [[S]]
2322+
;
2323+
%tx = trunc i32 %x to i16
2324+
%ty = trunc i32 %y to i16
2325+
%a = add i16 %tx, %ty
2326+
%b = add i16 %a, 5
2327+
%c = mul i16 %a, 3
2328+
%d = or i16 %b, %c
2329+
%t = sext i16 %d to i32
2330+
ret i32 %t
2331+
}
2332+
2333+
define i32 @test100(i32 %x, i32 %y) {
2334+
; ALL-LABEL: @test100(
2335+
; ALL-NEXT: [[TX:%.*]] = trunc i32 [[X:%.*]] to i8
2336+
; ALL-NEXT: [[TY:%.*]] = trunc i32 [[Y:%.*]] to i8
2337+
; ALL-NEXT: [[A:%.*]] = add i8 [[TX]], [[TY]]
2338+
; ALL-NEXT: [[B:%.*]] = add i8 [[A]], 5
2339+
; ALL-NEXT: [[C:%.*]] = mul i8 [[A]], 3
2340+
; ALL-NEXT: [[D:%.*]] = or i8 [[B]], [[C]]
2341+
; ALL-NEXT: call void @use_i8(i8 [[A]])
2342+
; ALL-NEXT: [[T:%.*]] = sext i8 [[D]] to i32
2343+
; ALL-NEXT: ret i32 [[T]]
2344+
;
2345+
%tx = trunc i32 %x to i8
2346+
%ty = trunc i32 %y to i8
2347+
%a = add i8 %tx, %ty
2348+
%b = add i8 %a, 5
2349+
%c = mul i8 %a, 3
2350+
%d = or i8 %b, %c
2351+
call void @use_i8(i8 %a)
2352+
%t = sext i8 %d to i32
2353+
ret i32 %t
2354+
}
2355+
2356+
; expected not to extend operations to i32 due to a loop in use chains
2357+
define i32 @test101(i32 %x, i8 %n) {
2358+
; ALL-LABEL: @test101(
2359+
; ALL-NEXT: entry:
2360+
; ALL-NEXT: [[T:%.*]] = trunc i32 [[X:%.*]] to i8
2361+
; ALL-NEXT: br label [[LOOP:%.*]]
2362+
; ALL: loop:
2363+
; ALL-NEXT: [[P:%.*]] = phi i8 [ [[T]], [[ENTRY:%.*]] ], [ [[A:%.*]], [[LOOP]] ]
2364+
; ALL-NEXT: [[A]] = add i8 [[P]], 1
2365+
; ALL-NEXT: [[COND:%.*]] = icmp ult i8 [[A]], [[N:%.*]]
2366+
; ALL-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
2367+
; ALL: exit:
2368+
; ALL-NEXT: [[S:%.*]] = sext i8 [[A]] to i32
2369+
; ALL-NEXT: ret i32 [[S]]
2370+
;
2371+
entry:
2372+
%t = trunc i32 %x to i8
2373+
br label %loop
2374+
2375+
loop:
2376+
%p = phi i8 [ %t, %entry ], [ %a, %loop ]
2377+
%a = add i8 %p, 1
2378+
%cond = icmp ult i8 %a, %n
2379+
br i1 %cond, label %loop, label %exit
2380+
2381+
exit:
2382+
%s = sext i8 %a to i32
2383+
ret i32 %s
2384+
}

llvm/test/Transforms/InstCombine/catchswitch-phi.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,17 @@ define void @test1() personality ptr @__gxx_wasm_personality_v0 {
9494
; CHECK-NEXT: [[CALL:%.*]] = invoke i32 @baz()
9595
; CHECK-NEXT: to label [[INVOKE_CONT1:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
9696
; CHECK: invoke.cont1:
97-
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[CALL]], 0
98-
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
97+
; CHECK-NEXT: [[TOBOOL_INIT:%.*]] = icmp ne i32 [[CALL]], 0
98+
; CHECK-NEXT: br i1 [[TOBOOL_INIT]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
9999
; CHECK: if.then:
100100
; CHECK-NEXT: br label [[IF_END]]
101101
; CHECK: if.end:
102-
; CHECK-NEXT: [[AP_0:%.*]] = phi i8 [ 1, [[IF_THEN]] ], [ 0, [[INVOKE_CONT1]] ]
103102
; CHECK-NEXT: invoke void @foo()
104103
; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[CATCH_DISPATCH]]
105104
; CHECK: invoke.cont2:
106105
; CHECK-NEXT: br label [[TRY_CONT:%.*]]
107106
; CHECK: catch.dispatch:
108-
; CHECK-NEXT: [[AP_1:%.*]] = phi i8 [ [[AP_0]], [[IF_END]] ], [ 0, [[INVOKE_CONT]] ]
107+
; CHECK-NEXT: [[AP_1:%.*]] = phi i1 [ [[TOBOOL_INIT]], [[IF_END]] ], [ false, [[INVOKE_CONT]] ]
109108
; CHECK-NEXT: [[TMP0:%.*]] = catchswitch within none [label %catch.start] unwind label [[CATCH_DISPATCH1]]
110109
; CHECK: catch.start:
111110
; CHECK-NEXT: [[TMP1:%.*]] = catchpad within [[TMP0]] [ptr null]
@@ -116,11 +115,10 @@ define void @test1() personality ptr @__gxx_wasm_personality_v0 {
116115
; CHECK-NEXT: invoke void @llvm.wasm.rethrow() #[[ATTR0:[0-9]+]] [ "funclet"(token [[TMP1]]) ]
117116
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CATCH_DISPATCH1]]
118117
; CHECK: catch.dispatch1:
119-
; CHECK-NEXT: [[AP_2:%.*]] = phi i8 [ [[AP_1]], [[CATCH_DISPATCH]] ], [ [[AP_1]], [[RETHROW]] ], [ 0, [[ENTRY:%.*]] ]
118+
; CHECK-NEXT: [[TOBOOL1:%.*]] = phi i1 [ [[AP_1]], [[CATCH_DISPATCH]] ], [ [[AP_1]], [[RETHROW]] ], [ false, [[ENTRY:%.*]] ]
120119
; CHECK-NEXT: [[TMP2:%.*]] = catchswitch within none [label %catch.start1] unwind to caller
121120
; CHECK: catch.start1:
122121
; CHECK-NEXT: [[TMP3:%.*]] = catchpad within [[TMP2]] [ptr null]
123-
; CHECK-NEXT: [[TOBOOL1:%.*]] = trunc i8 [[AP_2]] to i1
124122
; CHECK-NEXT: br i1 [[TOBOOL1]], label [[IF_THEN1:%.*]], label [[IF_END1:%.*]]
125123
; CHECK: if.then1:
126124
; CHECK-NEXT: br label [[IF_END1]]

llvm/test/Transforms/InstCombine/icmp-mul-zext.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,10 @@ define void @PR33765(i8 %beth) {
5757
; CHECK-LABEL: @PR33765(
5858
; CHECK-NEXT: br i1 false, label [[IF_THEN9:%.*]], label [[IF_THEN9]]
5959
; CHECK: if.then9:
60-
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[BETH:%.*]] to i32
61-
; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[CONV]], [[CONV]]
60+
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[BETH:%.*]] to i16
61+
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i16 [[CONV]], [[CONV]]
6262
; CHECK-NEXT: [[TINKY:%.*]] = load i16, ptr @glob, align 2
63-
; CHECK-NEXT: [[TMP1:%.*]] = trunc nuw i32 [[MUL]] to i16
64-
; CHECK-NEXT: [[CONV14:%.*]] = and i16 [[TINKY]], [[TMP1]]
63+
; CHECK-NEXT: [[CONV14:%.*]] = and i16 [[MUL]], [[TINKY]]
6564
; CHECK-NEXT: store i16 [[CONV14]], ptr @glob, align 2
6665
; CHECK-NEXT: ret void
6766
;

0 commit comments

Comments
 (0)