@@ -59,13 +59,36 @@ entry:
5959
6060; Sanitizer will break optimization.
6161define void @test_multiple_loads_select_asan (i1 %cmp ) sanitize_address {
62- ; CHECK-LABEL: @test_multiple_loads_select_asan(
63- ; CHECK-NEXT: entry:
64- ; CHECK-NEXT: [[ADDR_I8_SROA_SPECULATED:%.*]] = select i1 [[CMP:%.*]], ptr undef, ptr undef
65- ; CHECK-NEXT: call void @foo_i8(ptr [[ADDR_I8_SROA_SPECULATED]])
66- ; CHECK-NEXT: [[ADDR_I32_SROA_SPECULATED:%.*]] = select i1 [[CMP]], ptr undef, ptr undef
67- ; CHECK-NEXT: call void @foo_i32(ptr [[ADDR_I32_SROA_SPECULATED]])
68- ; CHECK-NEXT: ret void
62+ ; CHECK-PRESERVE-CFG-LABEL: @test_multiple_loads_select_asan(
63+ ; CHECK-PRESERVE-CFG-NEXT: entry:
64+ ; CHECK-PRESERVE-CFG-NEXT: [[ARGS_SROA_0:%.*]] = alloca ptr, align 8
65+ ; CHECK-PRESERVE-CFG-NEXT: [[ARGS_SROA_1:%.*]] = alloca ptr, align 8
66+ ; CHECK-PRESERVE-CFG-NEXT: [[SEL_SROA_SEL:%.*]] = select i1 [[CMP:%.*]], ptr [[ARGS_SROA_1]], ptr [[ARGS_SROA_0]]
67+ ; CHECK-PRESERVE-CFG-NEXT: [[ADDR_I8:%.*]] = load ptr, ptr [[SEL_SROA_SEL]], align 8
68+ ; CHECK-PRESERVE-CFG-NEXT: call void @foo_i8(ptr [[ADDR_I8]])
69+ ; CHECK-PRESERVE-CFG-NEXT: [[ADDR_I32:%.*]] = load ptr, ptr [[SEL_SROA_SEL]], align 8
70+ ; CHECK-PRESERVE-CFG-NEXT: call void @foo_i32(ptr [[ADDR_I32]])
71+ ; CHECK-PRESERVE-CFG-NEXT: ret void
72+ ;
73+ ; CHECK-MODIFY-CFG-LABEL: @test_multiple_loads_select_asan(
74+ ; CHECK-MODIFY-CFG-NEXT: entry:
75+ ; CHECK-MODIFY-CFG-NEXT: br i1 [[CMP:%.*]], label [[ENTRY_THEN:%.*]], label [[ENTRY_ELSE:%.*]]
76+ ; CHECK-MODIFY-CFG: entry.then:
77+ ; CHECK-MODIFY-CFG-NEXT: br label [[ENTRY_CONT:%.*]]
78+ ; CHECK-MODIFY-CFG: entry.else:
79+ ; CHECK-MODIFY-CFG-NEXT: br label [[ENTRY_CONT]]
80+ ; CHECK-MODIFY-CFG: entry.cont:
81+ ; CHECK-MODIFY-CFG-NEXT: [[ADDR_I8:%.*]] = phi ptr [ undef, [[ENTRY_THEN]] ], [ undef, [[ENTRY_ELSE]] ]
82+ ; CHECK-MODIFY-CFG-NEXT: call void @foo_i8(ptr [[ADDR_I8]])
83+ ; CHECK-MODIFY-CFG-NEXT: br i1 [[CMP]], label [[ENTRY_CONT_THEN:%.*]], label [[ENTRY_CONT_ELSE:%.*]]
84+ ; CHECK-MODIFY-CFG: entry.cont.then:
85+ ; CHECK-MODIFY-CFG-NEXT: br label [[ENTRY_CONT_CONT:%.*]]
86+ ; CHECK-MODIFY-CFG: entry.cont.else:
87+ ; CHECK-MODIFY-CFG-NEXT: br label [[ENTRY_CONT_CONT]]
88+ ; CHECK-MODIFY-CFG: entry.cont.cont:
89+ ; CHECK-MODIFY-CFG-NEXT: [[ADDR_I32:%.*]] = phi ptr [ undef, [[ENTRY_CONT_THEN]] ], [ undef, [[ENTRY_CONT_ELSE]] ]
90+ ; CHECK-MODIFY-CFG-NEXT: call void @foo_i32(ptr [[ADDR_I32]])
91+ ; CHECK-MODIFY-CFG-NEXT: ret void
6992;
7093entry:
7194 %args = alloca [2 x %st.args ], align 16
@@ -436,13 +459,13 @@ define void @load_of_select_with_noundef_nonnull(ptr %buffer, i1 %b) {
436459; CHECK-PRESERVE-CFG-LABEL: @load_of_select_with_noundef_nonnull(
437460; CHECK-PRESERVE-CFG-NEXT: [[UB_PTR:%.*]] = alloca ptr, align 8
438461; CHECK-PRESERVE-CFG-NEXT: [[SELECT_PTR:%.*]] = select i1 [[B:%.*]], ptr [[BUFFER:%.*]], ptr [[UB_PTR]]
439- ; CHECK-PRESERVE-CFG-NEXT: [[LOAD_PTR:%.*]] = load ptr, ptr [[SELECT_PTR]], align 8, !nonnull !1 , !noundef !1
462+ ; CHECK-PRESERVE-CFG-NEXT: [[LOAD_PTR:%.*]] = load ptr, ptr [[SELECT_PTR]], align 8, !nonnull [[META1:![0-9]+]] , !noundef [[META1]]
440463; CHECK-PRESERVE-CFG-NEXT: ret void
441464;
442465; CHECK-MODIFY-CFG-LABEL: @load_of_select_with_noundef_nonnull(
443466; CHECK-MODIFY-CFG-NEXT: br i1 [[B:%.*]], label [[DOTTHEN:%.*]], label [[DOTCONT:%.*]]
444467; CHECK-MODIFY-CFG: .then:
445- ; CHECK-MODIFY-CFG-NEXT: [[LOAD_PTR_THEN_VAL:%.*]] = load ptr, ptr [[BUFFER:%.*]], align 8, !nonnull !2 , !noundef !2
468+ ; CHECK-MODIFY-CFG-NEXT: [[LOAD_PTR_THEN_VAL:%.*]] = load ptr, ptr [[BUFFER:%.*]], align 8, !nonnull [[META2:![0-9]+]] , !noundef [[META2]]
446469; CHECK-MODIFY-CFG-NEXT: br label [[DOTCONT]]
447470; CHECK-MODIFY-CFG: .cont:
448471; CHECK-MODIFY-CFG-NEXT: [[LOAD_PTR:%.*]] = phi ptr [ [[LOAD_PTR_THEN_VAL]], [[DOTTHEN]] ], [ undef, [[TMP0:%.*]] ]
0 commit comments