@@ -44,7 +44,7 @@ define i32 @test2(i32 %x) nounwind ssp "instcombine-no-verify-fixpoint" {
4444; CHECK: bb1:
4545; CHECK-NEXT: [[TMP1:%.*]] = add nsw i32 [[X_ADDR_17]], 1
4646; CHECK-NEXT: [[TMP2:%.*]] = sdiv i32 [[TMP1]], [[X_ADDR_17]]
47- ; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @bar() #[[ATTR3 :[0-9]+]]
47+ ; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @bar() #[[ATTR4 :[0-9]+]]
4848; CHECK-NEXT: br label [[BB2]]
4949; CHECK: bb2:
5050; CHECK-NEXT: [[X_ADDR_0]] = phi i32 [ [[TMP2]], [[BB1]] ], [ [[X_ADDR_17]], [[BB]] ]
@@ -84,13 +84,14 @@ declare i32 @bar()
8484define i32 @test3 (ptr nocapture readonly %P , i32 %i ) {
8585; CHECK-LABEL: @test3(
8686; CHECK-NEXT: entry:
87- ; CHECK-NEXT: switch i32 [[I:%.*]], label [[SW_EPILOG:%.*]] [
87+ ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I:%.*]] to i64
88+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDXPROM]]
89+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[ARRAYIDX]], i64 32) ]
90+ ; CHECK-NEXT: switch i32 [[I]], label [[SW_EPILOG:%.*]] [
8891; CHECK-NEXT: i32 5, label [[SW_BB:%.*]]
8992; CHECK-NEXT: i32 2, label [[SW_BB]]
9093; CHECK-NEXT: ]
9194; CHECK: sw.bb:
92- ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
93- ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDXPROM]]
9495; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
9596; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP0]], [[I]]
9697; CHECK-NEXT: br label [[SW_EPILOG]]
@@ -182,11 +183,12 @@ sw.epilog: ; preds = %entry, %sw.bb
182183define i32 @test6 (ptr nocapture readonly %P , i32 %i , i1 %cond ) {
183184; CHECK-LABEL: @test6(
184185; CHECK-NEXT: entry:
185- ; CHECK-NEXT: [[ADD:%.*]] = shl nsw i32 [[I:%.*]], 1
186+ ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I:%.*]] to i64
187+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDXPROM]]
188+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[ARRAYIDX]], i64 32) ]
189+ ; CHECK-NEXT: [[ADD:%.*]] = shl nsw i32 [[I]], 1
186190; CHECK-NEXT: br label [[DISPATCHBB:%.*]]
187191; CHECK: dispatchBB:
188- ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
189- ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDXPROM]]
190192; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
191193; CHECK-NEXT: switch i32 [[I]], label [[SW_BB:%.*]] [
192194; CHECK-NEXT: i32 5, label [[SW_EPILOG:%.*]]
@@ -277,12 +279,13 @@ abort:
277279define i32 @invariant_load_metadata (ptr %p , i1 %cond ) {
278280; CHECK-LABEL: @invariant_load_metadata(
279281; CHECK-NEXT: entry:
282+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P:%.*]], i64 32) ]
280283; CHECK-NEXT: br i1 [[COND:%.*]], label [[BLOCK:%.*]], label [[END:%.*]]
281284; CHECK: block:
282285; CHECK-NEXT: call void @fn()
283286; CHECK-NEXT: br label [[END]]
284287; CHECK: end:
285- ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P:%.* ]], align 4, !invariant.load [[META0:![0-9]+]]
288+ ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 4, !invariant.load [[META0:![0-9]+]]
286289; CHECK-NEXT: ret i32 [[V]]
287290;
288291entry:
@@ -324,12 +327,13 @@ end:
324327define void @invariant_load_use_in_br (ptr %p , i1 %cond ) {
325328; CHECK-LABEL: @invariant_load_use_in_br(
326329; CHECK-NEXT: entry:
330+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P:%.*]], i64 32) ]
327331; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE_BR:%.*]], label [[FALSE_BR:%.*]]
328332; CHECK: true.br:
329333; CHECK-NEXT: call void @fn()
330334; CHECK-NEXT: br label [[EXIT:%.*]]
331335; CHECK: false.br:
332- ; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[P:%.* ]], align 4
336+ ; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[P]], align 4
333337; CHECK-NEXT: call void @fn(i32 [[VAL]])
334338; CHECK-NEXT: br label [[EXIT]]
335339; CHECK: exit:
@@ -353,13 +357,14 @@ exit:
353357define void @invariant_load_metadata_call (ptr %p , i1 %cond ) {
354358; CHECK-LABEL: @invariant_load_metadata_call(
355359; CHECK-NEXT: entry:
360+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P:%.*]], i64 32) ]
356361; CHECK-NEXT: call void @fn()
357362; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE_BR:%.*]], label [[FALSE_BR:%.*]]
358363; CHECK: true.br:
359364; CHECK-NEXT: call void @fn()
360365; CHECK-NEXT: br label [[EXIT:%.*]]
361366; CHECK: false.br:
362- ; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[P:%.* ]], align 4, !invariant.load [[META0]]
367+ ; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[P]], align 4, !invariant.load [[META0]]
363368; CHECK-NEXT: call void @fn(i32 [[VAL]])
364369; CHECK-NEXT: br label [[EXIT]]
365370; CHECK: exit:
0 commit comments