Why doesn't g++ optimize local constexpr array access?












1















I have following c++ code:



inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}


When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr to constexpr, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.



Does anyone have any idea why this happens?










share|improve this question























  • My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.

    – NathanOliver
    Nov 26 '18 at 13:48













  • @NathanOliver But when we write constexpr variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...

    – eivour
    Nov 26 '18 at 13:57













  • constexpr is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?

    – rustyx
    Nov 26 '18 at 14:07


















1















I have following c++ code:



inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}


When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr to constexpr, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.



Does anyone have any idea why this happens?










share|improve this question























  • My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.

    – NathanOliver
    Nov 26 '18 at 13:48













  • @NathanOliver But when we write constexpr variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...

    – eivour
    Nov 26 '18 at 13:57













  • constexpr is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?

    – rustyx
    Nov 26 '18 at 14:07
















1












1








1








I have following c++ code:



inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}


When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr to constexpr, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.



Does anyone have any idea why this happens?










share|improve this question














I have following c++ code:



inline int choose(int i){
static constexpr int arr={1,3,3,2,4,1,4};
return arr[i];
}
void f(int);
int main(){
for(int i=0;i<5;i++){
f(choose(i));
}
}


When I compile this with g++ 8.2 with option -O3, it produces well-optimized asm code. However, when I change the second line from static constexpr to constexpr, which should be semantically the same, it no longer optimizes array access, and produces somewhat inefficient asm code.



Does anyone have any idea why this happens?







c++ g++ compiler-optimization






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 26 '18 at 13:45









eivoureivour

726616




726616













  • My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.

    – NathanOliver
    Nov 26 '18 at 13:48













  • @NathanOliver But when we write constexpr variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...

    – eivour
    Nov 26 '18 at 13:57













  • constexpr is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?

    – rustyx
    Nov 26 '18 at 14:07





















  • My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.

    – NathanOliver
    Nov 26 '18 at 13:48













  • @NathanOliver But when we write constexpr variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...

    – eivour
    Nov 26 '18 at 13:57













  • constexpr is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?

    – rustyx
    Nov 26 '18 at 14:07



















My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.

– NathanOliver
Nov 26 '18 at 13:48







My guess, when the array is static the compiler knows where it will be whenever the function is called so it can unroll the loop and optimize away the function call and array access. When it is not static to location of the array can change so it can't/wont provide the optimization.

– NathanOliver
Nov 26 '18 at 13:48















@NathanOliver But when we write constexpr variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...

– eivour
Nov 26 '18 at 13:57







@NathanOliver But when we write constexpr variable we don't expect it to be "real variable" (hence have memory address in stack or anywhere), so the compiler should be able to put it wherever it likes...

– eivour
Nov 26 '18 at 13:57















constexpr is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?

– rustyx
Nov 26 '18 at 14:07







constexpr is there mostly to express intent, so that the compiler can stop you when you try something that can't be done compile-time. It's more for the programmer than the compiler, which can (should) already see what can and cannot be optimized. As to the question - would "it's an improvement opportunity in GCC" be a sufficient answer?

– rustyx
Nov 26 '18 at 14:07














0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53482467%2fwhy-doesnt-g-optimize-local-constexpr-array-access%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53482467%2fwhy-doesnt-g-optimize-local-constexpr-array-access%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Contact image not getting when fetch all contact list from iPhone by CNContact

count number of partitions of a set with n elements into k subsets

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks