Skip to content

Commit 41590bf

Browse files
committed
[InstCombine] Add select freeze poison store tests [NFC] (llvm#129775)
1 parent da55483 commit 41590bf

File tree

1 file changed

+257
-15
lines changed

1 file changed

+257
-15
lines changed

llvm/test/Transforms/InstCombine/select.ll

Lines changed: 257 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,8 +1047,8 @@ define i32 @test78(i1 %flag, ptr %x, ptr %y, ptr %z) {
10471047
; CHECK-NEXT: store i32 0, ptr [[X:%.*]], align 4
10481048
; CHECK-NEXT: store i32 0, ptr [[Y:%.*]], align 4
10491049
; CHECK-NEXT: store i32 42, ptr [[Z:%.*]], align 4
1050-
; CHECK-NEXT: [[X_VAL:%.*]] = load i32, ptr [[X]], align 4
1051-
; CHECK-NEXT: [[Y_VAL:%.*]] = load i32, ptr [[Y]], align 4
1050+
; CHECK-NEXT: [[X_VAL:%.*]] = load i32, ptr [[X]], align 4, !freeze_bits [[META0:![0-9]+]]
1051+
; CHECK-NEXT: [[Y_VAL:%.*]] = load i32, ptr [[Y]], align 4, !freeze_bits [[META0]]
10521052
; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], i32 [[X_VAL]], i32 [[Y_VAL]]
10531053
; CHECK-NEXT: ret i32 [[V]]
10541054
;
@@ -1066,8 +1066,8 @@ entry:
10661066
; fold the load completely away.
10671067
define i32 @test78_deref(i1 %flag, ptr dereferenceable(4) align 4 %x, ptr dereferenceable(4) align 4 %y, ptr %z) nofree nosync {
10681068
; CHECK-LABEL: @test78_deref(
1069-
; CHECK-NEXT: [[X_VAL:%.*]] = load i32, ptr [[X:%.*]], align 4
1070-
; CHECK-NEXT: [[Y_VAL:%.*]] = load i32, ptr [[Y:%.*]], align 4
1069+
; CHECK-NEXT: [[X_VAL:%.*]] = load i32, ptr [[X:%.*]], align 4, !freeze_bits [[META0]]
1070+
; CHECK-NEXT: [[Y_VAL:%.*]] = load i32, ptr [[Y:%.*]], align 4, !freeze_bits [[META0]]
10711071
; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], i32 [[X_VAL]], i32 [[Y_VAL]]
10721072
; CHECK-NEXT: ret i32 [[V]]
10731073
;
@@ -1116,8 +1116,8 @@ define float @test79(i1 %flag, ptr %x, ptr %y, ptr %z) {
11161116
; CHECK-NEXT: store i32 0, ptr [[X:%.*]], align 4
11171117
; CHECK-NEXT: store i32 0, ptr [[Y:%.*]], align 4
11181118
; CHECK-NEXT: store i32 42, ptr [[Z:%.*]], align 4
1119-
; CHECK-NEXT: [[X_VAL:%.*]] = load float, ptr [[X]], align 4
1120-
; CHECK-NEXT: [[Y_VAL:%.*]] = load float, ptr [[Y]], align 4
1119+
; CHECK-NEXT: [[X_VAL:%.*]] = load float, ptr [[X]], align 4, !freeze_bits [[META0]]
1120+
; CHECK-NEXT: [[Y_VAL:%.*]] = load float, ptr [[Y]], align 4, !freeze_bits [[META0]]
11211121
; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], float [[X_VAL]], float [[Y_VAL]]
11221122
; CHECK-NEXT: ret float [[V]]
11231123
;
@@ -1138,7 +1138,7 @@ define i32 @test80(i1 %flag) {
11381138
; CHECK-NEXT: [[Y:%.*]] = alloca i32, align 4
11391139
; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[X]])
11401140
; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[Y]])
1141-
; CHECK-NEXT: [[T:%.*]] = load i32, ptr [[X]], align 4
1141+
; CHECK-NEXT: [[T:%.*]] = load i32, ptr [[X]], align 4, !freeze_bits [[META0]]
11421142
; CHECK-NEXT: store i32 [[T]], ptr [[Y]], align 4
11431143
; CHECK-NEXT: ret i32 [[T]]
11441144
;
@@ -1161,7 +1161,7 @@ define float @test81(i1 %flag) {
11611161
; CHECK-NEXT: [[Y:%.*]] = alloca i32, align 4
11621162
; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[X]])
11631163
; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[Y]])
1164-
; CHECK-NEXT: [[T:%.*]] = load i32, ptr [[X]], align 4
1164+
; CHECK-NEXT: [[T:%.*]] = load i32, ptr [[X]], align 4, !freeze_bits [[META0]]
11651165
; CHECK-NEXT: store i32 [[T]], ptr [[Y]], align 4
11661166
; CHECK-NEXT: [[V:%.*]] = bitcast i32 [[T]] to float
11671167
; CHECK-NEXT: ret float [[V]]
@@ -1185,7 +1185,7 @@ define i32 @test82(i1 %flag) {
11851185
; CHECK-NEXT: [[Y:%.*]] = alloca i32, align 4
11861186
; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[X]])
11871187
; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[Y]])
1188-
; CHECK-NEXT: [[T:%.*]] = load float, ptr [[X]], align 4
1188+
; CHECK-NEXT: [[T:%.*]] = load float, ptr [[X]], align 4, !freeze_bits [[META0]]
11891189
; CHECK-NEXT: store float [[T]], ptr [[Y]], align 4
11901190
; CHECK-NEXT: [[V:%.*]] = bitcast float [[T]] to i32
11911191
; CHECK-NEXT: ret i32 [[V]]
@@ -1212,7 +1212,7 @@ define ptr @test83(i1 %flag) {
12121212
; CHECK-NEXT: [[Y:%.*]] = alloca i64, align 8
12131213
; CHECK-NEXT: call void @scribble_on_i64(ptr nonnull [[X]])
12141214
; CHECK-NEXT: call void @scribble_on_i64(ptr nonnull [[Y]])
1215-
; CHECK-NEXT: [[T:%.*]] = load i64, ptr [[X]], align 4
1215+
; CHECK-NEXT: [[T:%.*]] = load i64, ptr [[X]], align 4, !freeze_bits [[META0]]
12161216
; CHECK-NEXT: store i64 [[T]], ptr [[Y]], align 4
12171217
; CHECK-NEXT: [[V:%.*]] = inttoptr i64 [[T]] to ptr
12181218
; CHECK-NEXT: ret ptr [[V]]
@@ -1236,7 +1236,7 @@ define i64 @test84(i1 %flag) {
12361236
; CHECK-NEXT: [[Y:%.*]] = alloca i64, align 8
12371237
; CHECK-NEXT: call void @scribble_on_i64(ptr nonnull [[X]])
12381238
; CHECK-NEXT: call void @scribble_on_i64(ptr nonnull [[Y]])
1239-
; CHECK-NEXT: [[T:%.*]] = load ptr, ptr [[X]], align 8
1239+
; CHECK-NEXT: [[T:%.*]] = load ptr, ptr [[X]], align 8, !freeze_bits [[META0]]
12401240
; CHECK-NEXT: store ptr [[T]], ptr [[Y]], align 8
12411241
; CHECK-NEXT: [[V:%.*]] = ptrtoint ptr [[T]] to i64
12421242
; CHECK-NEXT: ret i64 [[V]]
@@ -1263,8 +1263,8 @@ define ptr @test85(i1 %flag) {
12631263
; CHECK-NEXT: call void @scribble_on_i128(ptr nonnull [[Y]])
12641264
; CHECK-NEXT: [[T:%.*]] = load i128, ptr [[X]], align 4
12651265
; CHECK-NEXT: store i128 [[T]], ptr [[Y]], align 4
1266-
; CHECK-NEXT: [[X_VAL:%.*]] = load ptr, ptr [[X]], align 8
1267-
; CHECK-NEXT: [[Y_VAL:%.*]] = load ptr, ptr [[Y]], align 8
1266+
; CHECK-NEXT: [[X_VAL:%.*]] = load ptr, ptr [[X]], align 8, !freeze_bits [[META0]]
1267+
; CHECK-NEXT: [[Y_VAL:%.*]] = load ptr, ptr [[Y]], align 8, !freeze_bits [[META0]]
12681268
; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], ptr [[X_VAL]], ptr [[Y_VAL]]
12691269
; CHECK-NEXT: ret ptr [[V]]
12701270
;
@@ -1290,8 +1290,8 @@ define i128 @test86(i1 %flag) {
12901290
; CHECK-NEXT: call void @scribble_on_i128(ptr nonnull [[Y]])
12911291
; CHECK-NEXT: [[T:%.*]] = load ptr, ptr [[X]], align 8
12921292
; CHECK-NEXT: store ptr [[T]], ptr [[Y]], align 8
1293-
; CHECK-NEXT: [[X_VAL:%.*]] = load i128, ptr [[X]], align 4
1294-
; CHECK-NEXT: [[Y_VAL:%.*]] = load i128, ptr [[Y]], align 4
1293+
; CHECK-NEXT: [[X_VAL:%.*]] = load i128, ptr [[X]], align 4, !freeze_bits [[META0]]
1294+
; CHECK-NEXT: [[Y_VAL:%.*]] = load i128, ptr [[Y]], align 4, !freeze_bits [[META0]]
12951295
; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], i128 [[X_VAL]], i128 [[Y_VAL]]
12961296
; CHECK-NEXT: ret i128 [[V]]
12971297
;
@@ -4676,3 +4676,245 @@ define i8 @test_replace_freeze_oneuse(i1 %x, i8 %y) {
46764676
%sel = select i1 %x, i8 0, i8 %shl.fr
46774677
ret i8 %sel
46784678
}
4679+
4680+
define i8 @select_knownbits_simplify(i8 noundef %x) {
4681+
; CHECK-LABEL: @select_knownbits_simplify(
4682+
; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X:%.*]], 1
4683+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X_LO]], 0
4684+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -2
4685+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 [[AND]], i8 0
4686+
; CHECK-NEXT: ret i8 [[RES]]
4687+
;
4688+
%x.lo = and i8 %x, 1
4689+
%cmp = icmp eq i8 %x.lo, 0
4690+
%and = and i8 %x, -2
4691+
%res = select i1 %cmp, i8 %and, i8 0
4692+
ret i8 %res
4693+
}
4694+
4695+
define i8 @select_knownbits_simplify_nested(i8 noundef %x) {
4696+
; CHECK-LABEL: @select_knownbits_simplify_nested(
4697+
; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X:%.*]], 1
4698+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X_LO]], 0
4699+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -2
4700+
; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[AND]], [[AND]]
4701+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 0
4702+
; CHECK-NEXT: ret i8 [[RES]]
4703+
;
4704+
%x.lo = and i8 %x, 1
4705+
%cmp = icmp eq i8 %x.lo, 0
4706+
%and = and i8 %x, -2
4707+
%mul = mul i8 %and, %and
4708+
%res = select i1 %cmp, i8 %mul, i8 0
4709+
ret i8 %res
4710+
}
4711+
4712+
define i8 @select_knownbits_simplify_missing_noundef(i8 %x) {
4713+
; CHECK-LABEL: @select_knownbits_simplify_missing_noundef(
4714+
; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X:%.*]], 1
4715+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X_LO]], 0
4716+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -2
4717+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 [[AND]], i8 0
4718+
; CHECK-NEXT: ret i8 [[RES]]
4719+
;
4720+
%x.lo = and i8 %x, 1
4721+
%cmp = icmp eq i8 %x.lo, 0
4722+
%and = and i8 %x, -2
4723+
%res = select i1 %cmp, i8 %and, i8 0
4724+
ret i8 %res
4725+
}
4726+
4727+
@g_ext = external global i8
4728+
4729+
; Make sure we don't replace %ptr with @g_ext, which may cause the load to trigger UB.
4730+
define i32 @pr99436(ptr align 4 dereferenceable(4) %ptr) {
4731+
; CHECK-LABEL: @pr99436(
4732+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[PTR:%.*]], @g_ext
4733+
; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr @g_ext, align 4
4734+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0
4735+
; CHECK-NEXT: ret i32 [[RET]]
4736+
;
4737+
%cmp = icmp eq ptr %ptr, @g_ext
4738+
%val = load i32, ptr %ptr, align 4
4739+
%ret = select i1 %cmp, i32 %val, i32 0
4740+
ret i32 %ret
4741+
}
4742+
4743+
define i8 @sel_trunc_simplify(i1 %c, i8 %x, i16 %y) {
4744+
; CHECK-LABEL: @sel_trunc_simplify(
4745+
; CHECK-NEXT: [[X_EXT:%.*]] = zext i8 [[X:%.*]] to i16
4746+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i16 [[X_EXT]], i16 [[Y:%.*]]
4747+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i16 [[SEL]] to i8
4748+
; CHECK-NEXT: ret i8 [[TRUNC]]
4749+
;
4750+
%x.ext = zext i8 %x to i16
4751+
%sel = select i1 %c, i16 %x.ext, i16 %y
4752+
%trunc = trunc i16 %sel to i8
4753+
ret i8 %trunc
4754+
}
4755+
4756+
define i32 @sel_umin_simplify(i1 %c, i32 %x, i16 %y) {
4757+
; CHECK-LABEL: @sel_umin_simplify(
4758+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 [[X:%.*]], i32 0
4759+
; CHECK-NEXT: [[Y_EXT:%.*]] = zext i16 [[Y:%.*]] to i32
4760+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.umin.i32(i32 [[SEL]], i32 [[Y_EXT]])
4761+
; CHECK-NEXT: ret i32 [[RES]]
4762+
;
4763+
%sel = select i1 %c, i32 %x, i32 0
4764+
%y.ext = zext i16 %y to i32
4765+
%res = call i32 @llvm.umin.i32(i32 %sel, i32 %y.ext)
4766+
ret i32 %res
4767+
}
4768+
4769+
define i32 @sel_extractvalue_simplify(i1 %c, { i32, i32 } %agg1, i32 %x, i32 %y) {
4770+
; CHECK-LABEL: @sel_extractvalue_simplify(
4771+
; CHECK-NEXT: [[AGG2_0:%.*]] = insertvalue { i32, i32 } poison, i32 [[X:%.*]], 0
4772+
; CHECK-NEXT: [[AGG2_1:%.*]] = insertvalue { i32, i32 } [[AGG2_0]], i32 [[Y:%.*]], 1
4773+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], { i32, i32 } [[AGG1:%.*]], { i32, i32 } [[AGG2_1]]
4774+
; CHECK-NEXT: [[RES:%.*]] = extractvalue { i32, i32 } [[SEL]], 1
4775+
; CHECK-NEXT: ret i32 [[RES]]
4776+
;
4777+
%agg2.0 = insertvalue { i32, i32 } poison, i32 %x, 0
4778+
%agg2.1 = insertvalue { i32, i32 } %agg2.0, i32 %y, 1
4779+
%sel = select i1 %c, { i32, i32 } %agg1, { i32, i32 } %agg2.1
4780+
%res = extractvalue { i32, i32 } %sel, 1
4781+
ret i32 %res
4782+
}
4783+
4784+
define i1 @replace_select_cond_true(i1 %cond, i32 %v1, i32 %v2, i32 %v3) {
4785+
; CHECK-LABEL: @replace_select_cond_true(
4786+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 [[V1:%.*]], i32 [[V3:%.*]]
4787+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SEL]], [[V2:%.*]]
4788+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[COND]], i1 [[CMP]], i1 false
4789+
; CHECK-NEXT: ret i1 [[AND]]
4790+
;
4791+
%sel = select i1 %cond, i32 %v1, i32 %v3
4792+
%cmp = icmp eq i32 %sel, %v2
4793+
%and = select i1 %cond, i1 %cmp, i1 false
4794+
ret i1 %and
4795+
}
4796+
4797+
define i1 @replace_select_cond_false(i1 %cond, i32 %v1, i32 %v2, i32 %v3) {
4798+
; CHECK-LABEL: @replace_select_cond_false(
4799+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 [[V1:%.*]], i32 [[V3:%.*]]
4800+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SEL]], [[V2:%.*]]
4801+
; CHECK-NEXT: [[OR:%.*]] = select i1 [[COND]], i1 true, i1 [[CMP]]
4802+
; CHECK-NEXT: ret i1 [[OR]]
4803+
;
4804+
%sel = select i1 %cond, i32 %v1, i32 %v3
4805+
%cmp = icmp eq i32 %sel, %v2
4806+
%or = select i1 %cond, i1 true, i1 %cmp
4807+
ret i1 %or
4808+
}
4809+
4810+
define i32 @replace_and_cond(i1 %cond1, i1 %cond2) {
4811+
; CHECK-LABEL: @replace_and_cond(
4812+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1:%.*]], [[COND2:%.*]]
4813+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND]], i32 3, i32 2
4814+
; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1
4815+
; CHECK-NEXT: ret i32 [[MUX]]
4816+
;
4817+
%and = and i1 %cond1, %cond2
4818+
%sel = select i1 %and, i32 3, i32 2
4819+
%mux = select i1 %cond1, i32 %sel, i32 1
4820+
ret i32 %mux
4821+
}
4822+
4823+
define <2 x i32> @replace_and_cond_vec(<2 x i1> %cond1, <2 x i1> %cond2) {
4824+
; CHECK-LABEL: @replace_and_cond_vec(
4825+
; CHECK-NEXT: [[AND:%.*]] = and <2 x i1> [[COND1:%.*]], [[COND2:%.*]]
4826+
; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[AND]], <2 x i32> <i32 3, i32 3>, <2 x i32> <i32 2, i32 2>
4827+
; CHECK-NEXT: [[MUX:%.*]] = select <2 x i1> [[COND1]], <2 x i32> [[SEL]], <2 x i32> <i32 1, i32 1>
4828+
; CHECK-NEXT: ret <2 x i32> [[MUX]]
4829+
;
4830+
%and = and <2 x i1> %cond1, %cond2
4831+
%sel = select <2 x i1> %and, <2 x i32> splat(i32 3), <2 x i32> splat(i32 2)
4832+
%mux = select <2 x i1> %cond1, <2 x i32> %sel, <2 x i32> splat(i32 1)
4833+
ret <2 x i32> %mux
4834+
}
4835+
4836+
; TODO: We can still replace the use of %and with %cond2
4837+
define i32 @replace_and_cond_multiuse1(i1 %cond1, i1 %cond2) {
4838+
; CHECK-LABEL: @replace_and_cond_multiuse1(
4839+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1:%.*]], [[COND2:%.*]]
4840+
; CHECK-NEXT: call void @use(i1 [[AND]])
4841+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND]], i32 3, i32 2
4842+
; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1
4843+
; CHECK-NEXT: ret i32 [[MUX]]
4844+
;
4845+
%and = and i1 %cond1, %cond2
4846+
call void @use(i1 %and)
4847+
%sel = select i1 %and, i32 3, i32 2
4848+
%mux = select i1 %cond1, i32 %sel, i32 1
4849+
ret i32 %mux
4850+
}
4851+
4852+
define i32 @replace_and_cond_multiuse2(i1 %cond1, i1 %cond2) {
4853+
; CHECK-LABEL: @replace_and_cond_multiuse2(
4854+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1:%.*]], [[COND2:%.*]]
4855+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND]], i32 3, i32 2
4856+
; CHECK-NEXT: call void @use32(i32 [[SEL]])
4857+
; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1
4858+
; CHECK-NEXT: ret i32 [[MUX]]
4859+
;
4860+
%and = and i1 %cond1, %cond2
4861+
%sel = select i1 %and, i32 3, i32 2
4862+
call void @use32(i32 %sel)
4863+
%mux = select i1 %cond1, i32 %sel, i32 1
4864+
ret i32 %mux
4865+
}
4866+
4867+
define i32 @src_simplify_2x_at_once_and(i32 %x, i32 %y) {
4868+
; CHECK-LABEL: @src_simplify_2x_at_once_and(
4869+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]]
4870+
; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], -1
4871+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[X]], [[Y]]
4872+
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]]
4873+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[AND0]], i32 [[SUB]], i32 [[XOR]]
4874+
; CHECK-NEXT: ret i32 [[COND]]
4875+
;
4876+
%and = and i32 %x, %y
4877+
%and0 = icmp eq i32 %and, -1
4878+
%sub = sub i32 %x, %y
4879+
%xor = xor i32 %x, %y
4880+
%cond = select i1 %and0, i32 %sub, i32 %xor
4881+
ret i32 %cond
4882+
}
4883+
4884+
define void @select_freeze_poison_parameter(ptr noundef %addr.src, ptr %addr.tgt, i1 %cond) {
4885+
; CHECK-LABEL: @select_freeze_poison_parameter(
4886+
; CHECK-NEXT: [[SELECT_ADDR:%.*]] = select i1 [[COND:%.*]], ptr [[ADDR_SRC:%.*]], ptr null
4887+
; CHECK-NEXT: store ptr [[SELECT_ADDR]], ptr [[ADDR_TGT:%.*]], align 8
4888+
; CHECK-NEXT: ret void
4889+
;
4890+
%freeze = freeze ptr poison
4891+
%select.addr = select i1 %cond, ptr %addr.src, ptr %freeze
4892+
store ptr %select.addr, ptr %addr.tgt
4893+
ret void
4894+
}
4895+
4896+
@glb = global ptr null
4897+
4898+
define void @select_freeze_poison_global(ptr %addr.tgt, i1 %cond) {
4899+
; CHECK-LABEL: @select_freeze_poison_global(
4900+
; CHECK-NEXT: [[SELECT_ADDR:%.*]] = select i1 [[COND:%.*]], ptr @glb, ptr null
4901+
; CHECK-NEXT: store ptr [[SELECT_ADDR]], ptr [[ADDR_TGT:%.*]], align 8
4902+
; CHECK-NEXT: ret void
4903+
;
4904+
%freeze = freeze ptr poison
4905+
%select.addr = select i1 %cond, ptr @glb, ptr %freeze
4906+
store ptr %select.addr, ptr %addr.tgt
4907+
ret void
4908+
}
4909+
4910+
define void @select_freeze_poison_constant(ptr %addr.tgt, i1 %cond) {
4911+
; CHECK-LABEL: @select_freeze_poison_constant(
4912+
; CHECK-NEXT: [[SELECT_ADDR:%.*]] = select i1 [[COND:%.*]], i32 72, i32 0
4913+
; CHECK-NEXT: store i32 [[SELECT_ADDR]], ptr [[ADDR_TGT:%.*]], align 4
4914+
; CHECK-NEXT: ret void
4915+
;
4916+
%freeze = freeze i32 poison
4917+
%select.addr = select i1 %cond, i32 72, i32 %freeze
4918+
store i32 %select.addr, ptr %addr.tgt
4919+
ret void
4920+
}

0 commit comments

Comments
 (0)